mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-02-15 17:58:50 +00:00
Fix demanded bits analysis with srem by negative number. Based on a patch
by Richard Osborne. llvm-svn: 58555
This commit is contained in:
parent
1f1ebc5389
commit
bcadcbb1ec
lib/Transforms/Scalar
test/Transforms/InstCombine
@ -1274,12 +1274,12 @@ bool InstCombiner::SimplifyDemandedBits(Value *V, APInt DemandedMask,
|
||||
break;
|
||||
case Instruction::SRem:
|
||||
if (ConstantInt *Rem = dyn_cast<ConstantInt>(I->getOperand(1))) {
|
||||
APInt RA = Rem->getValue();
|
||||
if (RA.isPowerOf2() || (-RA).isPowerOf2()) {
|
||||
APInt RA = Rem->getValue().abs();
|
||||
if (RA.isPowerOf2()) {
|
||||
if (DemandedMask.ule(RA)) // srem won't affect demanded bits
|
||||
return UpdateValueUsesWith(I, I->getOperand(0));
|
||||
|
||||
APInt LowBits = RA.isStrictlyPositive() ? (RA - 1) : ~RA;
|
||||
APInt LowBits = RA - 1;
|
||||
APInt Mask2 = LowBits | APInt::getSignBit(BitWidth);
|
||||
if (SimplifyDemandedBits(I->getOperand(0), Mask2,
|
||||
LHSKnownZero, LHSKnownOne, Depth+1))
|
||||
|
@ -0,0 +1,8 @@
|
||||
; RUN: llvm-as < %s | opt -instcombine | llvm-dis | grep {ret i1 true}
|
||||
; PR2993
|
||||
|
||||
define i1 @foo(i32 %x) {
|
||||
%1 = srem i32 %x, -1
|
||||
%2 = icmp eq i32 %1, 0
|
||||
ret i1 %2
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user