Teach InstCombine that (fmul X, -1.0) can be simplified to (fneg X), which LLVM expre...
authorOwen Anderson <resistor@mac.com>
Thu, 16 Jan 2014 20:36:42 +0000 (20:36 +0000)
committerOwen Anderson <resistor@mac.com>
Thu, 16 Jan 2014 20:36:42 +0000 (20:36 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@199420 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/InstCombine/InstCombineMulDivRem.cpp
test/Transforms/InstCombine/fmul.ll

index a7595482eedbd4ab9ff9645445b5ee4c7fcad755..6c34b1bf56631f587407aba26e3ec29b0f846eee 100644 (file)
@@ -426,6 +426,16 @@ Instruction *InstCombiner::visitFMul(BinaryOperator &I) {
         return NV;
 
     ConstantFP *C = dyn_cast<ConstantFP>(Op1);
+
+    // (fmul X, -1.0) --> (fsub -0.0, X)
+    if (C && C->isExactlyValue(-1.0)) {
+      Instruction *RI = BinaryOperator::CreateFSub(
+        ConstantFP::getNegativeZero(C->getType()),
+        Op0);
+      RI->copyFastMathFlags(&I);
+      return RI;
+    }
+
     if (C && AllowReassociate && C->getValueAPF().isFiniteNonZero()) {
       // Let MDC denote an expression in one of these forms:
       // X * C, C/X, X/C, where C is a constant.
index 402ee52e624af2c0f31d8bce41d5a0c2dd7b4e15..71b7138b644c2c77df0c11530b2db802dd302485 100644 (file)
@@ -93,3 +93,15 @@ for.body:                                         ; preds = %for.cond
 for.end:                                          ; preds = %for.cond
   ret void
 }
+
+; X * -1.0 => -0.0 - X
+define float @test9(float %x) {
+  %mul = fmul float %x, -1.0
+  ret float %mul
+
+; CHECK-LABEL: @test9(
+; CHECK-NOT: fmul
+; CHECK: fsub
+}
+
+