diff options
author | Sanjay Patel <spatel@rotateright.com> | 2018-07-29 18:13:16 +0000 |
---|---|---|
committer | Sanjay Patel <spatel@rotateright.com> | 2018-07-29 18:13:16 +0000 |
commit | 577c705752d16c7c04e27e77a8c5b994230e36c6 (patch) | |
tree | ae1f2652517532f7aeb30143c6537331d9b41240 /llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp | |
parent | 2daf28f9ceafec4732aaa954854d8988bdf89f09 (diff) | |
download | bcm5719-llvm-577c705752d16c7c04e27e77a8c5b994230e36c6.tar.gz bcm5719-llvm-577c705752d16c7c04e27e77a8c5b994230e36c6.zip |
[InstCombine] try to fold 'add+sub' to 'not+add'
These are reassociated versions of the same pattern and
similar transforms as in rL338200 and rL338118.
The motivation is identical to those commits:
Patterns with add/sub combos can be improved using
'not' ops. This is better for analysis and may lead
to follow-on transforms because 'xor' and 'add' are
commutative/associative. It can also help codegen.
llvm-svn: 338221
Diffstat (limited to 'llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp')
-rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp b/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp index e79bdf75d40..aa66b442b07 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp @@ -1614,6 +1614,14 @@ Instruction *InstCombiner::visitSub(BinaryOperator &I) { if (match(Op0, m_Not(m_Value(X))) && match(Op1, m_Not(m_Value(Y)))) return BinaryOperator::CreateSub(Y, X); + // (X + -1) - Y --> ~Y + X + if (match(Op0, m_OneUse(m_Add(m_Value(X), m_AllOnes())))) + return BinaryOperator::CreateAdd(Builder.CreateNot(Op1), X); + + // Y - (X + 1) --> ~X + Y + if (match(Op1, m_OneUse(m_Add(m_Value(X), m_One())))) + return BinaryOperator::CreateAdd(Builder.CreateNot(X), Op0); + if (Constant *C = dyn_cast<Constant>(Op0)) { bool IsNegate = match(C, m_ZeroInt()); Value *X; |