summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp
diff options
context:
space:
mode:
authorSanjay Patel <spatel@rotateright.com>2018-08-09 18:42:12 +0000
committerSanjay Patel <spatel@rotateright.com>2018-08-09 18:42:12 +0000
commit55accd7dd38c2e18ba16d63cad232f447b4c8d4c (patch)
treed70c34563d967bfed66026ee89d21e38de3ea1a0 /llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp
parent89005c33c3e5fd1877d83477c565278ceac88c4d (diff)
downloadbcm5719-llvm-55accd7dd38c2e18ba16d63cad232f447b4c8d4c.tar.gz
bcm5719-llvm-55accd7dd38c2e18ba16d63cad232f447b4c8d4c.zip
[InstCombine] allow fsub+fmul FMF folds for vectors
llvm-svn: 339368
Diffstat (limited to 'llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp')
-rw-r--r--llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp11
1 files changed, 11 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp b/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp
index 16e3d742ce0..e3391345ac0 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp
@@ -1914,6 +1914,17 @@ Instruction *InstCombiner::visitFSub(BinaryOperator &I) {
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
OpenPOWER on IntegriCloud