[llvm] r339368 - [InstCombine] allow fsub+fmul FMF folds for vectors

Sanjay Patel via llvm-commits llvm-commits at lists.llvm.org
Thu Aug 9 11:42:12 PDT 2018


Author: spatel
Date: Thu Aug  9 11:42:12 2018
New Revision: 339368

URL: http://llvm.org/viewvc/llvm-project?rev=339368&view=rev
Log:
[InstCombine] allow fsub+fmul FMF folds for vectors

Modified:
    llvm/trunk/lib/Transforms/InstCombine/InstCombineAddSub.cpp
    llvm/trunk/test/Transforms/InstCombine/fast-math.ll

Modified: llvm/trunk/lib/Transforms/InstCombine/InstCombineAddSub.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineAddSub.cpp?rev=339368&r1=339367&r2=339368&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/InstCombine/InstCombineAddSub.cpp (original)
+++ llvm/trunk/lib/Transforms/InstCombine/InstCombineAddSub.cpp Thu Aug  9 11:42:12 2018
@@ -1914,6 +1914,17 @@ Instruction *InstCombiner::visitFSub(Bin
     if (match(Op1, m_c_FAdd(m_Specific(Op0), m_Value(X))))
       return BinaryOperator::CreateFNegFMF(X, &I);
 
+    // (X * C) - X --> X * (C - 1.0)
+    if (match(Op0, m_FMul(m_Specific(Op1), m_Constant(C)))) {
+      Constant *CSubOne = ConstantExpr::getFSub(C, ConstantFP::get(Ty, 1.0));
+      return BinaryOperator::CreateFMulFMF(Op1, CSubOne, &I);
+    }
+    // X - (X * C) --> X * (1.0 - C)
+    if (match(Op1, m_FMul(m_Specific(Op0), m_Constant(C)))) {
+      Constant *OneSubC = ConstantExpr::getFSub(ConstantFP::get(Ty, 1.0), C);
+      return BinaryOperator::CreateFMulFMF(Op0, OneSubC, &I);
+    }
+
     // TODO: This performs reassociative folds for FP ops. Some fraction of the
     // functionality has been subsumed by simple pattern matching here and in
     // InstSimplify. We should let a dedicated reassociation pass handle more

Modified: llvm/trunk/test/Transforms/InstCombine/fast-math.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/fast-math.ll?rev=339368&r1=339367&r2=339368&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/InstCombine/fast-math.ll (original)
+++ llvm/trunk/test/Transforms/InstCombine/fast-math.ll Thu Aug  9 11:42:12 2018
@@ -442,8 +442,8 @@ define double @fail2(double %f1, double
 
 define float @fsub_op0_fmul_const(float %x) {
 ; CHECK-LABEL: @fsub_op0_fmul_const(
-; CHECK-NEXT:    [[TMP1:%.*]] = fmul reassoc nsz float [[X:%.*]], 6.000000e+00
-; CHECK-NEXT:    ret float [[TMP1]]
+; CHECK-NEXT:    [[SUB:%.*]] = fmul reassoc nsz float [[X:%.*]], 6.000000e+00
+; CHECK-NEXT:    ret float [[SUB]]
 ;
   %mul = fmul float %x, 7.0
   %sub = fsub reassoc nsz float %mul, %x
@@ -454,8 +454,7 @@ define float @fsub_op0_fmul_const(float
 
 define <2 x float> @fsub_op0_fmul_const_vec(<2 x float> %x) {
 ; CHECK-LABEL: @fsub_op0_fmul_const_vec(
-; CHECK-NEXT:    [[MUL:%.*]] = fmul <2 x float> [[X:%.*]], <float 7.000000e+00, float -4.200000e+01>
-; CHECK-NEXT:    [[SUB:%.*]] = fsub reassoc nsz <2 x float> [[MUL]], [[X]]
+; CHECK-NEXT:    [[SUB:%.*]] = fmul reassoc nsz <2 x float> [[X:%.*]], <float 6.000000e+00, float -4.300000e+01>
 ; CHECK-NEXT:    ret <2 x float> [[SUB]]
 ;
   %mul = fmul <2 x float> %x, <float 7.0, float -42.0>
@@ -467,8 +466,8 @@ define <2 x float> @fsub_op0_fmul_const_
 
 define float @fsub_op1_fmul_const(float %x) {
 ; CHECK-LABEL: @fsub_op1_fmul_const(
-; CHECK-NEXT:    [[TMP1:%.*]] = fmul reassoc nsz float [[X:%.*]], -6.000000e+00
-; CHECK-NEXT:    ret float [[TMP1]]
+; CHECK-NEXT:    [[SUB:%.*]] = fmul reassoc nsz float [[X:%.*]], -6.000000e+00
+; CHECK-NEXT:    ret float [[SUB]]
 ;
   %mul = fmul float %x, 7.0
   %sub = fsub reassoc nsz float %x, %mul
@@ -479,8 +478,7 @@ define float @fsub_op1_fmul_const(float
 
 define <2 x float> @fsub_op1_fmul_const_vec(<2 x float> %x) {
 ; CHECK-LABEL: @fsub_op1_fmul_const_vec(
-; CHECK-NEXT:    [[MUL:%.*]] = fmul <2 x float> [[X:%.*]], <float 7.000000e+00, float 0.000000e+00>
-; CHECK-NEXT:    [[SUB:%.*]] = fsub reassoc nsz <2 x float> [[X]], [[MUL]]
+; CHECK-NEXT:    [[SUB:%.*]] = fmul reassoc nsz <2 x float> [[X:%.*]], <float -6.000000e+00, float 1.000000e+00>
 ; CHECK-NEXT:    ret <2 x float> [[SUB]]
 ;
   %mul = fmul <2 x float> %x, <float 7.0, float 0.0>




More information about the llvm-commits mailing list