[Mlir-commits] [mlir] b4869f2 - [mlir][LLVMIR] Fix incorrect result type from llvm.fcmp
Min-Yih Hsu
llvmlistbot at llvm.org
Tue Sep 27 09:57:54 PDT 2022
Author: Min-Yih Hsu
Date: 2022-09-27T09:56:54-07:00
New Revision: b4869f2fa71f977db94f0e7645711a169c845410
URL: https://github.com/llvm/llvm-project/commit/b4869f2fa71f977db94f0e7645711a169c845410
DIFF: https://github.com/llvm/llvm-project/commit/b4869f2fa71f977db94f0e7645711a169c845410.diff
LOG: [mlir][LLVMIR] Fix incorrect result type from llvm.fcmp
If any of the operands for FCmpOp is a vector, returns a vector<Nxi1>,
rather than an i1 type result.
Differential Revision: https://reviews.llvm.org/D134449
Added:
Modified:
mlir/lib/Target/LLVMIR/ConvertFromLLVMIR.cpp
mlir/test/Dialect/LLVMIR/roundtrip.mlir
Removed:
################################################################################
diff --git a/mlir/lib/Target/LLVMIR/ConvertFromLLVMIR.cpp b/mlir/lib/Target/LLVMIR/ConvertFromLLVMIR.cpp
index df1dd6a180c90..9c47d36eab8d5 100644
--- a/mlir/lib/Target/LLVMIR/ConvertFromLLVMIR.cpp
+++ b/mlir/lib/Target/LLVMIR/ConvertFromLLVMIR.cpp
@@ -907,8 +907,20 @@ LogicalResult Importer::processInstruction(llvm::Instruction *inst) {
Value rhs = processValue(inst->getOperand(1));
if (!lhs || !rhs)
return failure();
+
+ if (lhs.getType() != rhs.getType())
+ return failure();
+
+ Type boolType = b.getI1Type();
+ Type resType = boolType;
+ if (LLVM::isCompatibleVectorType(lhs.getType())) {
+ unsigned numElements =
+ LLVM::getVectorNumElements(lhs.getType()).getFixedValue();
+ resType = VectorType::get({numElements}, boolType);
+ }
+
instMap[inst] = b.create<FCmpOp>(
- loc, b.getI1Type(),
+ loc, resType,
getFCmpPredicate(cast<llvm::FCmpInst>(inst)->getPredicate()), lhs, rhs);
return success();
}
diff --git a/mlir/test/Dialect/LLVMIR/roundtrip.mlir b/mlir/test/Dialect/LLVMIR/roundtrip.mlir
index 37a7905f9c584..ad26fd7436fa9 100644
--- a/mlir/test/Dialect/LLVMIR/roundtrip.mlir
+++ b/mlir/test/Dialect/LLVMIR/roundtrip.mlir
@@ -449,7 +449,7 @@ llvm.func @useInlineAsm(%arg0: i32) {
}
// CHECK-LABEL: @fastmathFlags
-func.func @fastmathFlags(%arg0: f32, %arg1: f32, %arg2: i32) {
+func.func @fastmathFlags(%arg0: f32, %arg1: f32, %arg2: i32, %arg3: vector<2 x f32>, %arg4: vector<2 x f32>) {
// CHECK: {{.*}} = llvm.fadd %arg0, %arg1 {fastmathFlags = #llvm.fastmath<fast>} : f32
// CHECK: {{.*}} = llvm.fsub %arg0, %arg1 {fastmathFlags = #llvm.fastmath<fast>} : f32
// CHECK: {{.*}} = llvm.fmul %arg0, %arg1 {fastmathFlags = #llvm.fastmath<fast>} : f32
@@ -461,8 +461,14 @@ func.func @fastmathFlags(%arg0: f32, %arg1: f32, %arg2: i32) {
%3 = llvm.fdiv %arg0, %arg1 {fastmathFlags = #llvm.fastmath<fast>} : f32
%4 = llvm.frem %arg0, %arg1 {fastmathFlags = #llvm.fastmath<fast>} : f32
-// CHECK: {{.*}} = llvm.fcmp "oeq" %arg0, %arg1 {fastmathFlags = #llvm.fastmath<fast>} : f32
+// CHECK: %[[SCALAR_PRED0:.+]] = llvm.fcmp "oeq" %arg0, %arg1 {fastmathFlags = #llvm.fastmath<fast>} : f32
%5 = llvm.fcmp "oeq" %arg0, %arg1 {fastmathFlags = #llvm.fastmath<fast>} : f32
+// CHECK: %{{.*}} = llvm.add %[[SCALAR_PRED0]], %[[SCALAR_PRED0]] : i1
+ %typecheck_5 = llvm.add %5, %5 : i1
+// CHECK: %[[VEC_PRED0:.+]] = llvm.fcmp "oeq" %arg3, %arg4 {fastmathFlags = #llvm.fastmath<fast>} : vector<2xf32>
+ %vcmp = llvm.fcmp "oeq" %arg3, %arg4 {fastmathFlags = #llvm.fastmath<fast>} : vector<2xf32>
+// CHECK: %{{.*}} = llvm.add %[[VEC_PRED0]], %[[VEC_PRED0]] : vector<2xi1>
+ %typecheck_vcmp = llvm.add %vcmp, %vcmp : vector<2xi1>
// CHECK: {{.*}} = llvm.fneg %arg0 {fastmathFlags = #llvm.fastmath<fast>} : f32
%6 = llvm.fneg %arg0 {fastmathFlags = #llvm.fastmath<fast>} : f32
More information about the Mlir-commits
mailing list