brintos

brintos / llvm-project-archived public Read only

0
0
Text · 28.1 KiB · 432b887 Raw
460 lines · plain
1// RUN: mlir-opt %s -convert-amdgpu-to-rocdl=chipset=gfx908 | FileCheck %s --check-prefixes=CHECK,GFX9,GFX9082// RUN: mlir-opt %s -convert-amdgpu-to-rocdl=chipset=gfx90a | FileCheck %s --check-prefixes=CHECK,GFX9,GFX90A3// RUN: mlir-opt %s -convert-amdgpu-to-rocdl=chipset=gfx942 | FileCheck %s --check-prefixes=CHECK,GFX9,GFX9424// RUN: mlir-opt %s -convert-amdgpu-to-rocdl=chipset=gfx1030 | FileCheck %s --check-prefixes=CHECK,GFX10,RDNA5// RUN: mlir-opt %s -convert-amdgpu-to-rocdl=chipset=gfx1100 | FileCheck %s --check-prefixes=CHECK,GFX11,RDNA6// RUN: mlir-opt %s -convert-amdgpu-to-rocdl=chipset=gfx1201 | FileCheck %s --check-prefixes=CHECK,GFX12,RDNA7 8// Note: #gpu.address_space<global> is hardcoded to `1` here because the9// test pass doesn't set up the GPU address space conversions.10 11// CHECK: #[[$MMRA_TAG:.+]] = #llvm.mmra_tag<"amdgpu-synchronize-as":"local">12 13#gpu_global_addrspace = 114 15// CHECK-LABEL: func @fat_raw_buffer_cast16func.func @fat_raw_buffer_cast(%buf: memref<8xi32, #gpu_global_addrspace>) -> memref<8xi32, #amdgpu.address_space<fat_raw_buffer>> {17  // CHECK: %[[desc:.*]] = builtin.unrealized_conversion_cast %{{.*}} : memref<8xi32, 1> to !llvm.struct<(ptr<1>, ptr<1>, i64, array<1 x i64>, array<1 x i64>)>18  // CHECK-DAG: %[[base:.*]] = llvm.extractvalue %[[desc]][1]19  // CHECK-DAG: %[[offset:.*]] = llvm.extractvalue %[[desc]][2]20  // CHECK-DAG: %[[sizes:.*]] = llvm.extractvalue %[[desc]][3]21  // CHECK-DAG: %[[strides:.*]] = llvm.extractvalue %[[desc]][4]22  // CHECK-DAG: %[[numRecords:.*]] = llvm.mlir.constant(32 : i64) : i6423  // CHECK-DAG: %[[strideArg:.*]] = llvm.mlir.constant(0 : i16) : i1624  // GFX9:  %[[flags:.*]] = llvm.mlir.constant(159744 : i32)25  // RDNA:  %[[flags:.*]] = llvm.mlir.constant(822243328 : i32)26  // CHECK: %[[fatBuf:.*]] = rocdl.make.buffer.rsrc %[[base]], %[[strideArg]], %[[numRecords]], %[[flags]] : <1> to <7>27  // CHECK: %[[ret0:.*]] = llvm.mlir.poison : !llvm.struct<(ptr<7>, ptr<7>, i64, array<1 x i64>, array<1 x i64>)>28  // CHECK: %[[ret1:.*]] = llvm.insertvalue %[[fatBuf]], %[[ret0]][0]29  // CHECK: %[[ret2:.*]] = llvm.insertvalue %[[fatBuf]], %[[ret1]][1]30  // CHECK: %[[ret3:.*]] = llvm.insertvalue %[[offset]], %[[ret2]][2]31  // CHECK: %[[ret4:.*]] = llvm.insertvalue %[[sizes]], %[[ret3]][3]32  // CHECK: %[[ret5:.*]] = llvm.insertvalue %[[strides]], %[[ret4]][4]33  // CHECK: builtin.unrealized_conversion_cast %[[ret5]]34  %ret = amdgpu.fat_raw_buffer_cast %buf : memref<8xi32, #gpu_global_addrspace> to memref<8xi32, #amdgpu.address_space<fat_raw_buffer>>35  return %ret : memref<8xi32, #amdgpu.address_space<fat_raw_buffer>>36}37 38// CHECK-LABEL: func @fat_raw_buffer_cast_0d39func.func @fat_raw_buffer_cast_0d(%buf: memref<i32, #gpu_global_addrspace>) -> memref<i32, #amdgpu.address_space<fat_raw_buffer>> {40  // CHECK: %[[desc:.*]] = builtin.unrealized_conversion_cast %{{.*}} : memref<i32, 1> to !llvm.struct<(ptr<1>, ptr<1>, i64)>41  // CHECK-DAG: %[[base:.*]] = llvm.extractvalue %[[desc]][1]42  // CHECK-DAG: %[[offset:.*]] = llvm.extractvalue %[[desc]][2]43  // CHECK-DAG: %[[numRecords:.*]] = llvm.mlir.constant(4 : i64) : i6444  // CHECK-DAG: %[[strideArg:.*]] = llvm.mlir.constant(0 : i16) : i1645  // GFX9:  %[[flags:.*]] = llvm.mlir.constant(159744 : i32)46  // RDNA:  %[[flags:.*]] = llvm.mlir.constant(822243328 : i32)47  // CHECK: %[[fatBuf:.*]] = rocdl.make.buffer.rsrc %[[base]], %[[strideArg]], %[[numRecords]], %[[flags]]48  // CHECK: %[[ret0:.*]] = llvm.mlir.poison : !llvm.struct<(ptr<7>, ptr<7>, i64)>49  // CHECK: %[[ret1:.*]] = llvm.insertvalue %[[fatBuf]], %[[ret0]][0]50  // CHECK: %[[ret2:.*]] = llvm.insertvalue %[[fatBuf]], %[[ret1]][1]51  // CHECK: %[[ret3:.*]] = llvm.insertvalue %[[offset]], %[[ret2]][2]52  // CHECK: builtin.unrealized_conversion_cast %[[ret3]]53  %ret = amdgpu.fat_raw_buffer_cast %buf : memref<i32, #gpu_global_addrspace> to memref<i32, #amdgpu.address_space<fat_raw_buffer>>54  return %ret : memref<i32, #amdgpu.address_space<fat_raw_buffer>>55}56 57// CHECK-LABEL: func @fat_raw_buffer_cast_dyn_size_offset58func.func @fat_raw_buffer_cast_dyn_size_offset(%buf: memref<?xi32, strided<[1], offset: ?>, #gpu_global_addrspace>) -> memref<?xi32, strided<[1], offset: ?>, #amdgpu.address_space<fat_raw_buffer>> {59  // CHECK: %[[size0:.*]] = llvm.extractvalue %{{.*}}[3, 0]60  // CHECK: %[[stride0:.*]] = llvm.extractvalue %{{.*}}[4, 0]61  // CHECK: %[[maxVals:.*]] = llvm.mul %[[size0]], %[[stride0]]62  // CHECK: %[[byteSize:.*]] = llvm.mlir.constant(4 : i64) : i6463  // CHECK: %[[numRecords:.*]] = llvm.mul %[[maxVals]], %[[byteSize]]64  // CHECK: %[[offset:.*]] = llvm.extractvalue %{{.*}}[2]65  // CHECK: rocdl.make.buffer.rsrc %{{.*}}, %{{.*}}, %[[numRecords]], %{{.*}}66  // CHECK: llvm.insertvalue %[[offset]], %{{.*}}[2]67  %ret = amdgpu.fat_raw_buffer_cast %buf : memref<?xi32, strided<[1], offset: ?>, #gpu_global_addrspace> to memref<?xi32, strided<[1], offset: ?>, #amdgpu.address_space<fat_raw_buffer>>68  return %ret : memref<?xi32, strided<[1], offset: ?>, #amdgpu.address_space<fat_raw_buffer>>69}70 71// CHECK-LABEL: func @fat_raw_buffer_cast_reset_offset72func.func @fat_raw_buffer_cast_reset_offset(%buf: memref<?xi32, strided<[1], offset: ?>, #gpu_global_addrspace>) -> memref<?xi32, #amdgpu.address_space<fat_raw_buffer>> {73  // CHECK: %[[desc:.*]] = builtin.unrealized_conversion_cast %{{.*}} : memref<?xi32, strided<[1], offset: ?>, 1> to !llvm.struct<(ptr<1>, ptr<1>, i64, array<1 x i64>, array<1 x i64>)>74  // CHECK-DAG: %[[memRefPtr:.*]] = llvm.extractvalue %[[desc]][1]75  // CHECK-DAG: %[[memRefOff:.*]] = llvm.extractvalue %[[desc]][2]76  // CHECK-DAG: %[[basePtr:.*]] = llvm.getelementptr %[[memRefPtr]][%[[memRefOff]]]77  // CHECK-DAG: %[[zeroOff:.*]] = llvm.mlir.constant(0 : index) : i6478  // CHECK: %[[fatBuf:.*]] = rocdl.make.buffer.rsrc %[[basePtr]], %{{.*}}, %{{.*}}, %{{.*}}79  // CHECK: llvm.insertvalue %[[fatBuf]], %{{.*}}[1]80  // CHECK: llvm.insertvalue %[[zeroOff]], %{{.*}}[2]81  %ret = amdgpu.fat_raw_buffer_cast %buf resetOffset : memref<?xi32, strided<[1], offset: ?>, #gpu_global_addrspace> to memref<?xi32, #amdgpu.address_space<fat_raw_buffer>>82  return %ret : memref<?xi32, #amdgpu.address_space<fat_raw_buffer>>83}84 85// CHECK-LABEL: func @fat_raw_buffer_cast_valid_bytes86func.func @fat_raw_buffer_cast_valid_bytes(%buf: memref<8xi32, #gpu_global_addrspace>) -> memref<8xi32, #amdgpu.address_space<fat_raw_buffer>> {87  // CHECK: %[[numRecords:.*]] = arith.constant -1 : i6488  // CHECK: rocdl.make.buffer.rsrc %{{.*}}, %{{.*}}, %[[numRecords]], %{{.*}}89  %cu64_max = arith.constant -1 : i6490  %ret = amdgpu.fat_raw_buffer_cast %buf validBytes(%cu64_max) : memref<8xi32, #gpu_global_addrspace> to memref<8xi32, #amdgpu.address_space<fat_raw_buffer>>91  return %ret : memref<8xi32, #amdgpu.address_space<fat_raw_buffer>>92}93 94// CHECK-LABEL: func @fat_raw_buffer_cast_bounds_check95func.func @fat_raw_buffer_cast_bounds_check(%buf: memref<8xi32, #gpu_global_addrspace>) -> memref<8xi32, #amdgpu.address_space<fat_raw_buffer>> {96  // GFX9:  %[[flags:.*]] = llvm.mlir.constant(159744 : i32)97  // RDNA:  %[[flags:.*]] = llvm.mlir.constant(553807872 : i32)98  // CHECK: %[[rsrc:.*]] = rocdl.make.buffer.rsrc %{{.*}}, %{{.*}}, %{{.*}}, %[[flags]]99  %ret = amdgpu.fat_raw_buffer_cast %buf boundsCheck(false) : memref<8xi32, #gpu_global_addrspace> to memref<8xi32, #amdgpu.address_space<fat_raw_buffer>>100  return %ret : memref<8xi32, #amdgpu.address_space<fat_raw_buffer>>101}102 103// CHECK-LABEL: func @fat_raw_buffer_cast_cache_swizzle104// CHECK-SAME: (%{{.*}}: memref<64x64xi32, 1>, %[[stride:.*]]: i14)105func.func @fat_raw_buffer_cast_cache_swizzle(%buf: memref<64x64xi32, #gpu_global_addrspace>, %stride: i14) -> memref<64x64xi32, #amdgpu.address_space<fat_raw_buffer>> {106  // GFX908: %[[stride:.*]] = llvm.mlir.constant(0 : i16) : i16107  // GFX90A: %[[stride:.*]] = llvm.mlir.constant(0 : i16) : i16108  // RDNA: %[[stride:.*]] = llvm.mlir.constant(0 : i16) : i16109  // GFX942: %[[asI16:.*]] = llvm.zext %[[stride]] : i14 to i16110  // GFX942: %[[cacheSwizzleOn:.*]] = llvm.mlir.constant(16384 : i16) : i16111  // GFX942: %[[stride:.*]] = llvm.or disjoint %[[asI16]], %[[cacheSwizzleOn]]112  // CHECK: rocdl.make.buffer.rsrc %{{.*}}, %[[stride]], %{{.*}}, %{{.*}}113  %ret = amdgpu.fat_raw_buffer_cast %buf cacheSwizzleStride(%stride) : memref<64x64xi32, #gpu_global_addrspace> to memref<64x64xi32, #amdgpu.address_space<fat_raw_buffer>>114  return %ret : memref<64x64xi32, #amdgpu.address_space<fat_raw_buffer>>115}116 117// CHECK-LABEL: func @gpu_gcn_raw_buffer_load_scalar_i32118func.func @gpu_gcn_raw_buffer_load_scalar_i32(%buf: memref<i32>) -> i32 {119  // CHECK: %[[numRecords:.*]] = llvm.mlir.constant(4 : i64)120  // CHECK: %[[stride:.*]] = llvm.mlir.constant(0 : i16)121  // GFX9:  %[[flags:.*]] = llvm.mlir.constant(159744 : i32)122  // RDNA:  %[[flags:.*]] = llvm.mlir.constant(822243328 : i32)123  // CHECK: %[[resource:.*]] = rocdl.make.buffer.rsrc %{{.*}}, %[[stride]], %[[numRecords]], %[[flags]] : !llvm.ptr to <8>124  // CHECK: %[[ret:.*]] = rocdl.raw.ptr.buffer.load %[[resource]], %{{.*}}, %{{.*}}, %{{.*}} : i32125  // CHECK: return %[[ret]]126  %0 = amdgpu.raw_buffer_load {boundsCheck = true} %buf[] : memref<i32> -> i32127  func.return %0 : i32128}129 130// CHECK-LABEL: func @gpu_gcn_raw_buffer_load_i32131func.func @gpu_gcn_raw_buffer_load_i32(%buf: memref<64xi32>, %idx: i32) -> i32 {132  // CHECK: %[[numRecords:.*]] = llvm.mlir.constant(256 : i64)133  // CHECK: %[[stride:.*]] = llvm.mlir.constant(0 : i16)134  // GFX9:  %[[flags:.*]] = llvm.mlir.constant(159744 : i32)135  // RDNA:  %[[flags:.*]] = llvm.mlir.constant(822243328 : i32)136  // CHECK: %[[resource:.*]] = rocdl.make.buffer.rsrc %{{.*}}, %[[stride]], %[[numRecords]], %[[flags]] : !llvm.ptr to <8>137  // CHECK: %[[ret:.*]] = rocdl.raw.ptr.buffer.load %[[resource]], %{{.*}}, %{{.*}}, %{{.*}} : i32138  // CHECK: return %[[ret]]139  %0 = amdgpu.raw_buffer_load {boundsCheck = true} %buf[%idx] : memref<64xi32>, i32 -> i32140  func.return %0 : i32141}142 143// CHECK-LABEL: func @gpu_gcn_raw_buffer_load_i32_strided144func.func @gpu_gcn_raw_buffer_load_i32_strided(%buf: memref<16x16xi32, strided<[?, ?], offset: ?>>, %i: i32, %j: i32) -> i32 {145    // CHECK: %[[descriptor:.*]] = builtin.unrealized_conversion_cast %{{.*}} : memref<16x16xi32, strided<[?, ?], offset: ?>> to !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>146    // CHECK: %[[elem_size:.*]] = llvm.mlir.constant(4 : i32) : i32147    // CHECK: %[[algn_ptr:.*]] = llvm.extractvalue %[[descriptor]][1] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>148    // CHECK: %[[offset:.*]] = llvm.extractvalue %[[descriptor]][2] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>149    // CHECK: %[[ptr:.*]] = llvm.getelementptr %[[algn_ptr]][%[[offset]]] : (!llvm.ptr, i64) -> !llvm.ptr, i32150    // CHECK: %[[sz_i:.*]] = llvm.extractvalue %[[descriptor]][3, 0] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>151    // CHECK: %[[stride_i:.*]] = llvm.extractvalue %[[descriptor]][4, 0] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>152    // CHECK: %[[ext_i:.*]] = llvm.mul %[[sz_i]], %[[stride_i]] : i64153    // CHECK: %[[sz_j:.*]] = llvm.extractvalue %[[descriptor]][3, 1] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>154    // CHECK: %[[stride_j:.*]] = llvm.extractvalue %[[descriptor]][4, 1] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>155    // CHECK: %[[ext_j:.*]] = llvm.mul %[[sz_j]], %[[stride_j]] : i64156    // CHECK: %[[num_records:.*]] = llvm.intr.umax(%[[ext_i]], %[[ext_j]]) : (i64, i64) -> i64157    // CHECK: %[[elem_size_2:.*]] = llvm.mlir.constant(4 : i64) : i64158    // CHECK: %[[num_rec_bytes:.*]] = llvm.mul %[[num_records]], %[[elem_size_2]] : i64159    // CHECK: %[[stride:.*]] = llvm.mlir.constant(0 : i16) : i16160    // CHECK: %[[rsrc:.*]] = rocdl.make.buffer.rsrc %[[ptr]], %[[stride]], %[[num_rec_bytes]], %{{.*}} : !llvm.ptr to <8>161    // CHECK: %[[stride_i_1:.*]] = llvm.extractvalue %[[descriptor]][4, 0] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>162    // CHECK: %[[stride_i_i32:.*]] = llvm.trunc %[[stride_i_1]] : i64 to i32163    // CHECK: %[[t_0:.*]] = llvm.mul %{{.*}}, %[[stride_i_i32]] : i32164    // CHECK: %[[stride_j_1:.*]] = llvm.extractvalue %[[descriptor]][4, 1] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>165    // CHECK: %[[stride_j_i32:.*]] = llvm.trunc %[[stride_j_1]] : i64 to i32166    // CHECK: %[[t_1:.*]] = llvm.mul %{{.*}}, %[[stride_j_i32]] : i32167    // CHECK: %[[index:.*]] = llvm.add %[[t_0]], %[[t_1]] : i32168    // CHECK: %[[vgpr_off:.*]] = llvm.mul %[[index]], %[[elem_size]] : i32169    // CHECK: %[[zero_0:.*]] = llvm.mlir.constant(0 : i32) : i32170    // CHECK: %[[sgpr_off:.*]] = llvm.mul %[[zero_0]], %[[elem_size]] : i32171    // CHECK: %[[zero_1:.*]] = llvm.mlir.constant(0 : i32) : i32172    // CHECK: %[[v:.*]] = rocdl.raw.ptr.buffer.load %[[rsrc]], %[[vgpr_off]], %[[sgpr_off]], %[[zero_1]] : i32173    // CHECK: return %[[v]] : i32174  %0 = amdgpu.raw_buffer_load {boundsCheck = true} %buf[%i, %j] :  memref<16x16xi32, strided<[?, ?], offset: ?>>, i32, i32 -> i32175  func.return %0 : i32176}177 178// CHECK-LABEL: func @gpu_gcn_raw_buffer_load_i32_oob_off179func.func @gpu_gcn_raw_buffer_load_i32_oob_off(%buf: memref<64xi32>, %idx: i32) -> i32 {180  // GFX9:  %[[flags:.*]] = llvm.mlir.constant(159744 : i32)181  // RDNA:  %[[flags:.*]] = llvm.mlir.constant(553807872 : i32)182  // CHECK: %[[resource:.*]] = rocdl.make.buffer.rsrc %{{.*}}, %{{.*}}, %{{.*}}, %[[flags]]183  // CHECK: %[[ret:.*]] = rocdl.raw.ptr.buffer.load %[[resource]], %{{.*}}, %{{.*}}, %{{.*}} : i32184  // CHECK: return %[[ret]]185  %0 = amdgpu.raw_buffer_load {boundsCheck = false} %buf[%idx] : memref<64xi32>, i32 -> i32186  func.return %0 : i32187}188 189// CHECK-LABEL: func @gpu_gcn_raw_buffer_load_1xi32190func.func @gpu_gcn_raw_buffer_load_1xi32(%buf: memref<64xi32>, %idx: i32) -> vector<1xi32> {191  // CHECK: %[[ret:.*]] = rocdl.raw.ptr.buffer.load %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}} : i32192  // CHECK: %[[cast:.*]] = llvm.bitcast %[[ret]] : i32 to vector<1xi32>193  // CHECK: return %[[cast]]194  %0 = amdgpu.raw_buffer_load {boundsCheck = true} %buf[%idx] : memref<64xi32>, i32 -> vector<1xi32>195  func.return %0 : vector<1xi32>196}197 198// CHECK-LABEL: func @gpu_gcn_raw_buffer_load_2xi32199func.func @gpu_gcn_raw_buffer_load_2xi32(%buf: memref<64xi32>, %idx: i32) -> vector<2xi32> {200  // CHECK: %[[ret:.*]] = rocdl.raw.ptr.buffer.load %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}} : vector<2xi32>201  // CHECK: return %[[ret]]202  %0 = amdgpu.raw_buffer_load {boundsCheck = true} %buf[%idx] : memref<64xi32>, i32 -> vector<2xi32>203  func.return %0 : vector<2xi32>204}205 206// CHECK-LABEL: func @gpu_gcn_raw_buffer_load_i8207func.func @gpu_gcn_raw_buffer_load_i8(%buf: memref<64xi8>, %idx: i32) -> i8 {208  // CHECK: %[[numRecords:.*]] = llvm.mlir.constant(64 : i64)209  // CHECK: %[[resource:.*]] = rocdl.make.buffer.rsrc %{{.*}}, %{{.*}}, %[[numRecords]], %{{.*}}210  // CHECK: %[[ret:.*]] = rocdl.raw.ptr.buffer.load %[[resource]], %{{.*}}, %{{.*}}, %{{.*}} : i8211  // CHECK: return %[[ret]]212  %0 = amdgpu.raw_buffer_load {boundsCheck = true} %buf[%idx] : memref<64xi8>, i32 -> i8213  func.return %0 : i8214}215 216// CHECK-LABEL: func @gpu_gcn_raw_buffer_load_2xi8217func.func @gpu_gcn_raw_buffer_load_2xi8(%buf: memref<64xi8>, %idx: i32) -> vector<2xi8> {218  // CHECK: %[[numRecords:.*]] = llvm.mlir.constant(64 : i64)219  // CHECK: %[[resource:.*]] = rocdl.make.buffer.rsrc %{{.*}}, %{{.*}}, %[[numRecords]], %{{.*}}220  // CHECK: %[[loaded:.*]] = rocdl.raw.ptr.buffer.load %[[resource]], %{{.*}}, %{{.*}}, %{{.*}} : i16221  // CHECK: %[[ret:.*]] = llvm.bitcast %[[loaded]] : i16 to vector<2xi8>222  // CHECK: return %[[ret]]223  %0 = amdgpu.raw_buffer_load {boundsCheck = true} %buf[%idx] : memref<64xi8>, i32 -> vector<2xi8>224  func.return %0 : vector<2xi8>225}226 227// CHECK-LABEL: func @gpu_gcn_raw_buffer_load_16xi8228func.func @gpu_gcn_raw_buffer_load_16xi8(%buf: memref<64xi8>, %idx: i32) -> vector<16xi8> {229  // CHECK: %[[loaded:.*]] = rocdl.raw.ptr.buffer.load %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}} : vector<4xi32>230  // CHECK: %[[ret:.*]] = llvm.bitcast %[[loaded]] : vector<4xi32> to vector<16xi8>231  // CHECK: return %[[ret]]232  %0 = amdgpu.raw_buffer_load {boundsCheck = true} %buf[%idx] : memref<64xi8>, i32 -> vector<16xi8>233  func.return %0 : vector<16xi8>234}235 236// CHECK-LABEL: func @gpu_gcn_raw_buffer_load_f8E5M2FNUZ237func.func @gpu_gcn_raw_buffer_load_f8E5M2FNUZ(%buf: memref<64xf8E5M2FNUZ>, %idx: i32) -> f8E5M2FNUZ {238  // CHECK: %[[numRecords:.*]] = llvm.mlir.constant(64 : i64)239  // CHECK: %[[resource:.*]] = rocdl.make.buffer.rsrc %{{.*}}, %{{.*}}, %[[numRecords]], %{{.*}}240  // CHECK: %[[loaded:.*]] = rocdl.raw.ptr.buffer.load %[[resource]], %{{.*}}, %{{.*}}, %{{.*}} : i8241  // CHECK: %[[ret:.*]] = builtin.unrealized_conversion_cast %[[loaded]] : i8 to f8E5M2FNUZ242  // CHECK: return %[[ret]]243  %0 = amdgpu.raw_buffer_load {boundsCheck = true} %buf[%idx] : memref<64xf8E5M2FNUZ>, i32 -> f8E5M2FNUZ244  func.return %0 : f8E5M2FNUZ245}246 247// CHECK-LABEL: func @gpu_gcn_raw_buffer_load_4xf8E4M3FNUZ248func.func @gpu_gcn_raw_buffer_load_4xf8E4M3FNUZ(%buf: memref<64xf8E4M3FNUZ>, %idx: i32) -> vector<4xf8E4M3FNUZ> {249  // CHECK: %[[numRecords:.*]] = llvm.mlir.constant(64 : i64)250  // CHECK: %[[resource:.*]] = rocdl.make.buffer.rsrc %{{.*}}, %{{.*}}, %[[numRecords]], %{{.*}}251  // CHECK: %[[loaded:.*]] = rocdl.raw.ptr.buffer.load %[[resource]], %{{.*}}, %{{.*}}, %{{.*}} : i32252  // CHECK: %[[cast:.*]] = llvm.bitcast %[[loaded]] : i32 to vector<4xi8>253  // CHECK: %[[ret:.*]] = builtin.unrealized_conversion_cast %[[cast]] : vector<4xi8> to vector<4xf8E4M3FNUZ>254  // CHECK: return %[[ret]]255  %0 = amdgpu.raw_buffer_load {boundsCheck = true} %buf[%idx] : memref<64xf8E4M3FNUZ>, i32 -> vector<4xf8E4M3FNUZ>256  func.return %0 : vector<4xf8E4M3FNUZ>257}258 259// Since the lowering logic is shared with loads, only bitcasts need to be rechecked260// CHECK-LABEL: func @gpu_gcn_raw_buffer_store_scalar_i32261func.func @gpu_gcn_raw_buffer_store_scalar_i32(%value: i32, %buf: memref<i32>) {262  // GFX9:  %[[flags:.*]] = llvm.mlir.constant(159744 : i32)263  // RDNA:  %[[flags:.*]] = llvm.mlir.constant(822243328 : i32)264  // CHECK: %[[resource:.*]] = rocdl.make.buffer.rsrc %{{.*}}, %{{.*}}, %{{.*}}, %[[flags]]265  // CHECK: rocdl.raw.ptr.buffer.store %{{.*}}, %[[resource]], %{{.*}}, %{{.*}}, %{{.*}} : i32266  amdgpu.raw_buffer_store {boundsCheck = true} %value -> %buf[] : i32 -> memref<i32>267  func.return268}269 270// CHECK-LABEL: func @gpu_gcn_raw_buffer_store_i32271func.func @gpu_gcn_raw_buffer_store_i32(%value: i32, %buf: memref<64xi32>, %idx: i32) {272  // CHECK: %[[numRecords:.*]] = llvm.mlir.constant(256 : i64)273  // GFX9:  %[[flags:.*]] = llvm.mlir.constant(159744 : i32)274  // RDNA:  %[[flags:.*]] = llvm.mlir.constant(822243328 : i32)275  // CHECK: %[[resource:.*]] = rocdl.make.buffer.rsrc %{{.*}}, %{{.*}}, %[[numRecords]], %[[flags]]276  // CHECK: rocdl.raw.ptr.buffer.store %{{.*}}, %[[resource]], %{{.*}}, %{{.*}}, %{{.*}} : i32277  amdgpu.raw_buffer_store {boundsCheck = true} %value -> %buf[%idx] : i32 -> memref<64xi32>, i32278  func.return279}280 281// CHECK-LABEL: func @gpu_gcn_raw_buffer_store_1xf32282func.func @gpu_gcn_raw_buffer_store_1xf32(%value: vector<1xf32>, %buf: memref<64xf32>, %idx: i32) {283  // CHECK: %[[cast:.*]] = llvm.bitcast %{{.*}} : vector<1xf32> to f32284  // CHECK: rocdl.raw.ptr.buffer.store %[[cast]], %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}} : f32285  amdgpu.raw_buffer_store {boundsCheck = true} %value -> %buf[%idx] : vector<1xf32> -> memref<64xf32>, i32286  func.return287}288 289// CHECK-LABEL: func @gpu_gcn_raw_buffer_store_2xi8290func.func @gpu_gcn_raw_buffer_store_2xi8(%value: vector<2xi8>, %buf: memref<64xi8>, %idx: i32) {291  // CHECK: %[[cast:.*]] = llvm.bitcast %{{.*}} : vector<2xi8> to i16292  // CHECK: rocdl.raw.ptr.buffer.store %[[cast]], %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}} : i16293  amdgpu.raw_buffer_store {boundsCheck = true} %value -> %buf[%idx] : vector<2xi8> -> memref<64xi8>, i32294  func.return295}296 297// CHECK-LABEL: func @gpu_gcn_raw_buffer_store_16xi8298func.func @gpu_gcn_raw_buffer_store_16xi8(%value: vector<16xi8>, %buf: memref<64xi8>, %idx: i32) {299  // CHECK: %[[cast:.*]] = llvm.bitcast %{{.*}} : vector<16xi8> to vector<4xi32>300  // CHECK: rocdl.raw.ptr.buffer.store %[[cast]], %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}} : vector<4xi32>301  amdgpu.raw_buffer_store {boundsCheck = true} %value -> %buf[%idx] : vector<16xi8> -> memref<64xi8>, i32302  func.return303}304 305// And more so for atomic add306// CHECK-LABEL: func @gpu_gcn_raw_buffer_atomic_fadd_f32307func.func @gpu_gcn_raw_buffer_atomic_fadd_f32(%value: f32, %buf: memref<64xf32>, %idx: i32) {308  // CHECK: %[[numRecords:.*]] = llvm.mlir.constant(256 : i64)309  // GFX9:  %[[flags:.*]] = llvm.mlir.constant(159744 : i32)310  // RDNA:  %[[flags:.*]] = llvm.mlir.constant(822243328 : i32)311  // CHECK: %[[resource:.*]] = rocdl.make.buffer.rsrc %{{.*}}, %{{.*}}, %[[numRecords]], %[[flags]]312  // CHECK: rocdl.raw.ptr.buffer.atomic.fadd %{{.*}}, %[[resource]], %{{.*}}, %{{.*}}, %{{.*}} : f32313  amdgpu.raw_buffer_atomic_fadd {boundsCheck = true} %value -> %buf[%idx] : f32 -> memref<64xf32>, i32314  func.return315}316 317// CHECK-LABEL: func @gpu_gcn_raw_buffer_atomic_fadd_v2f16318func.func @gpu_gcn_raw_buffer_atomic_fadd_v2f16(%value: vector<2xf16>, %buf: memref<64xf16>, %idx: i32) {319  // CHECK: %[[numRecords:.*]] = llvm.mlir.constant(128 : i64)320  // GFX9:  %[[flags:.*]] = llvm.mlir.constant(159744 : i32)321  // RDNA:  %[[flags:.*]] = llvm.mlir.constant(822243328 : i32)322  // CHECK: %[[resource:.*]] = rocdl.make.buffer.rsrc %{{.*}}, %{{.*}}, %[[numRecords]], %[[flags]]323  // CHECK: rocdl.raw.ptr.buffer.atomic.fadd %{{.*}}, %[[resource]], %{{.*}}, %{{.*}}, %{{.*}} : vector<2xf16>324  amdgpu.raw_buffer_atomic_fadd {boundsCheck = true} %value -> %buf[%idx] : vector<2xf16> -> memref<64xf16>, i32325  func.return326}327 328// CHECK-LABEL: func @gpu_gcn_raw_buffer_atomic_fadd_v2bf16329func.func @gpu_gcn_raw_buffer_atomic_fadd_v2bf16(%value: vector<2xbf16>, %buf: memref<64xbf16>, %idx: i32) {330  // CHECK: %[[numRecords:.*]] = llvm.mlir.constant(128 : i64)331  // GFX9:  %[[flags:.*]] = llvm.mlir.constant(159744 : i32)332  // RDNA:  %[[flags:.*]] = llvm.mlir.constant(822243328 : i32)333  // CHECK: %[[resource:.*]] = rocdl.make.buffer.rsrc %{{.*}}, %{{.*}}, %[[numRecords]], %[[flags]]334  // CHECK: rocdl.raw.ptr.buffer.atomic.fadd %{{.*}}, %[[resource]], %{{.*}}, %{{.*}}, %{{.*}} : vector<2xbf16>335  amdgpu.raw_buffer_atomic_fadd {boundsCheck = true} %value -> %buf[%idx] : vector<2xbf16> -> memref<64xbf16>, i32336  func.return337}338 339// CHECK-LABEL: func @gpu_gcn_raw_buffer_atomic_fmax_f32340func.func @gpu_gcn_raw_buffer_atomic_fmax_f32(%value: f32, %buf: memref<64xf32>, %idx: i32) {341  // CHECK: %[[numRecords:.*]] = llvm.mlir.constant(256 : i64)342  // GFX9:  %[[flags:.*]] = llvm.mlir.constant(159744 : i32)343  // RDNA:  %[[flags:.*]] = llvm.mlir.constant(822243328 : i32)344  // CHECK: %[[resource:.*]] = rocdl.make.buffer.rsrc %{{.*}}, %{{.*}}, %[[numRecords]], %[[flags]]345  // CHECK: rocdl.raw.ptr.buffer.atomic.fmax %{{.*}}, %[[resource]], %{{.*}}, %{{.*}}, %{{.*}} : f32346  amdgpu.raw_buffer_atomic_fmax {boundsCheck = true} %value -> %buf[%idx] : f32 -> memref<64xf32>, i32347  func.return348}349 350// CHECK-LABEL: func @gpu_gcn_raw_buffer_atomic_smax_i32351func.func @gpu_gcn_raw_buffer_atomic_smax_i32(%value: i32, %buf: memref<64xi32>, %idx: i32) {352  // CHECK: %[[numRecords:.*]] = llvm.mlir.constant(256 : i64)353  // GFX9:  %[[flags:.*]] = llvm.mlir.constant(159744 : i32)354  // RDNA:  %[[flags:.*]] = llvm.mlir.constant(822243328 : i32)355  // CHECK: %[[resource:.*]] = rocdl.make.buffer.rsrc %{{.*}}, %{{.*}}, %[[numRecords]], %[[flags]]356  // CHECK: rocdl.raw.ptr.buffer.atomic.smax %{{.*}} %[[resource]], %{{.*}}, %{{.*}}, %{{.*}} : i32357  amdgpu.raw_buffer_atomic_smax {boundsCheck = true} %value -> %buf[%idx] : i32 -> memref<64xi32>, i32358  func.return359}360 361// CHECK-LABEL: func @gpu_gcn_raw_buffer_atomic_umin_i32362func.func @gpu_gcn_raw_buffer_atomic_umin_i32(%value: i32, %buf: memref<64xi32>, %idx: i32) {363  // CHECK: %[[numRecords:.*]] = llvm.mlir.constant(256 : i64)364  // GFX9:  %[[flags:.*]] = llvm.mlir.constant(159744 : i32)365  // RDNA:  %[[flags:.*]] = llvm.mlir.constant(822243328 : i32)366  // CHECK: %[[resource:.*]] = rocdl.make.buffer.rsrc %{{.*}}, %{{.*}}, %[[numRecords]], %[[flags]]367  // CHECK: rocdl.raw.ptr.buffer.atomic.umin %{{.*}} %[[resource]], %{{.*}}, %{{.*}}, %{{.*}} : i32368  amdgpu.raw_buffer_atomic_umin {boundsCheck = true} %value -> %buf[%idx] : i32 -> memref<64xi32>, i32369  func.return370}371 372// CHECK-LABEL: func @amdgpu_raw_buffer_atomic_cmpswap_f32373// CHECK-SAME: (%[[src:.*]]: f32, %[[cmp:.*]]: f32, {{.*}})374func.func @amdgpu_raw_buffer_atomic_cmpswap_f32(%src : f32, %cmp : f32, %buf : memref<64xf32>, %idx: i32) -> f32 {375  // CHECK: %[[srcCast:.*]] = llvm.bitcast %[[src]] : f32 to i32376  // CHECK: %[[cmpCast:.*]] = llvm.bitcast %[[cmp]] : f32 to i32377  // CHECK: %[[numRecords:.*]] = llvm.mlir.constant(256 : i64)378  // GFX9:  %[[flags:.*]] = llvm.mlir.constant(159744 : i32)379  // RDNA:  %[[flags:.*]] = llvm.mlir.constant(822243328 : i32)380  // CHECK: %[[resource:.*]] = rocdl.make.buffer.rsrc %{{.*}}, %{{.*}}, %[[numRecords]], %[[flags]]381  // CHECK: %[[dst:.*]] = rocdl.raw.ptr.buffer.atomic.cmpswap %[[srcCast]], %[[cmpCast]], %[[resource]], %{{.*}}, %{{.*}}, %{{.*}} : i32382  // CHECK: %[[dstCast:.*]] = llvm.bitcast %[[dst]] : i32 to f32383  // CHECK: return %[[dstCast]]384  %dst = amdgpu.raw_buffer_atomic_cmpswap {boundsCheck = true} %src, %cmp -> %buf[%idx] : f32 -> memref<64xf32>, i32385  func.return %dst : f32386}387 388// CHECK-LABEL: func @amdgpu_raw_buffer_atomic_cmpswap_i64389// CHECK-SAME: (%[[src:.*]]: i64, %[[cmp:.*]]: i64, {{.*}})390func.func @amdgpu_raw_buffer_atomic_cmpswap_i64(%src : i64, %cmp : i64, %buf : memref<64xi64>, %idx: i32) -> i64 {391  // CHECK: %[[numRecords:.*]] = llvm.mlir.constant(512 : i64)392  // GFX9:  %[[flags:.*]] = llvm.mlir.constant(159744 : i32)393  // RDNA:  %[[flags:.*]] = llvm.mlir.constant(822243328 : i32)394  // CHECK: %[[resource:.*]] = rocdl.make.buffer.rsrc %{{.*}}, %{{.*}}, %[[numRecords]], %[[flags]]395  // CHECK: %[[dst:.*]] = rocdl.raw.ptr.buffer.atomic.cmpswap %[[src]], %[[cmp]], %[[resource]], %{{.*}}, %{{.*}}, %{{.*}} : i64396  // CHECK: return %[[dst]]397  %dst = amdgpu.raw_buffer_atomic_cmpswap {boundsCheck = true} %src, %cmp -> %buf[%idx] : i64 -> memref<64xi64>, i32398  func.return %dst : i64399}400 401// CHECK-LABEL: func @amdgpu_raw_buffer_atomic_cmpswap_v2f16402// CHECK-SAME: (%[[src:.*]]: vector<2xf16>, %[[cmp:.*]]: vector<2xf16>, {{.*}})403func.func @amdgpu_raw_buffer_atomic_cmpswap_v2f16(%src : vector<2xf16>, %cmp : vector<2xf16>, %buf : memref<64xf16>, %idx: i32) -> vector<2xf16> {404  // CHECK-DAG: %[[srcBits:.+]] = llvm.bitcast %[[src]] : vector<2xf16> to i32405  // CHECK-DAG: %[[cmpBits:.+]] = llvm.bitcast %[[cmp]] : vector<2xf16> to i32406  // CHECK: %[[dstBits:.+]] = rocdl.raw.ptr.buffer.atomic.cmpswap %[[srcBits]], %[[cmpBits]], %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}} : i32407  // CHECK: %[[dst:.+]] = llvm.bitcast %[[dstBits]] : i32 to vector<2xf16>408  // CHECK: return %[[dst]]409  %dst = amdgpu.raw_buffer_atomic_cmpswap {boundsCheck = true} %src, %cmp -> %buf[%idx] : vector<2xf16> -> memref<64xf16>, i32410  func.return %dst : vector<2xf16>411}412 413// CHECK-LABEL: func @lds_barrier414func.func @lds_barrier() {415  // CHECK: llvm.fence syncscope("workgroup") release {llvm.mmra = #[[$MMRA_TAG]]}416  // GFX908: llvm.inline_asm has_side_effects asm_dialect = att417  // GFX908-SAME: ";;;WARNING: BREAKS DEBUG WATCHES\0As_barrier"418  // GFX90A-NEXT: rocdl.s.barrier419  // GFX942-NEXT: rocdl.s.barrier420  // GFX10-NEXT: rocdl.s.barrier421  // GFX11-NEXT: rocdl.s.barrier422  // GFX12-NEXT: rocdl.s.barrier.signal -1423  // GFX12-NEXT: rocdl.s.barrier.wait -1424  // CHECK-NEXT: llvm.fence syncscope("workgroup") acquire {llvm.mmra = #[[$MMRA_TAG]]}425  amdgpu.lds_barrier426  func.return427}428 429// CHECK-LABEL: func @sched_barrier430func.func @sched_barrier() {431  // CHECK: rocdl.sched.barrier 0432  amdgpu.sched_barrier allow = <none>433  // CHECK: rocdl.sched.barrier 1434  amdgpu.sched_barrier allow = <non_mem_non_sideffect>435  // CHECK: rocdl.sched.barrier 2436  amdgpu.sched_barrier allow = <valu>437  // CHECK: rocdl.sched.barrier 4438  amdgpu.sched_barrier allow = <salu>439  // CHECK: rocdl.sched.barrier 8440  amdgpu.sched_barrier allow = <mfma_wmma>441  // CHECK: rocdl.sched.barrier 16442  amdgpu.sched_barrier allow = <all_vmem>443  // CHECK: rocdl.sched.barrier 32444  amdgpu.sched_barrier allow = <vmem_read>445  // CHECK: rocdl.sched.barrier 64446  amdgpu.sched_barrier allow = <vmem_write>447  // CHECK: rocdl.sched.barrier 128448  amdgpu.sched_barrier allow = <all_ds>449  // CHECK: rocdl.sched.barrier 256450  amdgpu.sched_barrier allow = <ds_read>451  // CHECK: rocdl.sched.barrier 512452  amdgpu.sched_barrier allow = <ds_write>453  // CHECK: rocdl.sched.barrier 1024454  amdgpu.sched_barrier allow = <transcendental>455  // CHECK: rocdl.sched.barrier 18456  amdgpu.sched_barrier allow = <valu|all_vmem>457  func.return458}459 460