diff options
| author | Sanjay Patel <spatel@rotateright.com> | 2018-04-05 17:06:45 +0000 |
|---|---|---|
| committer | Sanjay Patel <spatel@rotateright.com> | 2018-04-05 17:06:45 +0000 |
| commit | deaf4f354ee0dab9163891532f7264b181876d95 (patch) | |
| tree | fccbdffea9df16d7bedf9446006c8184832224c3 /llvm/lib/Transforms | |
| parent | cfd44a2e69fa0897d944bc66ca517a7d079c135d (diff) | |
| download | bcm5719-llvm-deaf4f354ee0dab9163891532f7264b181876d95.tar.gz bcm5719-llvm-deaf4f354ee0dab9163891532f7264b181876d95.zip | |
[InstCombine] use pattern matchers for fsub --> fadd folds
This allows folding for vectors with undef elements.
llvm-svn: 329316
Diffstat (limited to 'llvm/lib/Transforms')
| -rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp b/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp index 1f04a8b3a3a..578ba23604d 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp @@ -1708,10 +1708,15 @@ Instruction *InstCombiner::visitFSub(BinaryOperator &I) { if (Instruction *NV = FoldOpIntoSelect(I, SI)) return NV; - // If this is a 'B = x-(-A)', change to B = x+A, potentially looking - // through FP extensions/truncations along the way. - if (Value *V = dyn_castFNegVal(Op1)) - return BinaryOperator::CreateFAddFMF(Op0, V, &I); + // X - C --> X + (-C) + Constant *C; + if (match(Op1, m_Constant(C))) + return BinaryOperator::CreateFAddFMF(Op0, ConstantExpr::getFNeg(C), &I); + + // X - (-Y) --> X + Y + Value *Y; + 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))) { |

