Skip to content

Commit dd9698b

Browse files
jacquesguantmsri
authored andcommitted
[mlir][LLVMIR] Add more vector predication intrinsic ops (llvm#107663)
This revision adds vector predication smax, smin, umax and umin intrinsic ops.
1 parent f091746 commit dd9698b

File tree

4 files changed

+51
-0
lines changed

4 files changed

+51
-0
lines changed

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1156,6 +1156,10 @@ def LLVM_VPShlOp : LLVM_VPBinaryI<"shl">;
11561156
def LLVM_VPOrOp : LLVM_VPBinaryI<"or">;
11571157
def LLVM_VPAndOp : LLVM_VPBinaryI<"and">;
11581158
def LLVM_VPXorOp : LLVM_VPBinaryI<"xor">;
1159+
def LLVM_VPSMaxOp : LLVM_VPBinaryI<"smax">;
1160+
def LLVM_VPSMinOp : LLVM_VPBinaryI<"smin">;
1161+
def LLVM_VPUMaxOp : LLVM_VPBinaryI<"umax">;
1162+
def LLVM_VPUMinOp : LLVM_VPBinaryI<"umin">;
11591163

11601164
// Float Binary
11611165
def LLVM_VPFAddOp : LLVM_VPBinaryF<"fadd">;

mlir/test/Dialect/LLVMIR/roundtrip.mlir

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -729,3 +729,22 @@ llvm.func @test_notail() -> i32 {
729729
%0 = llvm.call notail @tail_call_target() : () -> i32
730730
llvm.return %0 : i32
731731
}
732+
733+
// CHECK-LABEL: @vector_predication_intrinsics
734+
// CHECK-SAME: (%[[ARG0:.*]]: vector<8xi32>, %[[ARG1:.*]]: vector<8xi32>, %[[ARG2:.*]]: vector<8xi1>, %[[ARG3:.*]]: i32)
735+
llvm.func @vector_predication_intrinsics(%A: vector<8xi32>, %B: vector<8xi32>,
736+
%mask: vector<8xi1>, %evl: i32) {
737+
// CHECK-NEXT: "llvm.intr.vp.smax"(%[[ARG0]], %[[ARG1]], %[[ARG2]], %[[ARG3]])
738+
"llvm.intr.vp.smax" (%A, %B, %mask, %evl) :
739+
(vector<8xi32>, vector<8xi32>, vector<8xi1>, i32) -> vector<8xi32>
740+
// CHECK-NEXT: "llvm.intr.vp.smin"(%[[ARG0]], %[[ARG1]], %[[ARG2]], %[[ARG3]])
741+
"llvm.intr.vp.smin" (%A, %B, %mask, %evl) :
742+
(vector<8xi32>, vector<8xi32>, vector<8xi1>, i32) -> vector<8xi32>
743+
// CHECK-NEXT: "llvm.intr.vp.umax"(%[[ARG0]], %[[ARG1]], %[[ARG2]], %[[ARG3]])
744+
"llvm.intr.vp.umax" (%A, %B, %mask, %evl) :
745+
(vector<8xi32>, vector<8xi32>, vector<8xi1>, i32) -> vector<8xi32>
746+
// CHECK-NEXT: "llvm.intr.vp.umin"(%[[ARG0]], %[[ARG1]], %[[ARG2]], %[[ARG3]])
747+
"llvm.intr.vp.umin" (%A, %B, %mask, %evl) :
748+
(vector<8xi32>, vector<8xi32>, vector<8xi1>, i32) -> vector<8xi32>
749+
llvm.return
750+
}

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -897,6 +897,14 @@ define void @vector_predication_intrinsics(<8 x i32> %0, <8 x i32> %1, <8 x floa
897897
%59 = call <8 x ptr> @llvm.vp.inttoptr.v8p0.v8i64(<8 x i64> %4, <8 x i1> %11, i32 %12)
898898
; CHECK: "llvm.intr.vp.fmuladd"(%{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}) : (vector<8xf32>, vector<8xf32>, vector<8xf32>, vector<8xi1>, i32) -> vector<8xf32>
899899
%60 = call <8 x float> @llvm.vp.fmuladd.v8f32(<8 x float> %2, <8 x float> %3, <8 x float> %3, <8 x i1> %11, i32 %12)
900+
; CHECK: "llvm.intr.vp.smax"(%{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}) : (vector<8xi32>, vector<8xi32>, vector<8xi1>, i32) -> vector<8xi32>
901+
%61 = call <8 x i32> @llvm.vp.smax.v8i32(<8 x i32> %0, <8 x i32> %1, <8 x i1> %11, i32 %12)
902+
; CHECK: "llvm.intr.vp.smin"(%{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}) : (vector<8xi32>, vector<8xi32>, vector<8xi1>, i32) -> vector<8xi32>
903+
%62 = call <8 x i32> @llvm.vp.smin.v8i32(<8 x i32> %0, <8 x i32> %1, <8 x i1> %11, i32 %12)
904+
; CHECK: "llvm.intr.vp.umax"(%{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}) : (vector<8xi32>, vector<8xi32>, vector<8xi1>, i32) -> vector<8xi32>
905+
%63 = call <8 x i32> @llvm.vp.umax.v8i32(<8 x i32> %0, <8 x i32> %1, <8 x i1> %11, i32 %12)
906+
; CHECK: "llvm.intr.vp.umin"(%{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}) : (vector<8xi32>, vector<8xi32>, vector<8xi1>, i32) -> vector<8xi32>
907+
%64 = call <8 x i32> @llvm.vp.umin.v8i32(<8 x i32> %0, <8 x i32> %1, <8 x i1> %11, i32 %12)
900908
ret void
901909
}
902910

@@ -1113,6 +1121,10 @@ declare <8 x float> @llvm.vp.frem.v8f32(<8 x float>, <8 x float>, <8 x i1>, i32)
11131121
declare <8 x float> @llvm.vp.fneg.v8f32(<8 x float>, <8 x i1>, i32)
11141122
declare <8 x float> @llvm.vp.fma.v8f32(<8 x float>, <8 x float>, <8 x float>, <8 x i1>, i32)
11151123
declare <8 x float> @llvm.vp.fmuladd.v8f32(<8 x float>, <8 x float>, <8 x float>, <8 x i1>, i32)
1124+
declare <8 x i32> @llvm.vp.smax.v8i32(<8 x i32>, <8 x i32>, <8 x i1>, i32)
1125+
declare <8 x i32> @llvm.vp.smin.v8i32(<8 x i32>, <8 x i32>, <8 x i1>, i32)
1126+
declare <8 x i32> @llvm.vp.umax.v8i32(<8 x i32>, <8 x i32>, <8 x i1>, i32)
1127+
declare <8 x i32> @llvm.vp.umin.v8i32(<8 x i32>, <8 x i32>, <8 x i1>, i32)
11161128
declare i32 @llvm.vp.reduce.add.v8i32(i32, <8 x i32>, <8 x i1>, i32)
11171129
declare i32 @llvm.vp.reduce.mul.v8i32(i32, <8 x i32>, <8 x i1>, i32)
11181130
declare i32 @llvm.vp.reduce.and.v8i32(i32, <8 x i32>, <8 x i1>, i32)

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -798,6 +798,18 @@ llvm.func @vector_predication_intrinsics(%A: vector<8xi32>, %B: vector<8xi32>,
798798
// CHECK: call <8 x i32> @llvm.vp.xor.v8i32
799799
"llvm.intr.vp.xor" (%A, %B, %mask, %evl) :
800800
(vector<8xi32>, vector<8xi32>, vector<8xi1>, i32) -> vector<8xi32>
801+
// CHECK: call <8 x i32> @llvm.vp.smax.v8i32
802+
"llvm.intr.vp.smax" (%A, %B, %mask, %evl) :
803+
(vector<8xi32>, vector<8xi32>, vector<8xi1>, i32) -> vector<8xi32>
804+
// CHECK: call <8 x i32> @llvm.vp.smin.v8i32
805+
"llvm.intr.vp.smin" (%A, %B, %mask, %evl) :
806+
(vector<8xi32>, vector<8xi32>, vector<8xi1>, i32) -> vector<8xi32>
807+
// CHECK: call <8 x i32> @llvm.vp.umax.v8i32
808+
"llvm.intr.vp.umax" (%A, %B, %mask, %evl) :
809+
(vector<8xi32>, vector<8xi32>, vector<8xi1>, i32) -> vector<8xi32>
810+
// CHECK: call <8 x i32> @llvm.vp.umin.v8i32
811+
"llvm.intr.vp.umin" (%A, %B, %mask, %evl) :
812+
(vector<8xi32>, vector<8xi32>, vector<8xi1>, i32) -> vector<8xi32>
801813

802814
// CHECK: call <8 x float> @llvm.vp.fadd.v8f32
803815
"llvm.intr.vp.fadd" (%C, %D, %mask, %evl) :
@@ -1123,6 +1135,10 @@ llvm.func @experimental_constrained_fptrunc(%s: f64, %v: vector<4xf32>) {
11231135
// CHECK-DAG: declare <8 x i32> @llvm.vp.or.v8i32(<8 x i32>, <8 x i32>, <8 x i1>, i32)
11241136
// CHECK-DAG: declare <8 x i32> @llvm.vp.and.v8i32(<8 x i32>, <8 x i32>, <8 x i1>, i32)
11251137
// CHECK-DAG: declare <8 x i32> @llvm.vp.xor.v8i32(<8 x i32>, <8 x i32>, <8 x i1>, i32)
1138+
// CHECK-DAG: declare <8 x i32> @llvm.vp.smax.v8i32(<8 x i32>, <8 x i32>, <8 x i1>, i32)
1139+
// CHECK-DAG: declare <8 x i32> @llvm.vp.smin.v8i32(<8 x i32>, <8 x i32>, <8 x i1>, i32)
1140+
// CHECK-DAG: declare <8 x i32> @llvm.vp.umax.v8i32(<8 x i32>, <8 x i32>, <8 x i1>, i32)
1141+
// CHECK-DAG: declare <8 x i32> @llvm.vp.umin.v8i32(<8 x i32>, <8 x i32>, <8 x i1>, i32)
11261142
// CHECK-DAG: declare <8 x float> @llvm.vp.fadd.v8f32(<8 x float>, <8 x float>, <8 x i1>, i32)
11271143
// CHECK-DAG: declare <8 x float> @llvm.vp.fsub.v8f32(<8 x float>, <8 x float>, <8 x i1>, i32)
11281144
// CHECK-DAG: declare <8 x float> @llvm.vp.fmul.v8f32(<8 x float>, <8 x float>, <8 x i1>, i32)

0 commit comments

Comments
 (0)