Skip to content

Commit fc2f31c

Browse files
authored
[MLIR][ROCDL] Add op for raw.ptr.buffer.load.lds (#127988)
This PR adds raw.ptr.buffer.load.lds op to ROCDL to expose buffer loads directly to LDS. The op is converted to the corresponding intrinsic call during the translation from MLIR to LLVM IR.
1 parent 8a3222d commit fc2f31c

File tree

3 files changed

+40
-1
lines changed

3 files changed

+40
-1
lines changed

mlir/include/mlir/Dialect/LLVMIR/ROCDLOps.td

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -475,6 +475,24 @@ def ROCDL_RawPtrBufferLoadOp :
475475
}];
476476
}
477477

478+
def ROCDL_RawPtrBufferLoadLdsOp :
479+
ROCDL_IntrOp<"raw.ptr.buffer.load.lds", [], [], [], 0, 0, 1> {
480+
dag args = (ins Arg<ROCDLBufferRsrc, "", [MemRead]>:$rsrc,
481+
Arg<ROCDLBufferLDS, "", [MemWrite]>:$ldsPtr,
482+
I32:$size,
483+
I32:$voffset,
484+
I32:$soffset,
485+
I32:$offset,
486+
I32:$aux);
487+
let arguments = !con(args, aliasAttrs);
488+
let assemblyFormat = "operands attr-dict";
489+
let extraClassDefinition = [{
490+
::llvm::SmallVector<::mlir::Value> $cppClass::getAccessedOperands() {
491+
return {getRsrc(), getLdsPtr()};
492+
}
493+
}];
494+
}
495+
478496
def ROCDL_RawPtrBufferStoreOp :
479497
ROCDL_IntrOp<"raw.ptr.buffer.store", [], [0], [], 0, 0, 1> {
480498
dag args = (ins LLVM_Type:$vdata,
@@ -692,7 +710,7 @@ def ROCDL_CvtScaleF32PkFp8F32:
692710
attr-dict $srcA `,` $srcB `,` $scale `->` $old `[` $wordSel `]` `:` type($res)
693711
}];
694712
}
695-
713+
696714
def ROCDL_CvtScaleF32PkBf8F32:
697715
ROCDL_IntrOp<"cvt.scalef32.pk.bf8.f32", [], [], [Pure], 1>,
698716
Arguments<(ins ROCDL_V2I16Type:$old, F32:$srcA, F32:$srcB, F32: $scale, I1:$wordSel)> {

mlir/test/Dialect/LLVMIR/rocdl.mlir

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -687,6 +687,15 @@ llvm.func @rocdl.raw.ptr.buffer.f32(%rsrc : !llvm.ptr<8>,
687687
llvm.return
688688
}
689689

690+
llvm.func @rocdl.raw.ptr.buffer.load.lds(%rsrc : !llvm.ptr<8>, %dstLds : !llvm.ptr<3>,
691+
%size: i32, %voffset : i32, %soffset : i32, %offset : i32,
692+
%aux : i32) {
693+
// CHECK-LABEL: rocdl.raw.ptr.buffer.load.lds
694+
// CHECK: rocdl.raw.ptr.buffer.load.lds %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}
695+
rocdl.raw.ptr.buffer.load.lds %rsrc, %dstLds, %size, %voffset, %soffset, %offset, %aux
696+
697+
llvm.return
698+
}
690699

691700
llvm.func @rocdl.raw.ptr.buffer.i32(%rsrc : !llvm.ptr<8>,
692701
%offset : i32, %soffset : i32,

mlir/test/Target/LLVMIR/rocdl.mlir

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -904,6 +904,18 @@ llvm.func @rocdl.raw.ptr.buffer(%rsrc : !llvm.ptr<8>,
904904
llvm.return
905905
}
906906

907+
llvm.func @rocdl.raw.ptr.buffer.load.lds(%rsrc : !llvm.ptr<8>, %dstLds : !llvm.ptr<3>,
908+
%voffset : i32, %soffset : i32) {
909+
%size = llvm.mlir.constant(4 : i32) : i32
910+
%offset = llvm.mlir.constant(128 : i32) : i32
911+
%aux = llvm.mlir.constant(1 : i32) : i32
912+
// CHECK-LABEL: rocdl.raw.ptr.buffer.load.lds
913+
// CHECK: call void @llvm.amdgcn.raw.ptr.buffer.load.lds(ptr addrspace(8) %{{.*}}, ptr addrspace(3) %{{.*}}, i32 4, i32 %{{.*}}, i32 %{{.*}}, i32 128, i32 1
914+
rocdl.raw.ptr.buffer.load.lds %rsrc, %dstLds, %size, %voffset, %soffset, %offset, %aux
915+
916+
llvm.return
917+
}
918+
907919
llvm.func @rocdl.raw.ptr.buffer.atomic.f32(%rsrc : !llvm.ptr<8>,
908920
%offset : i32, %soffset : i32,
909921
%vdata1 : f32) {

0 commit comments

Comments
 (0)