Skip to content

Commit bcce754

Browse files
authored
[MLIR][LLVMIR] Add suport for ptrmask intrinsic op (#129539)
Resolves #115805 This patch adds support for ptrmask intrinsic in LLVM dialect and corresponding import/export tests.
1 parent 96336ac commit bcce754

File tree

3 files changed

+42
-0
lines changed

3 files changed

+42
-0
lines changed

mlir/include/mlir/Dialect/LLVMIR/LLVMIntrinsicOps.td

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -315,6 +315,16 @@ def LLVM_NoAliasScopeDeclOp
315315
let assemblyFormat = "$scope attr-dict";
316316
}
317317

318+
def LLVM_PtrMaskOp
319+
: LLVM_OneResultIntrOp<"ptrmask", [], [0, 1],
320+
[Pure, AllTypesMatch<["ptr", "res"]>]> {
321+
let arguments = (ins LLVM_ScalarOrVectorOf<LLVM_AnyPointer>:$ptr,
322+
LLVM_ScalarOrVectorOf<AnyInteger>:$mask);
323+
let results = (outs LLVM_ScalarOrVectorOf<LLVM_AnyPointer>:$res);
324+
325+
let assemblyFormat = "$ptr `,` $mask attr-dict `:` functional-type(operands, results)";
326+
}
327+
318328
//
319329
// Memory marker intrinsics.
320330
//

mlir/test/Target/LLVMIR/Import/intrinsic.ll

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -994,6 +994,20 @@ define float @ssa_copy(float %0) {
994994
ret float %2
995995
}
996996

997+
; CHECK-LABEL: llvm.func @ptrmask
998+
define ptr @ptrmask(ptr %0, i64 %1) {
999+
; CHECK: %{{.*}} = llvm.intr.ptrmask %{{.*}} : (!llvm.ptr, i64) -> !llvm.ptr
1000+
%3 = call ptr @llvm.ptrmask.p0.i64(ptr %0, i64 %1)
1001+
ret ptr %3
1002+
}
1003+
1004+
; CHECK-LABEL: llvm.func @vector_ptrmask
1005+
define <8 x ptr> @vector_ptrmask(<8 x ptr> %0, <8 x i64> %1) {
1006+
; CHECK: %{{.*}} = llvm.intr.ptrmask %{{.*}} : (!llvm.vec<8 x ptr>, vector<8xi64>) -> !llvm.vec<8 x ptr>
1007+
%3 = call <8 x ptr> @llvm.ptrmask.v8p0.v8i64(<8 x ptr> %0, <8 x i64> %1)
1008+
ret <8 x ptr> %3
1009+
}
1010+
9971011
; CHECK-LABEL: experimental_constrained_fptrunc
9981012
define void @experimental_constrained_fptrunc(double %s, <4 x double> %v) {
9991013
; CHECK: llvm.intr.experimental.constrained.fptrunc %{{.*}} towardzero ignore : f64 to f32
@@ -1247,6 +1261,8 @@ declare ptr @llvm.strip.invariant.group.p0(ptr nocapture)
12471261

12481262
declare void @llvm.assume(i1)
12491263
declare float @llvm.ssa.copy.f32(float returned)
1264+
declare ptr @llvm.ptrmask.p0.i64(ptr, i64)
1265+
declare <8 x ptr> @llvm.ptrmask.v8p0.v8i64(<8 x ptr>, <8 x i64>)
12501266
declare <vscale x 4 x float> @llvm.vector.insert.nxv4f32.v4f32(<vscale x 4 x float>, <4 x float>, i64)
12511267
declare <4 x float> @llvm.vector.extract.v4f32.nxv4f32(<vscale x 4 x float>, i64)
12521268
declare <4 x half> @llvm.experimental.constrained.fptrunc.v4f16.v4f64(<4 x double>, metadata, metadata)

mlir/test/Target/LLVMIR/llvmir-intrinsics.mlir

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1079,6 +1079,20 @@ llvm.func @ssa_copy(%arg: f32) -> f32 {
10791079
llvm.return %0 : f32
10801080
}
10811081

1082+
// CHECK-LABEL: @ptrmask
1083+
llvm.func @ptrmask(%p: !llvm.ptr, %mask: i64) -> !llvm.ptr {
1084+
// CHECK: call ptr @llvm.ptrmask.p0.i64
1085+
%0 = llvm.intr.ptrmask %p, %mask : (!llvm.ptr, i64) -> !llvm.ptr
1086+
llvm.return %0 : !llvm.ptr
1087+
}
1088+
1089+
// CHECK-LABEL: @vector_ptrmask
1090+
llvm.func @vector_ptrmask(%p: !llvm.vec<8 x ptr>, %mask: vector<8 x i64>) -> !llvm.vec<8 x ptr> {
1091+
// CHECK: call <8 x ptr> @llvm.ptrmask.v8p0.v8i64
1092+
%0 = llvm.intr.ptrmask %p, %mask : (!llvm.vec<8 x ptr>, vector<8 x i64>) -> !llvm.vec<8 x ptr>
1093+
llvm.return %0 : !llvm.vec<8 x ptr>
1094+
}
1095+
10821096
// CHECK-LABEL: @experimental_constrained_fptrunc
10831097
llvm.func @experimental_constrained_fptrunc(%s: f64, %v: vector<4xf32>) {
10841098
// CHECK: call float @llvm.experimental.constrained.fptrunc.f32.f64(
@@ -1272,6 +1286,8 @@ llvm.func @experimental_constrained_fptrunc(%s: f64, %v: vector<4xf32>) {
12721286
// CHECK-DAG: declare void @llvm.invariant.end.p0(ptr, i64 immarg, ptr captures(none))
12731287

12741288
// CHECK-DAG: declare float @llvm.ssa.copy.f32(float returned)
1289+
// CHECK-DAG: declare ptr @llvm.ptrmask.p0.i64(ptr, i64)
1290+
// CHECK-DAG: declare <8 x ptr> @llvm.ptrmask.v8p0.v8i64(<8 x ptr>, <8 x i64>)
12751291
// CHECK-DAG: declare ptr @llvm.stacksave.p0()
12761292
// CHECK-DAG: declare ptr addrspace(1) @llvm.stacksave.p1()
12771293
// CHECK-DAG: declare void @llvm.stackrestore.p0(ptr)

0 commit comments

Comments
 (0)