[llvm] r329821 - [InstCombine] limit X - (cast(-Y) --> X + cast(Y) with hasOneUse()

Sanjay Patel via llvm-commits llvm-commits at lists.llvm.org
Wed Apr 11 08:57:18 PDT 2018


Author: spatel
Date: Wed Apr 11 08:57:18 2018
New Revision: 329821

URL: http://llvm.org/viewvc/llvm-project?rev=329821&view=rev
Log:
[InstCombine] limit X - (cast(-Y) --> X + cast(Y) with hasOneUse()

Modified:
    llvm/trunk/lib/Transforms/InstCombine/InstCombineAddSub.cpp
    llvm/trunk/test/Transforms/InstCombine/fsub.ll

Modified: llvm/trunk/lib/Transforms/InstCombine/InstCombineAddSub.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineAddSub.cpp?rev=329821&r1=329820&r2=329821&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/InstCombine/InstCombineAddSub.cpp (original)
+++ llvm/trunk/lib/Transforms/InstCombine/InstCombineAddSub.cpp Wed Apr 11 08:57:18 2018
@@ -1731,16 +1731,16 @@ Instruction *InstCombiner::visitFSub(Bin
   if (match(Op1, m_FNeg(m_Value(Y))))
     return BinaryOperator::CreateFAddFMF(Op0, Y, &I);
 
-  if (FPTruncInst *FPTI = dyn_cast<FPTruncInst>(Op1)) {
-    if (Value *V = dyn_castFNegVal(FPTI->getOperand(0))) {
-      Value *NewTrunc = Builder.CreateFPTrunc(V, I.getType());
-      return BinaryOperator::CreateFAddFMF(Op0, NewTrunc, &I);
-    }
-  } else if (FPExtInst *FPEI = dyn_cast<FPExtInst>(Op1)) {
-    if (Value *V = dyn_castFNegVal(FPEI->getOperand(0))) {
-      Value *NewExt = Builder.CreateFPExt(V, I.getType());
-      return BinaryOperator::CreateFAddFMF(Op0, NewExt, &I);
-    }
+  // Similar to above, but look through a cast of the negated value:
+  // X - (fptrunc(-Y)) --> X + fptrunc(Y)
+  if (match(Op1, m_OneUse(m_FPTrunc(m_FNeg(m_Value(Y)))))) {
+    Value *TruncY = Builder.CreateFPTrunc(Y, I.getType());
+    return BinaryOperator::CreateFAddFMF(Op0, TruncY, &I);
+  }
+  // X - (fpext(-Y)) --> X + fpext(Y)
+  if (match(Op1, m_OneUse(m_FPExt(m_FNeg(m_Value(Y)))))) {
+    Value *ExtY = Builder.CreateFPExt(Y, I.getType());
+    return BinaryOperator::CreateFAddFMF(Op0, ExtY, &I);
   }
 
   // Handle specials cases for FSub with selects feeding the operation

Modified: llvm/trunk/test/Transforms/InstCombine/fsub.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/fsub.ll?rev=329821&r1=329820&r2=329821&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/InstCombine/fsub.ll (original)
+++ llvm/trunk/test/Transforms/InstCombine/fsub.ll Wed Apr 11 08:57:18 2018
@@ -189,14 +189,13 @@ define double @neg_ext_op1_fast(float %a
   ret double %t3
 }
 
-; FIXME: Extra use should prevent the transform.
+; Extra use should prevent the transform.
 
 define float @neg_ext_op1_extra_use(half %a, float %b) {
 ; CHECK-LABEL: @neg_ext_op1_extra_use(
 ; CHECK-NEXT:    [[T1:%.*]] = fsub half 0xH8000, [[A:%.*]]
 ; CHECK-NEXT:    [[T2:%.*]] = fpext half [[T1]] to float
-; CHECK-NEXT:    [[TMP1:%.*]] = fpext half [[A]] to float
-; CHECK-NEXT:    [[T3:%.*]] = fadd float [[TMP1]], [[B:%.*]]
+; CHECK-NEXT:    [[T3:%.*]] = fsub float [[B:%.*]], [[T2]]
 ; CHECK-NEXT:    call void @use(float [[T2]])
 ; CHECK-NEXT:    ret float [[T3]]
 ;
@@ -207,8 +206,8 @@ define float @neg_ext_op1_extra_use(half
   ret float %t3
 }
 
-; One-use fptrunc is always hoisted above fneg, so the corresponding 
-; multi-use bug for fptrunc isn't visible with a fold starting from 
+; One-use fptrunc is always hoisted above fneg, so the corresponding
+; multi-use bug for fptrunc isn't visible with a fold starting from
 ; the last fsub.
 
 define float @neg_trunc_op1_extra_use(double %a, float %b) {
@@ -226,15 +225,13 @@ define float @neg_trunc_op1_extra_use(do
   ret float %t3
 }
 
-; FIXME: But the bug is visible when both preceding values have other uses.
 ; Extra uses should prevent the transform.
 
 define float @neg_trunc_op1_extra_uses(double %a, float %b) {
 ; CHECK-LABEL: @neg_trunc_op1_extra_uses(
 ; CHECK-NEXT:    [[T1:%.*]] = fsub double -0.000000e+00, [[A:%.*]]
 ; CHECK-NEXT:    [[T2:%.*]] = fptrunc double [[T1]] to float
-; CHECK-NEXT:    [[TMP1:%.*]] = fptrunc double [[A]] to float
-; CHECK-NEXT:    [[T3:%.*]] = fadd float [[TMP1]], [[B:%.*]]
+; CHECK-NEXT:    [[T3:%.*]] = fsub float [[B:%.*]], [[T2]]
 ; CHECK-NEXT:    call void @use2(float [[T2]], double [[T1]])
 ; CHECK-NEXT:    ret float [[T3]]
 ;




More information about the llvm-commits mailing list