Skip to content

Commit 7b7a422

Browse files
authored
[MLIR][LLVMIR] Add {s,u}cmp intrinsics to LLVM dialect (#167870)
1 parent 31536e6 commit 7b7a422

File tree

3 files changed

+76
-0
lines changed

3 files changed

+76
-0
lines changed

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,18 @@ def LLVM_SMinOp : LLVM_BinarySameArgsIntrOpI<"smin">;
181181
def LLVM_UMaxOp : LLVM_BinarySameArgsIntrOpI<"umax">;
182182
def LLVM_UMinOp : LLVM_BinarySameArgsIntrOpI<"umin">;
183183

184+
class LLVM_CmpIntrOp<string func>
185+
: LLVM_OneResultIntrOp<func, [0], [0], [Pure, SameTypeOperands]> {
186+
let arguments = (ins LLVM_ScalarOrVectorOf<AnySignlessInteger>:$a,
187+
LLVM_ScalarOrVectorOf<AnySignlessInteger>:$b);
188+
let results = (outs LLVM_ScalarOrVectorOf<AnySignlessInteger>:$res);
189+
let assemblyFormat = "`(` operands `)` attr-dict `:` "
190+
"functional-type(operands, results)";
191+
}
192+
193+
def LLVM_SCmpOp : LLVM_CmpIntrOp<"scmp">;
194+
def LLVM_UCmpOp : LLVM_CmpIntrOp<"ucmp">;
195+
184196
def LLVM_SinOp : LLVM_UnaryIntrOpF<"sin">;
185197
def LLVM_CosOp : LLVM_UnaryIntrOpF<"cos">;
186198
def LLVM_TanOp : LLVM_UnaryIntrOpF<"tan">;

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

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1128,6 +1128,34 @@ define void @experimental_constrained_fpext(float %s, <4 x float> %v) {
11281128
ret void
11291129
}
11301130

1131+
; CHECK-LABEL: llvm.func @ucmp
1132+
define i2 @ucmp(i32 %a, i32 %b) {
1133+
; CHECK: %{{.*}} = llvm.intr.ucmp(%{{.*}}, %{{.*}}) : (i32, i32) -> i2
1134+
%r = call i2 @llvm.ucmp.i2.i32(i32 %a, i32 %b)
1135+
ret i2 %r
1136+
}
1137+
1138+
; CHECK-LABEL: llvm.func @vector_ucmp
1139+
define <4 x i32> @vector_ucmp(<4 x i32> %a, <4 x i32> %b) {
1140+
; CHECK: %{{.*}} = llvm.intr.ucmp(%{{.*}}, %{{.*}}) : (vector<4xi32>, vector<4xi32>) -> vector<4xi32>
1141+
%r = call <4 x i32> @llvm.ucmp.v4i32.v4i32(<4 x i32> %a, <4 x i32> %b)
1142+
ret <4 x i32> %r
1143+
}
1144+
1145+
; CHECK-LABEL: llvm.func @scmp
1146+
define i2 @scmp(i32 %a, i32 %b) {
1147+
; CHECK: %{{.*}} = llvm.intr.scmp(%{{.*}}, %{{.*}}) : (i32, i32) -> i2
1148+
%r = call i2 @llvm.scmp.i2.i32(i32 %a, i32 %b)
1149+
ret i2 %r
1150+
}
1151+
1152+
; CHECK-LABEL: llvm.func @vector_scmp
1153+
define <4 x i32> @vector_scmp(<4 x i32> %a, <4 x i32> %b) {
1154+
; CHECK: %{{.*}} = llvm.intr.scmp(%{{.*}}, %{{.*}}) : (vector<4xi32>, vector<4xi32>) -> vector<4xi32>
1155+
%r = call <4 x i32> @llvm.scmp.v4i32.v4i32(<4 x i32> %a, <4 x i32> %b)
1156+
ret <4 x i32> %r
1157+
}
1158+
11311159
declare float @llvm.fmuladd.f32(float, float, float)
11321160
declare <8 x float> @llvm.fmuladd.v8f32(<8 x float>, <8 x float>, <8 x float>)
11331161
declare float @llvm.fma.f32(float, float, float)
@@ -1382,3 +1410,7 @@ declare <4 x half> @llvm.experimental.constrained.fptrunc.v4f16.v4f64(<4 x doubl
13821410
declare float @llvm.experimental.constrained.fptrunc.f32.f64(double, metadata, metadata)
13831411
declare <4 x double> @llvm.experimental.constrained.fpext.v4f64.v4f32(<4 x float>, metadata)
13841412
declare double @llvm.experimental.constrained.fpext.f64.f32(float, metadata)
1413+
declare i2 @llvm.ucmp.i2.i32(i32, i32)
1414+
declare <4 x i32> @llvm.ucmp.v4i32.v4i32(<4 x i32>, <4 x i32>)
1415+
declare i2 @llvm.scmp.i2.i32(i32, i32)
1416+
declare <4 x i32> @llvm.scmp.v4i32.v4i32(<4 x i32>, <4 x i32>)

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

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1276,6 +1276,34 @@ llvm.func @experimental_constrained_fpext(%s: f32, %v: vector<4xf32>) {
12761276
llvm.return
12771277
}
12781278

1279+
// CHECK-LABEL: @ucmp
1280+
llvm.func @ucmp(%a: i32, %b: i32) -> i2 {
1281+
// CHECK: call i2 @llvm.ucmp.i2.i32
1282+
%r = llvm.intr.ucmp(%a, %b) : (i32, i32) -> i2
1283+
llvm.return %r : i2
1284+
}
1285+
1286+
// CHECK-LABEL: @vector_ucmp
1287+
llvm.func @vector_ucmp(%a: vector<4 x i32>, %b: vector<4 x i32>) -> vector<4 x i32> {
1288+
// CHECK: call <4 x i32> @llvm.ucmp.v4i32.v4i32
1289+
%0 = llvm.intr.ucmp(%a, %b) : (vector<4 x i32>, vector<4 x i32>) -> vector<4 x i32>
1290+
llvm.return %0 : vector<4 x i32>
1291+
}
1292+
1293+
// CHECK-LABEL: @scmp
1294+
llvm.func @scmp(%a: i32, %b: i32) -> i2 {
1295+
// CHECK: call i2 @llvm.scmp.i2.i32
1296+
%r = llvm.intr.scmp(%a, %b) : (i32, i32) -> i2
1297+
llvm.return %r : i2
1298+
}
1299+
1300+
// CHECK-LABEL: @vector_scmp
1301+
llvm.func @vector_scmp(%a: vector<4 x i32>, %b: vector<4 x i32>) -> vector<4 x i32> {
1302+
// CHECK: call <4 x i32> @llvm.scmp.v4i32.v4i32
1303+
%0 = llvm.intr.scmp(%a, %b) : (vector<4 x i32>, vector<4 x i32>) -> vector<4 x i32>
1304+
llvm.return %0 : vector<4 x i32>
1305+
}
1306+
12791307
// Check that intrinsics are declared with appropriate types.
12801308
// CHECK-DAG: declare float @llvm.fma.f32(float, float, float)
12811309
// CHECK-DAG: declare <8 x float> @llvm.fma.v8f32(<8 x float>, <8 x float>, <8 x float>) #0
@@ -1464,3 +1492,7 @@ llvm.func @experimental_constrained_fpext(%s: f32, %v: vector<4xf32>) {
14641492
// CHECK-DAG: declare <4 x half> @llvm.experimental.constrained.fptrunc.v4f16.v4f32(<4 x float>, metadata, metadata)
14651493
// CHECK-DAG: declare double @llvm.experimental.constrained.fpext.f64.f32(float, metadata)
14661494
// CHECK-DAG: declare <4 x double> @llvm.experimental.constrained.fpext.v4f64.v4f32(<4 x float>, metadata)
1495+
// CHECK-DAG: declare range(i2 -1, -2) i2 @llvm.ucmp.i2.i32(i32, i32)
1496+
// CHECK-DAG: declare range(i32 -1, 2) <4 x i32> @llvm.ucmp.v4i32.v4i32(<4 x i32>, <4 x i32>)
1497+
// CHECK-DAG: declare range(i2 -1, -2) i2 @llvm.scmp.i2.i32(i32, i32)
1498+
// CHECK-DAG: declare range(i32 -1, 2) <4 x i32> @llvm.scmp.v4i32.v4i32(<4 x i32>, <4 x i32>)

0 commit comments

Comments
 (0)