blob: 65834a66af7b66d252b29770b4b0580eb87be040 [file] [edit]
// RUN: mlir-opt --fold-memref-alias-ops --split-input-file %s | FileCheck %s
#gpu_lds_addrspace = #gpu.address_space<workgroup>
// CHECK: func @test_subview_folding
// CHECK-SAME: %[[ARG0:.*]]: index, %[[ARG1:.*]]: index
func.func @test_subview_folding(%offset_i: index, %offset_j: index) {
// CHECK-DAG: %[[LOCAL:.*]] = memref.alloc() : memref<64x64xf16, #gpu.address_space<workgroup>>
// CHECK-DAG: %[[MEM:.*]] = memref.alloc() : memref<64x128xf16>
// CHECK-DAG: %[[C0:.*]] = arith.constant 0 : index
// CHECK: amdgpu.gather_to_lds %[[MEM]][%[[ARG0]], %[[ARG1]]], %[[LOCAL]][%[[C0]], %[[C0]]]
// CHECK-SAME: vector<8xf16>, memref<64x128xf16>, memref<64x64xf16, #gpu.address_space<workgroup>>
%alloc = memref.alloc() : memref<64x64xf16, #gpu_lds_addrspace>
%mem = memref.alloc() : memref<64x128xf16>
%subview = memref.subview %mem[0, 0][32, 64][1, 1] : memref<64x128xf16> to memref<32x64xf16, strided<[128, 1]>>
%c0 = arith.constant 0 : index
amdgpu.gather_to_lds %subview[%offset_i, %offset_j], %alloc[%c0, %c0]
: vector<8xf16>, memref<32x64xf16, strided<[128, 1]>>, memref<64x64xf16, #gpu_lds_addrspace>
func.return
}
// -----
#gpu_lds_addrspace = #gpu.address_space<workgroup>
// CHECK: #[[MAP:.*]] = affine_map<()[s0] -> (s0 + 32)>
// CHECK: #[[MAP1:.*]] = affine_map<()[s0] -> (s0 + 64)>
// CHECK: func @subview_folding_offset
// CHECK-SAME: %[[ARG0:.*]]: index, %[[ARG1:.*]]: index
func.func @subview_folding_offset(%offset_i: index, %offset_j: index) {
// CHECK-DAG: %[[LOCAL:.*]] = memref.alloc() : memref<64x64xf16, #gpu.address_space<workgroup>>
// CHECK-DAG: %[[MEM:.*]] = memref.alloc() : memref<64x128xf16>
// CHECK-DAG: %[[C0:.*]] = arith.constant 0 : index
// CHECK: %[[IDX0:.*]] = affine.apply #[[MAP]]()[%[[ARG0]]]
// CHECK: %[[IDX1:.*]] = affine.apply #[[MAP1]]()[%[[ARG1]]]
// CHECK: amdgpu.gather_to_lds %[[MEM]][%[[IDX0]], %[[IDX1]]], %[[LOCAL]][%[[C0]], %[[C0]]]
// CHECK-SAME: vector<8xf16>, memref<64x128xf16>, memref<64x64xf16, #gpu.address_space<workgroup>>
%alloc = memref.alloc() : memref<64x64xf16, #gpu_lds_addrspace>
%mem = memref.alloc() : memref<64x128xf16>
%subview = memref.subview %mem[32, 64][32, 64][1, 1] : memref<64x128xf16> to memref<32x64xf16, strided<[128, 1], offset: 4160>>
%c0 = arith.constant 0 : index
amdgpu.gather_to_lds %subview[%offset_i, %offset_j], %alloc[%c0, %c0]
: vector<8xf16>, memref<32x64xf16, strided<[128, 1], offset: 4160>>, memref<64x64xf16, #gpu_lds_addrspace>
func.return
}
// -----
#gpu_lds_addrspace = #gpu.address_space<workgroup>
// CHECK: func @test_expand_shape
// CHECK-SAME: %[[ARG0:.*]]: index, %[[ARG1:.*]]: index
func.func @test_expand_shape(%offset_i: index, %offset_j: index) {
// CHECK-DAG: %[[LOCAL:.*]] = memref.alloc() : memref<4096xf16, #gpu.address_space<workgroup>>
// CHECK-DAG: %[[MEM:.*]] = memref.alloc() : memref<8192xf16>
// CHECK-DAG: %[[C0:.*]] = arith.constant 0 : index
// CHECK: %[[IDXM:.*]] = affine.linearize_index disjoint [%[[ARG0]], %[[ARG1]]] by (64, 128) : index
// CHECK: amdgpu.gather_to_lds %[[MEM]][%[[IDXM]]], %[[LOCAL]][%[[C0]]]
// CHECK-SAME: vector<8xf16>, memref<8192xf16>, memref<4096xf16, #gpu.address_space<workgroup>>
%alloc = memref.alloc() : memref<4096xf16, #gpu_lds_addrspace>
%mem = memref.alloc() : memref<8192xf16>
%expand_mem = memref.expand_shape %mem [[0, 1]] output_shape [64, 128] : memref<8192xf16> into memref<64x128xf16>
%expand_alloc = memref.expand_shape %alloc [[0, 1]] output_shape [64, 64] : memref<4096xf16, #gpu_lds_addrspace> into memref<64x64xf16, #gpu_lds_addrspace>
%c0 = arith.constant 0 : index
amdgpu.gather_to_lds %expand_mem[%offset_i, %offset_j], %expand_alloc[%c0, %c0]
: vector<8xf16>, memref<64x128xf16>, memref<64x64xf16, #gpu_lds_addrspace>
func.return
}
// -----
#gpu_lds_addrspace = #gpu.address_space<workgroup>
// CHECK: func @test_collapse_shape
// CHECK-SAME: %[[ARG0:.*]]: index, %[[ARG1:.*]]: index
func.func @test_collapse_shape(%offset_i: index, %offset_j: index) {
// CHECK-DAG: %[[LOCAL:.*]] = memref.alloc() : memref<64x64xf16, #gpu.address_space<workgroup>>
// CHECK-DAG: %[[MEM:.*]] = memref.alloc() : memref<64x128xf16>
// CHECK: %[[INDICES_MEM:.*]]:2 = affine.delinearize_index %[[ARG0]] into (64, 128) : index, index
// CHECK: %[[INDICES_LDS:.*]]:2 = affine.delinearize_index %[[ARG1]] into (64, 64) : index, index
// CHECK: amdgpu.gather_to_lds %[[MEM]][%[[INDICES_MEM]]#0, %[[INDICES_MEM]]#1], %[[LOCAL]][%[[INDICES_LDS]]#0, %[[INDICES_LDS]]#1]
// CHECK-SAME: vector<8xf16>, memref<64x128xf16>, memref<64x64xf16, #gpu.address_space<workgroup>>
%alloc = memref.alloc() : memref<64x64xf16, #gpu_lds_addrspace>
%collapse_alloc = memref.collapse_shape %alloc [[0, 1]] : memref<64x64xf16, #gpu_lds_addrspace> into memref<4096xf16, #gpu_lds_addrspace>
%mem = memref.alloc() : memref<64x128xf16>
%collapse_mem = memref.collapse_shape %mem [[0, 1]] : memref<64x128xf16> into memref<8192xf16>
%c0 = arith.constant 0 : index
amdgpu.gather_to_lds %collapse_mem[%offset_i], %collapse_alloc[%offset_j]
: vector<8xf16>, memref<8192xf16>, memref<4096xf16, #gpu_lds_addrspace>
func.return
}
// -----
#gpu_lds_addrspace = #gpu.address_space<workgroup>
// CHECK: func @test_expand_shape_src_raw_buffer
// CHECK-SAME: %[[ARG0:.*]]: memref<8192xf16, #amdgpu.address_space<fat_raw_buffer>>, %[[ARG1:.*]]: index, %[[ARG2:.*]]: index
func.func @test_expand_shape_src_raw_buffer(%mem : memref<8192xf16, #amdgpu.address_space<fat_raw_buffer>>, %offset_i: index, %offset_j: index) {
// CHECK-DAG: %[[LOCAL:.*]] = memref.alloc() : memref<4096xf16, #gpu.address_space<workgroup>>
// CHECK-DAG: %[[C0:.*]] = arith.constant 0 : index
// CHECK: %[[IDXM:.*]] = affine.linearize_index [%[[ARG1]], %[[ARG2]]] by (64, 128) : index
// CHECK: amdgpu.gather_to_lds %[[ARG0]][%[[IDXM]]], %[[LOCAL]][%[[C0]]]
// CHECK-SAME: vector<8xf16>, memref<8192xf16, #amdgpu.address_space<fat_raw_buffer>>, memref<4096xf16, #gpu.address_space<workgroup>>
%alloc = memref.alloc() : memref<4096xf16, #gpu_lds_addrspace>
%expand_mem = memref.expand_shape %mem [[0, 1]] output_shape [64, 128] : memref<8192xf16, #amdgpu.address_space<fat_raw_buffer>> into memref<64x128xf16, #amdgpu.address_space<fat_raw_buffer>>
%c0 = arith.constant 0 : index
amdgpu.gather_to_lds %expand_mem[%offset_i, %offset_j], %alloc[%c0]
: vector<8xf16>, memref<64x128xf16, #amdgpu.address_space<fat_raw_buffer>>, memref<4096xf16, #gpu_lds_addrspace>
func.return
}
// -----
#gpu_lds_addrspace = #gpu.address_space<workgroup>
// CHECK: func @test_src_raw_buffer_collapse_shape
// CHECK-SAME: %[[MEM:.*]]: memref<64x128xf16, #amdgpu.address_space<fat_raw_buffer>>, %[[IDX:.*]]: index
func.func @test_src_raw_buffer_collapse_shape(%mem : memref<64x128xf16, #amdgpu.address_space<fat_raw_buffer>>, %offset: index) {
// CHECK-DAG: %[[LOCAL:.*]] = memref.alloc() : memref<4096xf16, #gpu.address_space<workgroup>>
// CHECK-DAG: %[[C0:.*]] = arith.constant 0 : index
// CHECK: %[[INDICES:.*]]:2 = affine.delinearize_index %[[IDX]] into (128) : index, index
// CHECK: amdgpu.gather_to_lds %[[MEM]][%[[INDICES]]#0, %[[INDICES]]#1], %[[LOCAL]][%[[C0]]]
// CHECK-SAME: vector<8xf16>, memref<64x128xf16, #amdgpu.address_space<fat_raw_buffer>>, memref<4096xf16, #gpu.address_space<workgroup>>
%alloc = memref.alloc() : memref<4096xf16, #gpu_lds_addrspace>
%collapse_mem = memref.collapse_shape %mem [[0, 1]]
: memref<64x128xf16, #amdgpu.address_space<fat_raw_buffer>>
into memref<8192xf16, #amdgpu.address_space<fat_raw_buffer>>
%c0 = arith.constant 0 : index
amdgpu.gather_to_lds %collapse_mem[%offset], %alloc[%c0]
: vector<8xf16>, memref<8192xf16, #amdgpu.address_space<fat_raw_buffer>>,
memref<4096xf16, #gpu_lds_addrspace>
func.return
}
// -----
#gpu_lds_addrspace = #gpu.address_space<workgroup>
// CHECK: func @test_expand_shape_dst_only
// CHECK-SAME: %[[ARG0:.*]]: index, %[[ARG1:.*]]: index
func.func @test_expand_shape_dst_only(%offset_i: index, %offset_j: index) {
// CHECK-DAG: %[[LOCAL:.*]] = memref.alloc() : memref<4096xf16, #gpu.address_space<workgroup>>
// CHECK-DAG: %[[MEM:.*]] = memref.alloc() : memref<8192xf16>
// CHECK-DAG: %[[C0:.*]] = arith.constant 0 : index
// CHECK: %[[IDX_LDS:.*]] = affine.linearize_index disjoint [%[[ARG1]], %[[C0]]] by (64, 64) : index
// CHECK: amdgpu.gather_to_lds %[[MEM]][%[[ARG0]]], %[[LOCAL]][%[[IDX_LDS]]]
// CHECK-SAME: vector<8xf16>, memref<8192xf16>, memref<4096xf16, #gpu.address_space<workgroup>>
%alloc = memref.alloc() : memref<4096xf16, #gpu_lds_addrspace>
%mem = memref.alloc() : memref<8192xf16>
%expand_alloc = memref.expand_shape %alloc [[0, 1]] output_shape [64, 64] : memref<4096xf16, #gpu_lds_addrspace> into memref<64x64xf16, #gpu_lds_addrspace>
%c0 = arith.constant 0 : index
amdgpu.gather_to_lds %mem[%offset_i], %expand_alloc[%offset_j, %c0]
: vector<8xf16>, memref<8192xf16>, memref<64x64xf16, #gpu_lds_addrspace>
func.return
}
// -----
#gpu_lds_addrspace = #gpu.address_space<workgroup>
// CHECK: func @test_nop
// CHECK-SAME: %[[ARG0:.*]]: memref<8192xf16, #amdgpu.address_space<fat_raw_buffer>>, %[[ARG1:.*]]: index, %[[ARG2:.*]]: index
func.func @test_nop(%mem : memref<8192xf16, #amdgpu.address_space<fat_raw_buffer>>, %offset_i: index, %offset_j: index) {
// CHECK-DAG: %[[LOCAL:.*]] = memref.alloc() : memref<4096xf16, #gpu.address_space<workgroup>>
// CHECK: amdgpu.gather_to_lds %[[ARG0]][%[[ARG1]]], %[[LOCAL]][%[[ARG2]]]
// CHECK-SAME: vector<8xf16>, memref<8192xf16, #amdgpu.address_space<fat_raw_buffer>>, memref<4096xf16, #gpu.address_space<workgroup>>
%alloc = memref.alloc() : memref<4096xf16, #gpu_lds_addrspace>
amdgpu.gather_to_lds %mem[%offset_i], %alloc[%offset_j]
: vector<8xf16>, memref<8192xf16, #amdgpu.address_space<fat_raw_buffer>>, memref<4096xf16, #gpu_lds_addrspace>
func.return
}
// -----
#gpu_lds_addrspace = #gpu.address_space<workgroup>
// CHECK: func @test_async_flag_preserved
// CHECK-SAME: %[[ARG0:.*]]: index, %[[ARG1:.*]]: index
func.func @test_async_flag_preserved(%offset_i: index, %offset_j: index) {
// CHECK-DAG: %[[LOCAL:.*]] = memref.alloc() : memref<64x64xf16, #gpu.address_space<workgroup>>
// CHECK-DAG: %[[MEM:.*]] = memref.alloc() : memref<64x128xf16>
// CHECK-DAG: %[[C0:.*]] = arith.constant 0 : index
// CHECK: amdgpu.gather_to_lds async %[[MEM]][%[[ARG0]], %[[ARG1]]], %[[LOCAL]][%[[C0]], %[[C0]]]
// CHECK-SAME: vector<8xf16>, memref<64x128xf16>, memref<64x64xf16, #gpu.address_space<workgroup>>
%alloc = memref.alloc() : memref<64x64xf16, #gpu_lds_addrspace>
%mem = memref.alloc() : memref<64x128xf16>
%subview = memref.subview %mem[0, 0][32, 64][1, 1] : memref<64x128xf16> to memref<32x64xf16, strided<[128, 1]>>
%c0 = arith.constant 0 : index
amdgpu.gather_to_lds async %subview[%offset_i, %offset_j], %alloc[%c0, %c0]
: vector<8xf16>, memref<32x64xf16, strided<[128, 1]>>, memref<64x64xf16, #gpu_lds_addrspace>
func.return
}
// -----
#gpu_wg = #gpu.address_space<workgroup>
// CHECK: func @test_transpose_load_subview
// CHECK-SAME: %[[ARG0:.*]]: index, %[[ARG1:.*]]: index
func.func @test_transpose_load_subview(%offset_i: index, %offset_j: index) -> vector<4xf16> {
// CHECK-DAG: %[[ALLOC:.*]] = memref.alloc() : memref<64x128xf16, #gpu.address_space<workgroup>>
// CHECK: amdgpu.transpose_load %[[ALLOC]][%[[ARG0]], %[[ARG1]]]
// CHECK-SAME: memref<64x128xf16, #gpu.address_space<workgroup>> -> vector<4xf16>
%alloc = memref.alloc() : memref<64x128xf16, #gpu_wg>
%subview = memref.subview %alloc[0, 0][32, 64][1, 1]
: memref<64x128xf16, #gpu_wg> to memref<32x64xf16, strided<[128, 1]>, #gpu_wg>
%result = amdgpu.transpose_load %subview[%offset_i, %offset_j]
: memref<32x64xf16, strided<[128, 1]>, #gpu_wg> -> vector<4xf16>
return %result : vector<4xf16>
}
// -----
#gpu_wg = #gpu.address_space<workgroup>
// CHECK: #[[MAP:.*]] = affine_map<()[s0] -> (s0 + 32)>
// CHECK: #[[MAP1:.*]] = affine_map<()[s0] -> (s0 + 64)>
// CHECK: func @test_transpose_load_subview_offset
// CHECK-SAME: %[[ARG0:.*]]: index, %[[ARG1:.*]]: index
func.func @test_transpose_load_subview_offset(%offset_i: index, %offset_j: index) -> vector<4xf16> {
// CHECK-DAG: %[[ALLOC:.*]] = memref.alloc() : memref<64x128xf16, #gpu.address_space<workgroup>>
// CHECK: %[[IDX0:.*]] = affine.apply #[[MAP]]()[%[[ARG0]]]
// CHECK: %[[IDX1:.*]] = affine.apply #[[MAP1]]()[%[[ARG1]]]
// CHECK: amdgpu.transpose_load %[[ALLOC]][%[[IDX0]], %[[IDX1]]]
// CHECK-SAME: memref<64x128xf16, #gpu.address_space<workgroup>> -> vector<4xf16>
%alloc = memref.alloc() : memref<64x128xf16, #gpu_wg>
%subview = memref.subview %alloc[32, 64][32, 64][1, 1]
: memref<64x128xf16, #gpu_wg>
to memref<32x64xf16, strided<[128, 1], offset: 4160>, #gpu_wg>
%result = amdgpu.transpose_load %subview[%offset_i, %offset_j]
: memref<32x64xf16, strided<[128, 1], offset: 4160>, #gpu_wg> -> vector<4xf16>
return %result : vector<4xf16>
}
// -----
#gpu_wg = #gpu.address_space<workgroup>
// CHECK: func @test_transpose_load_expand_shape
// CHECK-SAME: %[[ARG0:.*]]: index, %[[ARG1:.*]]: index
func.func @test_transpose_load_expand_shape(%offset_i: index, %offset_j: index) -> vector<4xf16> {
// CHECK-DAG: %[[ALLOC:.*]] = memref.alloc() : memref<4096xf16, #gpu.address_space<workgroup>>
// CHECK: %[[IDX:.*]] = affine.linearize_index disjoint [%[[ARG0]], %[[ARG1]]] by (32, 128) : index
// CHECK: amdgpu.transpose_load %[[ALLOC]][%[[IDX]]]
// CHECK-SAME: memref<4096xf16, #gpu.address_space<workgroup>> -> vector<4xf16>
%alloc = memref.alloc() : memref<4096xf16, #gpu_wg>
%expand = memref.expand_shape %alloc [[0, 1]] output_shape [32, 128]
: memref<4096xf16, #gpu_wg> into memref<32x128xf16, #gpu_wg>
%result = amdgpu.transpose_load %expand[%offset_i, %offset_j]
: memref<32x128xf16, #gpu_wg> -> vector<4xf16>
return %result : vector<4xf16>
}
// -----
#gpu_wg = #gpu.address_space<workgroup>
// CHECK: func @test_transpose_load_collapse_shape
// CHECK-SAME: %[[ARG0:.*]]: index
func.func @test_transpose_load_collapse_shape(%offset_i: index) -> vector<4xf16> {
// CHECK-DAG: %[[ALLOC:.*]] = memref.alloc() : memref<32x128xf16, #gpu.address_space<workgroup>>
// CHECK: %[[INDICES:.*]]:2 = affine.delinearize_index %[[ARG0]] into (32, 128) : index, index
// CHECK: amdgpu.transpose_load %[[ALLOC]][%[[INDICES]]#0, %[[INDICES]]#1]
// CHECK-SAME: memref<32x128xf16, #gpu.address_space<workgroup>> -> vector<4xf16>
%alloc = memref.alloc() : memref<32x128xf16, #gpu_wg>
%collapse = memref.collapse_shape %alloc [[0, 1]]
: memref<32x128xf16, #gpu_wg> into memref<4096xf16, #gpu_wg>
%result = amdgpu.transpose_load %collapse[%offset_i]
: memref<4096xf16, #gpu_wg> -> vector<4xf16>
return %result : vector<4xf16>
}
// -----
#gpu_wg = #gpu.address_space<workgroup>
// CHECK: func @test_transpose_load_nop
// CHECK-SAME: %[[ARG0:.*]]: index, %[[ARG1:.*]]: index
func.func @test_transpose_load_nop(%offset_i: index, %offset_j: index) -> vector<4xf16> {
// CHECK-DAG: %[[ALLOC:.*]] = memref.alloc() : memref<32x128xf16, #gpu.address_space<workgroup>>
// CHECK: amdgpu.transpose_load %[[ALLOC]][%[[ARG0]], %[[ARG1]]]
// CHECK-SAME: memref<32x128xf16, #gpu.address_space<workgroup>> -> vector<4xf16>
// CHECK-NOT: subview
// CHECK-NOT: expand_shape
%alloc = memref.alloc() : memref<32x128xf16, #gpu_wg>
%result = amdgpu.transpose_load %alloc[%offset_i, %offset_j]
: memref<32x128xf16, #gpu_wg> -> vector<4xf16>
return %result : vector<4xf16>
}
// -----
#gpu_lds_addrspace = #gpu.address_space<workgroup>
#gpu_global_addrspace = #gpu.address_space<global>
// CHECK: func @test_make_dma_base_subview
// CHECK-SAME: %[[MEM:.*]]: memref<64x128xf16, #gpu.address_space<global>>, %[[LDS:.*]]: memref<64x64xf16, #gpu.address_space<workgroup>>, %[[GLOBAL_I:.*]]: index, %[[GLOBAL_J:.*]]: index, %[[LDS_I:.*]]: index, %[[LDS_J:.*]]: index
func.func @test_make_dma_base_subview(%mem: memref<64x128xf16, #gpu_global_addrspace>, %lds: memref<64x64xf16, #gpu_lds_addrspace>, %global_i: index, %global_j: index, %lds_i: index, %lds_j: index) -> !amdgpu.tdm_base<f16> {
// CHECK: %[[BASE:.*]] = amdgpu.make_dma_base %[[MEM]][%[[GLOBAL_I]], %[[GLOBAL_J]]], %[[LDS]][%[[LDS_I]], %[[LDS_J]]]
// CHECK-SAME: memref<64x128xf16, #gpu.address_space<global>>, memref<64x64xf16, #gpu.address_space<workgroup>> -> !amdgpu.tdm_base<f16>
// CHECK: return %[[BASE]] : !amdgpu.tdm_base<f16>
%subview = memref.subview %mem[0, 0][32, 64][1, 1] : memref<64x128xf16, #gpu_global_addrspace> to memref<32x64xf16, strided<[128, 1]>, #gpu_global_addrspace>
%base = amdgpu.make_dma_base %subview[%global_i, %global_j], %lds[%lds_i, %lds_j]
: memref<32x64xf16, strided<[128, 1]>, #gpu_global_addrspace>, memref<64x64xf16, #gpu_lds_addrspace> -> !amdgpu.tdm_base<f16>
func.return %base : !amdgpu.tdm_base<f16>
}
// -----
#gpu_lds_addrspace = #gpu.address_space<workgroup>
#gpu_global_addrspace = #gpu.address_space<global>
// CHECK: func @test_make_dma_base_expand_shape
// CHECK-SAME: %[[MEM:.*]]: memref<64x128xf16, #gpu.address_space<global>>, %[[LDS:.*]]: memref<4096xf16, #gpu.address_space<workgroup>>, %[[GLOBAL_I:.*]]: index, %[[GLOBAL_J:.*]]: index, %[[LDS_I:.*]]: index, %[[LDS_J:.*]]: index
func.func @test_make_dma_base_expand_shape(%mem: memref<64x128xf16, #gpu_global_addrspace>, %lds: memref<4096xf16, #gpu_lds_addrspace>, %global_i: index, %global_j: index, %lds_i: index, %lds_j: index) -> !amdgpu.tdm_base<f16> {
// CHECK: %[[IDX:.*]] = affine.linearize_index disjoint [%[[LDS_I]], %[[LDS_J]]] by (64, 64) : index
// CHECK: %[[BASE:.*]] = amdgpu.make_dma_base %[[MEM]][%[[GLOBAL_I]], %[[GLOBAL_J]]], %[[LDS]][%[[IDX]]]
// CHECK-SAME: memref<64x128xf16, #gpu.address_space<global>>, memref<4096xf16, #gpu.address_space<workgroup>> -> !amdgpu.tdm_base<f16>
// CHECK: return %[[BASE]] : !amdgpu.tdm_base<f16>
%expand_lds = memref.expand_shape %lds [[0, 1]] output_shape [64, 64] : memref<4096xf16, #gpu_lds_addrspace> into memref<64x64xf16, #gpu_lds_addrspace>
%base = amdgpu.make_dma_base %mem[%global_i, %global_j], %expand_lds[%lds_i, %lds_j]
: memref<64x128xf16, #gpu_global_addrspace>, memref<64x64xf16, #gpu_lds_addrspace> -> !amdgpu.tdm_base<f16>
func.return %base : !amdgpu.tdm_base<f16>
}
// -----
#gpu_lds_addrspace = #gpu.address_space<workgroup>
#gpu_global_addrspace = #gpu.address_space<global>
// CHECK: func @test_make_gather_dma_base_subview
// CHECK-SAME: %[[MEM:.*]]: memref<64x128xf16, #gpu.address_space<global>>, %[[LDS:.*]]: memref<64x64xf16, #gpu.address_space<workgroup>>, %[[GLOBAL_I:.*]]: index, %[[GLOBAL_J:.*]]: index, %[[LDS_I:.*]]: index, %[[LDS_J:.*]]: index
func.func @test_make_gather_dma_base_subview(%mem: memref<64x128xf16, #gpu_global_addrspace>, %lds: memref<64x64xf16, #gpu_lds_addrspace>, %global_i: index, %global_j: index, %lds_i: index, %lds_j: index) -> !amdgpu.tdm_gather_base<f16, i16> {
// CHECK: %[[BASE:.*]] = amdgpu.make_gather_dma_base %[[MEM]][%[[GLOBAL_I]], %[[GLOBAL_J]]], %[[LDS]][%[[LDS_I]], %[[LDS_J]]]
// CHECK-SAME: memref<64x128xf16, #gpu.address_space<global>>, memref<64x64xf16, #gpu.address_space<workgroup>> -> !amdgpu.tdm_gather_base<f16, i16>
// CHECK: return %[[BASE]] : !amdgpu.tdm_gather_base<f16, i16>
%subview = memref.subview %mem[0, 0][32, 64][1, 1] : memref<64x128xf16, #gpu_global_addrspace> to memref<32x64xf16, strided<[128, 1]>, #gpu_global_addrspace>
%base = amdgpu.make_gather_dma_base %subview[%global_i, %global_j], %lds[%lds_i, %lds_j]
: memref<32x64xf16, strided<[128, 1]>, #gpu_global_addrspace>, memref<64x64xf16, #gpu_lds_addrspace> -> !amdgpu.tdm_gather_base<f16, i16>
func.return %base : !amdgpu.tdm_gather_base<f16, i16>
}
// -----
#gpu_lds_addrspace = #gpu.address_space<workgroup>
#gpu_global_addrspace = #gpu.address_space<global>
// CHECK: func @test_make_gather_dma_base_collapse_shape
// CHECK-SAME: %[[MEM:.*]]: memref<64x128xf16, #gpu.address_space<global>>, %[[LDS:.*]]: memref<64x64xf16, #gpu.address_space<workgroup>>, %[[GLOBAL_I:.*]]: index, %[[GLOBAL_J:.*]]: index, %[[LDS_IDX:.*]]: index
func.func @test_make_gather_dma_base_collapse_shape(%mem: memref<64x128xf16, #gpu_global_addrspace>, %lds: memref<64x64xf16, #gpu_lds_addrspace>, %global_i: index, %global_j: index, %lds_idx: index) -> !amdgpu.tdm_gather_base<f16, i16> {
// CHECK: %[[INDICES:.*]]:2 = affine.delinearize_index %[[LDS_IDX]] into (64, 64) : index, index
// CHECK: %[[BASE:.*]] = amdgpu.make_gather_dma_base %[[MEM]][%[[GLOBAL_I]], %[[GLOBAL_J]]], %[[LDS]][%[[INDICES]]#0, %[[INDICES]]#1]
// CHECK-SAME: memref<64x128xf16, #gpu.address_space<global>>, memref<64x64xf16, #gpu.address_space<workgroup>> -> !amdgpu.tdm_gather_base<f16, i16>
// CHECK: return %[[BASE]] : !amdgpu.tdm_gather_base<f16, i16>
%collapse_lds = memref.collapse_shape %lds [[0, 1]] : memref<64x64xf16, #gpu_lds_addrspace> into memref<4096xf16, #gpu_lds_addrspace>
%base = amdgpu.make_gather_dma_base %mem[%global_i, %global_j], %collapse_lds[%lds_idx]
: memref<64x128xf16, #gpu_global_addrspace>, memref<4096xf16, #gpu_lds_addrspace> -> !amdgpu.tdm_gather_base<f16, i16>
func.return %base : !amdgpu.tdm_gather_base<f16, i16>
}
// -----
#gpu_lds_addrspace = #gpu.address_space<workgroup>
#gpu_global_addrspace = #gpu.address_space<global>
// CHECK: #[[BOTH_MAP:.*]] = affine_map<()[s0] -> (s0 + 32)>
// CHECK: #[[BOTH_MAP1:.*]] = affine_map<()[s0] -> (s0 + 64)>
// CHECK: func @test_make_dma_base_both_fold
// CHECK-SAME: %[[MEM:.*]]: memref<64x128xf16, #gpu.address_space<global>>, %[[LDS:.*]]: memref<4096xf16, #gpu.address_space<workgroup>>, %[[GLOBAL_I:.*]]: index, %[[GLOBAL_J:.*]]: index, %[[LDS_I:.*]]: index, %[[LDS_J:.*]]: index
func.func @test_make_dma_base_both_fold(%mem: memref<64x128xf16, #gpu_global_addrspace>, %lds: memref<4096xf16, #gpu_lds_addrspace>, %global_i: index, %global_j: index, %lds_i: index, %lds_j: index) -> !amdgpu.tdm_base<f16> {
// CHECK: %[[GI:.*]] = affine.apply #[[BOTH_MAP]]()[%[[GLOBAL_I]]]
// CHECK: %[[GJ:.*]] = affine.apply #[[BOTH_MAP1]]()[%[[GLOBAL_J]]]
// CHECK: %[[IDX:.*]] = affine.linearize_index disjoint [%[[LDS_I]], %[[LDS_J]]] by (64, 64) : index
// CHECK: %[[BASE:.*]] = amdgpu.make_dma_base %[[MEM]][%[[GI]], %[[GJ]]], %[[LDS]][%[[IDX]]]
// CHECK-SAME: memref<64x128xf16, #gpu.address_space<global>>, memref<4096xf16, #gpu.address_space<workgroup>> -> !amdgpu.tdm_base<f16>
// CHECK: return %[[BASE]] : !amdgpu.tdm_base<f16>
%subview = memref.subview %mem[32, 64][32, 64][1, 1] : memref<64x128xf16, #gpu_global_addrspace> to memref<32x64xf16, strided<[128, 1], offset: 4160>, #gpu_global_addrspace>
%expand_lds = memref.expand_shape %lds [[0, 1]] output_shape [64, 64] : memref<4096xf16, #gpu_lds_addrspace> into memref<64x64xf16, #gpu_lds_addrspace>
%base = amdgpu.make_dma_base %subview[%global_i, %global_j], %expand_lds[%lds_i, %lds_j]
: memref<32x64xf16, strided<[128, 1], offset: 4160>, #gpu_global_addrspace>, memref<64x64xf16, #gpu_lds_addrspace> -> !amdgpu.tdm_base<f16>
func.return %base : !amdgpu.tdm_base<f16>
}
// -----
#gpu_lds_addrspace = #gpu.address_space<workgroup>
#gpu_global_addrspace = #gpu.address_space<global>
// CHECK: func @test_make_dma_base_nop
// CHECK-SAME: %[[MEM:.*]]: memref<64x128xf16, #gpu.address_space<global>>, %[[LDS:.*]]: memref<64x64xf16, #gpu.address_space<workgroup>>, %[[GLOBAL_I:.*]]: index, %[[GLOBAL_J:.*]]: index, %[[LDS_I:.*]]: index, %[[LDS_J:.*]]: index
func.func @test_make_dma_base_nop(%mem: memref<64x128xf16, #gpu_global_addrspace>, %lds: memref<64x64xf16, #gpu_lds_addrspace>, %global_i: index, %global_j: index, %lds_i: index, %lds_j: index) -> !amdgpu.tdm_base<f16> {
// CHECK: %[[BASE:.*]] = amdgpu.make_dma_base %[[MEM]][%[[GLOBAL_I]], %[[GLOBAL_J]]], %[[LDS]][%[[LDS_I]], %[[LDS_J]]]
// CHECK-SAME: memref<64x128xf16, #gpu.address_space<global>>, memref<64x64xf16, #gpu.address_space<workgroup>> -> !amdgpu.tdm_base<f16>
// CHECK: return %[[BASE]] : !amdgpu.tdm_base<f16>
// CHECK-NOT: subview
// CHECK-NOT: expand_shape
// CHECK-NOT: collapse_shape
%base = amdgpu.make_dma_base %mem[%global_i, %global_j], %lds[%lds_i, %lds_j]
: memref<64x128xf16, #gpu_global_addrspace>, memref<64x64xf16, #gpu_lds_addrspace> -> !amdgpu.tdm_base<f16>
func.return %base : !amdgpu.tdm_base<f16>
}
// -----
#gpu_lds_addrspace = #gpu.address_space<workgroup>
#gpu_global_addrspace = #gpu.address_space<global>
// CHECK: func @test_make_gather_dma_base_nop
// CHECK-SAME: %[[MEM:.*]]: memref<64x128xf16, #gpu.address_space<global>>, %[[LDS:.*]]: memref<64x64xf16, #gpu.address_space<workgroup>>, %[[GLOBAL_I:.*]]: index, %[[GLOBAL_J:.*]]: index, %[[LDS_I:.*]]: index, %[[LDS_J:.*]]: index
func.func @test_make_gather_dma_base_nop(%mem: memref<64x128xf16, #gpu_global_addrspace>, %lds: memref<64x64xf16, #gpu_lds_addrspace>, %global_i: index, %global_j: index, %lds_i: index, %lds_j: index) -> !amdgpu.tdm_gather_base<f16, i16> {
// CHECK: %[[BASE:.*]] = amdgpu.make_gather_dma_base %[[MEM]][%[[GLOBAL_I]], %[[GLOBAL_J]]], %[[LDS]][%[[LDS_I]], %[[LDS_J]]]
// CHECK-SAME: memref<64x128xf16, #gpu.address_space<global>>, memref<64x64xf16, #gpu.address_space<workgroup>> -> !amdgpu.tdm_gather_base<f16, i16>
// CHECK: return %[[BASE]] : !amdgpu.tdm_gather_base<f16, i16>
// CHECK-NOT: subview
// CHECK-NOT: expand_shape
// CHECK-NOT: collapse_shape
%base = amdgpu.make_gather_dma_base %mem[%global_i, %global_j], %lds[%lds_i, %lds_j]
: memref<64x128xf16, #gpu_global_addrspace>, memref<64x64xf16, #gpu_lds_addrspace> -> !amdgpu.tdm_gather_base<f16, i16>
func.return %base : !amdgpu.tdm_gather_base<f16, i16>
}
// -----
#gpu_lds_addrspace = #gpu.address_space<workgroup>
#gpu_global_addrspace = #gpu.address_space<global>
// CHECK: #[[GLOBAL_ASYNC_MAP:.*]] = affine_map<()[s0] -> (s0 + 32)>
// CHECK: #[[GLOBAL_ASYNC_MAP1:.*]] = affine_map<()[s0] -> (s0 + 64)>
// CHECK: func @test_global_load_async_to_lds_both_fold_masked
// CHECK-SAME: %[[SRC:.*]]: memref<64x128xf32, #gpu.address_space<global>>, %[[LDS:.*]]: memref<4096xf32, #gpu.address_space<workgroup>>, %[[GLOBAL_I:.*]]: index, %[[GLOBAL_J:.*]]: index, %[[LDS_I:.*]]: index, %[[LDS_J:.*]]: index, %[[MASK:.*]]: i1
func.func @test_global_load_async_to_lds_both_fold_masked(%src: memref<64x128xf32, #gpu_global_addrspace>, %lds: memref<4096xf32, #gpu_lds_addrspace>, %global_i: index, %global_j: index, %lds_i: index, %lds_j: index, %mask: i1) {
// CHECK: %[[GI:.*]] = affine.apply #[[GLOBAL_ASYNC_MAP]]()[%[[GLOBAL_I]]]
// CHECK: %[[GJ:.*]] = affine.apply #[[GLOBAL_ASYNC_MAP1]]()[%[[GLOBAL_J]]]
// CHECK: %[[LDS_IDX:.*]] = affine.linearize_index [%[[LDS_I]], %[[LDS_J]]] by (64, 64) : index
// CHECK: amdgpu.global_load_async_to_lds %[[SRC]][%[[GI]], %[[GJ]]], %[[LDS]][%[[LDS_IDX]]], %[[MASK]]
// CHECK-SAME: vector<4xf32>, memref<64x128xf32, #gpu.address_space<global>>, memref<4096xf32, #gpu.address_space<workgroup>>
%subview = memref.subview %src[32, 64][32, 64][1, 1]
: memref<64x128xf32, #gpu_global_addrspace>
to memref<32x64xf32, strided<[128, 1], offset: 4160>, #gpu_global_addrspace>
%expand_lds = memref.expand_shape %lds [[0, 1]] output_shape [64, 64]
: memref<4096xf32, #gpu_lds_addrspace>
into memref<64x64xf32, #gpu_lds_addrspace>
amdgpu.global_load_async_to_lds %subview[%global_i, %global_j], %expand_lds[%lds_i, %lds_j], %mask
: vector<4xf32>, memref<32x64xf32, strided<[128, 1], offset: 4160>, #gpu_global_addrspace>,
memref<64x64xf32, #gpu_lds_addrspace>
func.return
}
// -----
#gpu_lds_addrspace = #gpu.address_space<workgroup>
#gpu_global_addrspace = #gpu.address_space<global>
// CHECK: func @test_global_load_async_to_lds_no_mask_dst_collapse
// CHECK-SAME: %[[SRC:.*]]: memref<8192xi32, #gpu.address_space<global>>, %[[LDS:.*]]: memref<64x64xi32, #gpu.address_space<workgroup>>, %[[SRC_IDX:.*]]: index, %[[DST_IDX:.*]]: index
func.func @test_global_load_async_to_lds_no_mask_dst_collapse(%src: memref<8192xi32, #gpu_global_addrspace>, %lds: memref<64x64xi32, #gpu_lds_addrspace>, %src_idx: index, %dst_idx: index) {
// CHECK: %[[INDICES:.*]]:2 = affine.delinearize_index %[[DST_IDX]] into (64, 64) : index, index
// CHECK: amdgpu.global_load_async_to_lds %[[SRC]][%[[SRC_IDX]]], %[[LDS]][%[[INDICES]]#0, %[[INDICES]]#1] :
// CHECK-SAME: i32, memref<8192xi32, #gpu.address_space<global>>, memref<64x64xi32, #gpu.address_space<workgroup>>
%collapse_lds = memref.collapse_shape %lds [[0, 1]]
: memref<64x64xi32, #gpu_lds_addrspace>
into memref<4096xi32, #gpu_lds_addrspace>
amdgpu.global_load_async_to_lds %src[%src_idx], %collapse_lds[%dst_idx]
: i32, memref<8192xi32, #gpu_global_addrspace>,
memref<4096xi32, #gpu_lds_addrspace>
func.return
}
// -----
#gpu_lds_addrspace = #gpu.address_space<workgroup>
#gpu_global_addrspace = #gpu.address_space<global>
// CHECK: func @test_global_load_async_to_lds_masked_dst_collapse
// CHECK-SAME: %[[SRC:.*]]: memref<8192xi32, #gpu.address_space<global>>, %[[LDS:.*]]: memref<64x64xi32, #gpu.address_space<workgroup>>, %[[SRC_IDX:.*]]: index, %[[DST_IDX:.*]]: index, %[[MASK:.*]]: i1
func.func @test_global_load_async_to_lds_masked_dst_collapse(%src: memref<8192xi32, #gpu_global_addrspace>, %lds: memref<64x64xi32, #gpu_lds_addrspace>, %src_idx: index, %dst_idx: index, %mask: i1) {
// CHECK: %[[INDICES:.*]]:2 = affine.delinearize_index %[[DST_IDX]] into (64) : index, index
// CHECK: amdgpu.global_load_async_to_lds %[[SRC]][%[[SRC_IDX]]], %[[LDS]][%[[INDICES]]#0, %[[INDICES]]#1], %[[MASK]] :
// CHECK-SAME: i32, memref<8192xi32, #gpu.address_space<global>>, memref<64x64xi32, #gpu.address_space<workgroup>>
%collapse_lds = memref.collapse_shape %lds [[0, 1]]
: memref<64x64xi32, #gpu_lds_addrspace>
into memref<4096xi32, #gpu_lds_addrspace>
amdgpu.global_load_async_to_lds %src[%src_idx], %collapse_lds[%dst_idx], %mask
: i32, memref<8192xi32, #gpu_global_addrspace>,
memref<4096xi32, #gpu_lds_addrspace>
func.return
}
// -----
#gpu_global_addrspace = #gpu.address_space<global>
// CHECK: func @test_global_transpose_load_expand_shape
// CHECK-SAME: %[[SRC:.*]]: memref<8192xf16, #gpu.address_space<global>>, %[[I:.*]]: index, %[[J:.*]]: index
func.func @test_global_transpose_load_expand_shape(%src: memref<8192xf16, #gpu_global_addrspace>, %i: index, %j: index) -> vector<8xf16> {
// CHECK: %[[IDX:.*]] = affine.linearize_index disjoint [%[[I]], %[[J]]] by (64, 128) : index
// CHECK: amdgpu.global_transpose_load %[[SRC]][%[[IDX]]]
// CHECK-SAME: memref<8192xf16, #gpu.address_space<global>> -> vector<8xf16>
%expand_src = memref.expand_shape %src [[0, 1]] output_shape [64, 128]
: memref<8192xf16, #gpu_global_addrspace>
into memref<64x128xf16, #gpu_global_addrspace>
%result = amdgpu.global_transpose_load %expand_src[%i, %j]
: memref<64x128xf16, #gpu_global_addrspace> -> vector<8xf16>
return %result : vector<8xf16>
}
// -----
#gpu_wg = #gpu.address_space<workgroup>
// CHECK: func @test_ds_barrier_ops_expand_shape
// CHECK-SAME: %[[BARRIER:.*]]: memref<16x!amdgpu.ds_barrier_state, #gpu.address_space<workgroup>>, %[[I:.*]]: index, %[[J:.*]]: index, %[[PARTICIPANTS:.*]]: i32, %[[COUNT:.*]]: i64
func.func @test_ds_barrier_ops_expand_shape(%barrier: memref<16x!amdgpu.ds_barrier_state, #gpu_wg>, %i: index, %j: index, %participants: i32, %count: i64) -> !amdgpu.ds_barrier_state {
// CHECK: %[[INIT_IDX:.*]] = affine.linearize_index disjoint [%[[I]], %[[J]]] by (4, 4) : index
// CHECK: amdgpu.ds_barrier_init %[[BARRIER]][%[[INIT_IDX]]], %[[PARTICIPANTS]]
// CHECK-SAME: memref<16x!amdgpu.ds_barrier_state, #gpu.address_space<workgroup>>, i32
// CHECK: %[[POLL_IDX:.*]] = affine.linearize_index disjoint [%[[I]], %[[J]]] by (4, 4) : index
// CHECK: %[[STATE:.*]] = amdgpu.ds_barrier_poll_state %[[BARRIER]][%[[POLL_IDX]]]
// CHECK-SAME: memref<16x!amdgpu.ds_barrier_state, #gpu.address_space<workgroup>> -> !amdgpu.ds_barrier_state
// CHECK: %[[ASYNC_IDX:.*]] = affine.linearize_index disjoint [%[[I]], %[[J]]] by (4, 4) : index
// CHECK: amdgpu.ds_async_barrier_arrive %[[BARRIER]][%[[ASYNC_IDX]]]
// CHECK-SAME: memref<16x!amdgpu.ds_barrier_state, #gpu.address_space<workgroup>>
// CHECK: %[[ARRIVE_IDX:.*]] = affine.linearize_index disjoint [%[[I]], %[[J]]] by (4, 4) : index
// CHECK: %[[OLD:.*]] = amdgpu.ds_barrier_arrive %[[BARRIER]][%[[ARRIVE_IDX]]], %[[COUNT]]
// CHECK-SAME: memref<16x!amdgpu.ds_barrier_state, #gpu.address_space<workgroup>>, i64 -> !amdgpu.ds_barrier_state
%expand_barrier = memref.expand_shape %barrier [[0, 1]] output_shape [4, 4]
: memref<16x!amdgpu.ds_barrier_state, #gpu_wg>
into memref<4x4x!amdgpu.ds_barrier_state, #gpu_wg>
amdgpu.ds_barrier_init %expand_barrier[%i, %j], %participants
: memref<4x4x!amdgpu.ds_barrier_state, #gpu_wg>, i32
%state = amdgpu.ds_barrier_poll_state %expand_barrier[%i, %j]
: memref<4x4x!amdgpu.ds_barrier_state, #gpu_wg> -> !amdgpu.ds_barrier_state
amdgpu.ds_async_barrier_arrive %expand_barrier[%i, %j]
: memref<4x4x!amdgpu.ds_barrier_state, #gpu_wg>
%old_state = amdgpu.ds_barrier_arrive %expand_barrier[%i, %j], %count
: memref<4x4x!amdgpu.ds_barrier_state, #gpu_wg>, i64 -> !amdgpu.ds_barrier_state
return %old_state : !amdgpu.ds_barrier_state
}
// -----
#gpu_wg = #gpu.address_space<workgroup>
// CHECK: func @test_make_dma_descriptor_atomic_barrier_expand_shape
// CHECK-SAME: %[[BASE:.*]]: !amdgpu.tdm_base<i32>, %[[BARRIER:.*]]: memref<16x!amdgpu.ds_barrier_state, #gpu.address_space<workgroup>>, %[[I:.*]]: index, %[[J:.*]]: index
func.func @test_make_dma_descriptor_atomic_barrier_expand_shape(%base: !amdgpu.tdm_base<i32>, %barrier: memref<16x!amdgpu.ds_barrier_state, #gpu_wg>, %i: index, %j: index) -> !amdgpu.tdm_descriptor {
// CHECK: %[[BARRIER_IDX:.*]] = affine.linearize_index disjoint [%[[I]], %[[J]]] by (4, 4) : index
// CHECK: %[[DESC:.*]] = amdgpu.make_dma_descriptor %[[BASE]]
// CHECK-SAME: globalSize [64, 64]
// CHECK-SAME: globalStride [64, 1]
// CHECK-SAME: sharedSize [64, 64]
// CHECK-SAME: atomicBarrier(%[[BARRIER]][%[[BARRIER_IDX]]] : memref<16x!amdgpu.ds_barrier_state, #gpu.address_space<workgroup>>)
%expand_barrier = memref.expand_shape %barrier [[0, 1]] output_shape [4, 4]
: memref<16x!amdgpu.ds_barrier_state, #gpu_wg>
into memref<4x4x!amdgpu.ds_barrier_state, #gpu_wg>
%desc = amdgpu.make_dma_descriptor %base
globalSize [64, 64]
globalStride [64, 1]
sharedSize [64, 64]
atomicBarrier(%expand_barrier[%i, %j] : memref<4x4x!amdgpu.ds_barrier_state, #gpu_wg>)
: !amdgpu.tdm_base<i32> -> !amdgpu.tdm_descriptor
return %desc : !amdgpu.tdm_descriptor
}
// -----
#gpu_wg = #gpu.address_space<workgroup>
// CHECK: func @test_make_gather_dma_descriptor_atomic_barrier_expand_shape
// CHECK-SAME: %[[BASE:.*]]: !amdgpu.tdm_gather_base<i32, i32>, %[[INDICES:.*]]: vector<8xi32>, %[[BARRIER:.*]]: memref<16x!amdgpu.ds_barrier_state, #gpu.address_space<workgroup>>, %[[I:.*]]: index, %[[J:.*]]: index
func.func @test_make_gather_dma_descriptor_atomic_barrier_expand_shape(%base: !amdgpu.tdm_gather_base<i32, i32>, %indices: vector<8xi32>, %barrier: memref<16x!amdgpu.ds_barrier_state, #gpu_wg>, %i: index, %j: index) -> !amdgpu.tdm_descriptor {
// CHECK: %[[BARRIER_IDX:.*]] = affine.linearize_index disjoint [%[[I]], %[[J]]] by (4, 4) : index
// CHECK: %[[DESC:.*]] = amdgpu.make_gather_dma_descriptor %[[BASE]][%[[INDICES]]]
// CHECK-SAME: globalSize [64, 64]
// CHECK-SAME: globalStride [64, 1]
// CHECK-SAME: sharedSize [64, 64]
// CHECK-SAME: atomicBarrier(%[[BARRIER]][%[[BARRIER_IDX]]] : memref<16x!amdgpu.ds_barrier_state, #gpu.address_space<workgroup>>)
%expand_barrier = memref.expand_shape %barrier [[0, 1]] output_shape [4, 4]
: memref<16x!amdgpu.ds_barrier_state, #gpu_wg>
into memref<4x4x!amdgpu.ds_barrier_state, #gpu_wg>
%desc = amdgpu.make_gather_dma_descriptor %base[%indices]
globalSize [64, 64]
globalStride [64, 1]
sharedSize [64, 64]
atomicBarrier(%expand_barrier[%i, %j] : memref<4x4x!amdgpu.ds_barrier_state, #gpu_wg>)
: !amdgpu.tdm_gather_base<i32, i32>, vector<8xi32> -> !amdgpu.tdm_descriptor
return %desc : !amdgpu.tdm_descriptor
}
// -----
// CHECK: func @test_make_dma_descriptor_no_atomic_barrier
// CHECK-SAME: %[[BASE:.*]]: !amdgpu.tdm_base<i32>
func.func @test_make_dma_descriptor_no_atomic_barrier(%base: !amdgpu.tdm_base<i32>) -> !amdgpu.tdm_descriptor {
// CHECK: %[[DESC:.*]] = amdgpu.make_dma_descriptor %[[BASE]]
// CHECK-SAME: globalSize [64, 64]
// CHECK-SAME: globalStride [64, 1]
// CHECK-SAME: sharedSize [64, 64]
// CHECK-NOT: atomicBarrier
%desc = amdgpu.make_dma_descriptor %base
globalSize [64, 64]
globalStride [64, 1]
sharedSize [64, 64]
: !amdgpu.tdm_base<i32> -> !amdgpu.tdm_descriptor
return %desc : !amdgpu.tdm_descriptor
}