diff options
-rw-r--r-- | llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp | 5 | ||||
-rw-r--r-- | llvm/test/CodeGen/AArch64/GlobalISel/arm64-irtranslator.ll | 11 |
2 files changed, 15 insertions, 1 deletions
diff --git a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp index 488869f642f..4d1ac680a45 100644 --- a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp +++ b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp @@ -193,9 +193,12 @@ bool IRTranslator::translateCompare(const User &U, CmpInst::Predicate Pred = CI ? CI->getPredicate() : static_cast<CmpInst::Predicate>( cast<ConstantExpr>(U).getPredicate()); - if (CmpInst::isIntPredicate(Pred)) MIRBuilder.buildICmp(Pred, Res, Op0, Op1); + else if (Pred == CmpInst::FCMP_FALSE) + MIRBuilder.buildConstant(Res, 0); + else if (Pred == CmpInst::FCMP_TRUE) + MIRBuilder.buildConstant(Res, 1); else MIRBuilder.buildFCmp(Pred, Res, Op0, Op1); diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/arm64-irtranslator.ll b/llvm/test/CodeGen/AArch64/GlobalISel/arm64-irtranslator.ll index 1bbda24f444..c0cbf69a2e6 100644 --- a/llvm/test/CodeGen/AArch64/GlobalISel/arm64-irtranslator.ll +++ b/llvm/test/CodeGen/AArch64/GlobalISel/arm64-irtranslator.ll @@ -1056,6 +1056,17 @@ define void @float_comparison(float* %a.addr, float* %b.addr, i1* %bool.addr) { ret void } +; CHECK-LABEL: name: trivial_float_comparison +; CHECK: [[R1:%[0-9]+]](s1) = G_CONSTANT i1 false +; CHECK: [[R2:%[0-9]+]](s1) = G_CONSTANT i1 true +; CHECK: G_ADD [[R1]], [[R2]] +define i1 @trivial_float_comparison(double %a, double %b) { + %r1 = fcmp false double %a, %b + %r2 = fcmp true double %a, %b + %sum = add i1 %r1, %r2 + ret i1 %sum +} + @var = global i32 0 define i32* @test_global() { |