diff options
author | Sanjay Patel <spatel@rotateright.com> | 2018-04-11 15:57:18 +0000 |
---|---|---|
committer | Sanjay Patel <spatel@rotateright.com> | 2018-04-11 15:57:18 +0000 |
commit | ff98682c9c60b57e09937abfd3436520232a9bdc (patch) | |
tree | d59065c723901f12cf790a879c779db94d182d9f /llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp | |
parent | 0195469a238095c451ce00008d94abd53a055451 (diff) | |
download | bcm5719-llvm-ff98682c9c60b57e09937abfd3436520232a9bdc.tar.gz bcm5719-llvm-ff98682c9c60b57e09937abfd3436520232a9bdc.zip |
[InstCombine] limit X - (cast(-Y) --> X + cast(Y) with hasOneUse()
llvm-svn: 329821
Diffstat (limited to 'llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp')
-rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp | 20 |
1 files changed, 10 insertions, 10 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp b/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp index 5efdc546472..2ec164926c4 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<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 |