Skip to content

Commit 740f690

Browse files
authored
[mlir][rocdl] Add readfirstlane intrinsic (#152551)
1 parent 229d860 commit 740f690

File tree

3 files changed

+39
-1
lines changed

3 files changed

+39
-1
lines changed

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

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,20 @@ def ROCDL_BallotOp :
189189
let assemblyFormat = "$pred attr-dict `:` type($res)";
190190
}
191191

192+
def ROCDL_ReadfirstlaneOp : ROCDL_IntrOp<"readfirstlane", [], [0], [AllTypesMatch<["res", "src"]>], 1>,
193+
Arguments<(ins LLVM_Type:$src)> {
194+
let results = (outs LLVM_Type:$res);
195+
let summary = "Get the value in first active lane.";
196+
197+
let description = [{
198+
Returns the value in the lowest active lane of the input operand.
199+
}];
200+
201+
let assemblyFormat = [{
202+
$src attr-dict `:` type($res)
203+
}];
204+
}
205+
192206
def ROCDL_ReadlaneOp : ROCDL_IntrOp<"readlane", [], [0], [AllTypesMatch<["res", "src0"]>], 1>,
193207
Arguments<(ins LLVM_Type:$src0,
194208
I32:$src1)> {
@@ -201,7 +215,7 @@ def ROCDL_ReadlaneOp : ROCDL_IntrOp<"readlane", [], [0], [AllTypesMatch<["res",
201215

202216
let assemblyFormat = [{
203217
$src0 `,` $src1 attr-dict `:` `(` type($src0) `,` type($src1) `)` `->` type($res)
204-
}];
218+
}];
205219
}
206220

207221
//===----------------------------------------------------------------------===//

mlir/test/Dialect/LLVMIR/rocdl.mlir

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -981,6 +981,13 @@ llvm.func @rocdl.s.wait.expcnt() {
981981

982982
// -----
983983

984+
llvm.func @rocdl.readfirstlane(%src : f32) -> f32 {
985+
// CHECK-LABEL: rocdl.readfirstlane
986+
// CHECK: rocdl.readfirstlane %{{.*}} : f32
987+
%ret = rocdl.readfirstlane %src : f32
988+
llvm.return %ret : f32
989+
}
990+
984991
llvm.func @rocdl.readlane(%src : f32) -> f32 {
985992
%cst0 = llvm.mlir.constant(0 : i32) : i32
986993

mlir/test/Target/LLVMIR/rocdl.mlir

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,23 @@ llvm.func @rocdl.ballot64(%pred : i1) -> i64 {
125125
llvm.return %0 : i64
126126
}
127127

128+
llvm.func @rocdl.readfirstlane(%src0 : f32, %src1: f64, %src2: i32, %src3: vector<2 x f32>) -> f32 {
129+
// CHECK-LABEL: rocdl.readfirstlane
130+
// CHECK: call float @llvm.amdgcn.readfirstlane.f32(float %{{.*}})
131+
%0 = rocdl.readfirstlane %src0 : f32
132+
133+
// CHECK: call double @llvm.amdgcn.readfirstlane.f64(double %{{.*}})
134+
%1 = rocdl.readfirstlane %src1 : f64
135+
136+
// CHECK: call i32 @llvm.amdgcn.readfirstlane.i32(i32 %{{.*}})
137+
%2 = rocdl.readfirstlane %src2 : i32
138+
139+
// CHECK: call <2 x float> @llvm.amdgcn.readfirstlane.v2f32(<2 x float> %{{.*}})
140+
%3 = rocdl.readfirstlane %src3 : vector<2 x f32>
141+
142+
llvm.return %0 : f32
143+
}
144+
128145
llvm.func @rocdl.readlane(%src0 : f32, %src1: f64, %src2: i32, %src3: vector<2 x f32>) -> f32 {
129146
%idx = llvm.mlir.constant(0 : i32) : i32
130147

0 commit comments

Comments
 (0)