InstCombine: Make the (fmul X, -1.0) -> (fsub -0.0, X) transform handle vectors too.
authorBenjamin Kramer <benny.kra@googlemail.com>
Sat, 18 Jan 2014 16:43:14 +0000 (16:43 +0000)
committerBenjamin Kramer <benny.kra@googlemail.com>
Sat, 18 Jan 2014 16:43:14 +0000 (16:43 +0000)
PR18532.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@199553 91177308-0d34-0410-b5e6-96231b3b80d8

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

index f61d82340b586ea99d3265402d83d8c19f087934..2fcd003bcbdedca14f0053ccbba4d860c0e01e33 100644 (file)
@@ -425,17 +425,15 @@ Instruction *InstCombiner::visitFMul(BinaryOperator &I) {
       if (Instruction *NV = FoldOpIntoPhi(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);
+    if (match(Op1, m_SpecificFP(-1.0))) {
+      Constant *NegZero = ConstantFP::getNegativeZero(Op1->getType());
+      Instruction *RI = BinaryOperator::CreateFSub(NegZero, Op0);
       RI->copyFastMathFlags(&I);
       return RI;
     }
 
+    ConstantFP *C = dyn_cast<ConstantFP>(Op1);
     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 0b4a90d88fa3de2d492d2bc9d4a25faac27bcff8..fdfc8df0a21b43c1046330e9e31e8decab936f1f 100644 (file)
@@ -104,3 +104,12 @@ define float @test9(float %x) {
 ; CHECK: fsub
 }
 
+; PR18532
+define <4 x float> @test10(<4 x float> %x) {
+  %mul = fmul <4 x float> %x, <float -1.0, float -1.0, float -1.0, float -1.0>
+  ret <4 x float> %mul
+
+; CHECK-LABEL: @test10(
+; CHECK-NOT: fmul
+; CHECK: fsub
+}