summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp
diff options
context:
space:
mode:
authorRoman Lebedev <lebedev.ri@gmail.com>2020-01-03 21:10:51 +0300
committerRoman Lebedev <lebedev.ri@gmail.com>2020-01-03 21:25:48 +0300
commit7973aa05f6f987bb4746db2bcbb34e7fa0ce8897 (patch)
tree4c8d2ce1e2f828b32e87a63fe1b0a20f37fb0af4 /llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp
parent6f922dbbeae7b647dfd548c4d74f384ca9c252da (diff)
downloadbcm5719-llvm-7973aa05f6f987bb4746db2bcbb34e7fa0ce8897.tar.gz
bcm5719-llvm-7973aa05f6f987bb4746db2bcbb34e7fa0ce8897.zip
[NFC][InstCombine] '(Op1 & С) - Op1' -> '-(Op1 & ~C)' fold (PR44427)
This decreases use count of Op1, potentially allows us to further hoist said 'neg' later on, and results in marginally better X86 codegen. Name: (Op1 & С) - Op1 -> -(Op1 & ~C) %o = and i64 %Op1, C1 %r = sub i64 %o, %Op1 => %n = and i64 %Op1, ~C1 %r = sub i64 0, %n https://rise4fun.com/Alive/rwgA https://godbolt.org/z/R_RMfM https://bugs.llvm.org/show_bug.cgi?id=44427
Diffstat (limited to 'llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp')
-rw-r--r--llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp9
1 files changed, 9 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp b/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp
index 33803aaf359..9676c6abef0 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp
@@ -1889,6 +1889,15 @@ Instruction *InstCombiner::visitSub(BinaryOperator &I) {
}
}
+ {
+ // (sub (and Op1, C), Op1) --> neg (and Op1, ~C)
+ Constant *C;
+ if (match(Op0, m_OneUse(m_And(m_Specific(Op1), m_Constant(C))))) {
+ return BinaryOperator::CreateNeg(
+ Builder.CreateAnd(Op1, Builder.CreateNot(C)));
+ }
+ }
+
if (Op1->hasOneUse()) {
Value *X = nullptr, *Y = nullptr, *Z = nullptr;
Constant *C = nullptr;
OpenPOWER on IntegriCloud