From: Sanjay Patel Date: Wed, 11 Apr 2018 15:57:18 +0000 (+0000) Subject: [InstCombine] limit X - (cast(-Y) --> X + cast(Y) with hasOneUse() X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=ff98682c9c60b57e09937abfd3436520232a9bdc;p=platform%2Fupstream%2Fllvm.git [InstCombine] limit X - (cast(-Y) --> X + cast(Y) with hasOneUse() llvm-svn: 329821 --- diff --git a/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp b/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp index 5efdc54..2ec1649 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp @@ -1731,16 +1731,16 @@ Instruction *InstCombiner::visitFSub(BinaryOperator &I) { if (match(Op1, m_FNeg(m_Value(Y)))) return BinaryOperator::CreateFAddFMF(Op0, Y, &I); - if (FPTruncInst *FPTI = dyn_cast(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(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 diff --git a/llvm/test/Transforms/InstCombine/fsub.ll b/llvm/test/Transforms/InstCombine/fsub.ll index 78aebc0..9ce7308 100644 --- a/llvm/test/Transforms/InstCombine/fsub.ll +++ b/llvm/test/Transforms/InstCombine/fsub.ll @@ -189,14 +189,13 @@ define double @neg_ext_op1_fast(float %a, double %b) { 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 %a, float %b) { 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(double %a, float %b) { 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]] ;