[llvm] 1832d60 - InstCombine/Demanded: simplify srem case (NFC) (#110260)
via llvm-commits
llvm-commits at lists.llvm.org
Fri Sep 27 11:12:40 PDT 2024
Author: Ramkumar Ramachandra
Date: 2024-09-27T19:12:35+01:00
New Revision: 1832d609f7e7d5511bb0401a30ed1cf4f49dd00b
URL: https://github.com/llvm/llvm-project/commit/1832d609f7e7d5511bb0401a30ed1cf4f49dd00b
DIFF: https://github.com/llvm/llvm-project/commit/1832d609f7e7d5511bb0401a30ed1cf4f49dd00b.diff
LOG: InstCombine/Demanded: simplify srem case (NFC) (#110260)
The srem case of SimplifyDemandedUseBits partially duplicates
KnownBits::srem. It is guarded by a statement that takes the absolute
value of the RHS and checks whether it is a power of 2, but the abs()
call here useless, since an srem with a negative RHS is flipped into one
with a positive RHS, adjusting LHS appropriately. Stripping the abs call
allows us to call KnownBits::srem instead of partially duplicating it.
Added:
Modified:
llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp b/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
index c66db9285c799a..dd31bfa7e65f50 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
@@ -858,35 +858,16 @@ Value *InstCombinerImpl::SimplifyDemandedUseBits(Instruction *I,
}
case Instruction::SRem: {
const APInt *Rem;
- // X % -1 demands all the bits because we don't want to introduce
- // INT_MIN % -1 (== undef) by accident.
- if (match(I->getOperand(1), m_APInt(Rem)) && !Rem->isAllOnes()) {
- APInt RA = Rem->abs();
- if (RA.isPowerOf2()) {
- if (DemandedMask.ult(RA)) // srem won't affect demanded bits
- return I->getOperand(0);
-
- APInt LowBits = RA - 1;
- APInt Mask2 = LowBits | APInt::getSignMask(BitWidth);
- if (SimplifyDemandedBits(I, 0, Mask2, LHSKnown, Depth + 1, Q))
- return I;
-
- // The low bits of LHS are unchanged by the srem.
- Known.Zero = LHSKnown.Zero & LowBits;
- Known.One = LHSKnown.One & LowBits;
-
- // If LHS is non-negative or has all low bits zero, then the upper bits
- // are all zero.
- if (LHSKnown.isNonNegative() || LowBits.isSubsetOf(LHSKnown.Zero))
- Known.Zero |= ~LowBits;
+ if (match(I->getOperand(1), m_APInt(Rem)) && Rem->isPowerOf2()) {
+ if (DemandedMask.ult(*Rem)) // srem won't affect demanded bits
+ return I->getOperand(0);
- // If LHS is negative and not all low bits are zero, then the upper bits
- // are all one.
- if (LHSKnown.isNegative() && LowBits.intersects(LHSKnown.One))
- Known.One |= ~LowBits;
-
- break;
- }
+ APInt LowBits = *Rem - 1;
+ APInt Mask2 = LowBits | APInt::getSignMask(BitWidth);
+ if (SimplifyDemandedBits(I, 0, Mask2, LHSKnown, Depth + 1, Q))
+ return I;
+ Known = KnownBits::srem(LHSKnown, KnownBits::makeConstant(*Rem));
+ break;
}
llvm::computeKnownBits(I, Known, Depth, Q);
More information about the llvm-commits
mailing list