aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp
diff options
context:
space:
mode:
authorSanjay Patel <spatel@rotateright.com>2022-07-08 09:52:57 -0400
committerSanjay Patel <spatel@rotateright.com>2022-07-08 10:02:19 -0400
commit79bb915fb60b2cd220d89e3bb54f67abb8cdb7bd (patch)
tree95f2e3e18deb408ccdd7aba80dbae242e5a7ae50 /llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp
parent0cf5d40d4c77dd2e21429a099edb4319bf240cc9 (diff)
downloadllvm-79bb915fb60b2cd220d89e3bb54f67abb8cdb7bd.zip
llvm-79bb915fb60b2cd220d89e3bb54f67abb8cdb7bd.tar.gz
llvm-79bb915fb60b2cd220d89e3bb54f67abb8cdb7bd.tar.bz2
[InstCombine] enhance fold for subtract-from-constant -> xor
A low-bit mask is not required: https://alive2.llvm.org/ce/z/yPShss This matches the SDAG implementation that was updated at: 8b756713140f
Diffstat (limited to 'llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp')
-rw-r--r--llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp12
1 files changed, 5 insertions, 7 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp b/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp
index f53cce1..01821a7 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp
@@ -1965,14 +1965,12 @@ Instruction *InstCombinerImpl::visitSub(BinaryOperator &I) {
return BinaryOperator::CreateAdd(X, ConstantExpr::getSub(C, C2));
}
+ // If there's no chance any bit will need to borrow from an adjacent bit:
+ // sub C, X --> xor X, C
const APInt *Op0C;
- if (match(Op0, m_APInt(Op0C)) && Op0C->isMask()) {
- // Turn this into a xor if LHS is 2^n-1 and the remaining bits are known
- // zero.
- KnownBits RHSKnown = computeKnownBits(Op1, 0, &I);
- if ((*Op0C | RHSKnown.Zero).isAllOnes())
- return BinaryOperator::CreateXor(Op1, Op0);
- }
+ if (match(Op0, m_APInt(Op0C)) &&
+ (~computeKnownBits(Op1, 0, &I).Zero).isSubsetOf(*Op0C))
+ return BinaryOperator::CreateXor(Op1, Op0);
{
Value *Y;