-
Notifications
You must be signed in to change notification settings - Fork 14.3k
InstCombine/Demanded: simplify srem case (NFC) #110260
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
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.
@llvm/pr-subscribers-llvm-transforms Author: Ramkumar Ramachandra (artagnon) ChangesThe 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. Full diff: https://github.com/llvm/llvm-project/pull/110260.diff 1 Files Affected:
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp b/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
index c66db9285c799a..8018ffc7b6752b 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
@@ -861,30 +861,15 @@ Value *InstCombinerImpl::SimplifyDemandedUseBits(Instruction *I,
// 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
+ if (Rem->isPowerOf2()) {
+ if (DemandedMask.ult(*Rem)) // srem won't affect demanded bits
return I->getOperand(0);
- APInt LowBits = RA - 1;
+ APInt LowBits = *Rem - 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 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;
-
+ Known = KnownBits::srem(LHSKnown, KnownBits::makeConstant(*Rem));
break;
}
}
|
I haven't rigorously been able to prove that this is an NFC. Kindly check. |
llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
Outdated
Show resolved
Hide resolved
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
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.
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.