InstCombine: fold fcmp pred (fneg x), C -> fcmp swap(pred) x, -C
authorBenjamin Kramer <benny.kra@googlemail.com>
Thu, 31 Mar 2011 10:12:15 +0000 (10:12 +0000)
committerBenjamin Kramer <benny.kra@googlemail.com>
Thu, 31 Mar 2011 10:12:15 +0000 (10:12 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@128626 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/InstCombine/InstCombineCompares.cpp
test/Transforms/InstCombine/fcmp.ll

index 48ce7cffb5823130935b99143b4ba84f4ac0cdcc..6743885cd4217767186b24cb6fd10c291494fdf1 100644 (file)
@@ -2834,6 +2834,14 @@ Instruction *InstCombiner::visitFCmpInst(FCmpInst &I) {
           return SelectInst::Create(LHSI->getOperand(0), Op1, Op2);
         break;
       }
+      case Instruction::FSub: {
+        // fcmp pred (fneg x), C -> fcmp swap(pred) x, -C
+        Value *Op;
+        if (match(LHSI, m_FNeg(m_Value(Op))))
+          return new FCmpInst(I.getSwappedPredicate(), Op,
+                              ConstantExpr::getFNeg(RHSC));
+        break;
+      }
       case Instruction::Load:
         if (GetElementPtrInst *GEP =
             dyn_cast<GetElementPtrInst>(LHSI->getOperand(0))) {
index 49bd50717dcf2e13657e81938a1610228523ceec..f869a18992df35c4ca843c929bfc907f7da3324b 100644 (file)
@@ -32,3 +32,11 @@ define i1 @test4(float %a) nounwind {
 ; CHECK: @test4
 ; CHECK-NEXT: fpext float %a to double
 }
+
+define i1 @test5(float %a) nounwind {
+  %neg = fsub float -0.000000e+00, %a
+  %cmp = fcmp ogt float %neg, 1.000000e+00
+  ret i1 %cmp
+; CHECK: @test5
+; CHECK-NEXT: fcmp olt float %a, -1.0
+}