forked from OSchip/llvm-project
It looks like the changes to the SRem logic of SimplifyDemandedUseBits
(fix for PR6165) are needed here too. llvm-svn: 94801
This commit is contained in:
parent
42c876dff2
commit
26cd6bd0b0
|
@ -421,20 +421,29 @@ void llvm::ComputeMaskedBits(Value *V, const APInt &Mask,
|
||||||
}
|
}
|
||||||
case Instruction::SRem:
|
case Instruction::SRem:
|
||||||
if (ConstantInt *Rem = dyn_cast<ConstantInt>(I->getOperand(1))) {
|
if (ConstantInt *Rem = dyn_cast<ConstantInt>(I->getOperand(1))) {
|
||||||
APInt RA = Rem->getValue();
|
APInt RA = Rem->getValue().abs();
|
||||||
if (RA.isPowerOf2() || (-RA).isPowerOf2()) {
|
if (RA.isPowerOf2()) {
|
||||||
APInt LowBits = RA.isStrictlyPositive() ? (RA - 1) : ~RA;
|
APInt LowBits = RA - 1;
|
||||||
APInt Mask2 = LowBits | APInt::getSignBit(BitWidth);
|
APInt Mask2 = LowBits | APInt::getSignBit(BitWidth);
|
||||||
ComputeMaskedBits(I->getOperand(0), Mask2, KnownZero2, KnownOne2, TD,
|
ComputeMaskedBits(I->getOperand(0), Mask2, KnownZero2, KnownOne2, TD,
|
||||||
Depth+1);
|
Depth+1);
|
||||||
|
|
||||||
// If the sign bit of the first operand is zero, the sign bit of
|
// The low bits of the first operand are unchanged by the srem.
|
||||||
// the result is zero. If the first operand has no one bits below
|
KnownZero = KnownZero2 & LowBits;
|
||||||
// the second operand's single 1 bit, its sign will be zero.
|
KnownOne = KnownOne2 & LowBits;
|
||||||
if (KnownZero2[BitWidth-1] || ((KnownZero2 & LowBits) == LowBits))
|
|
||||||
KnownZero2 |= ~LowBits;
|
|
||||||
|
|
||||||
KnownZero |= KnownZero2 & Mask;
|
// If the first operand is non-negative or has all low bits zero, then
|
||||||
|
// the upper bits are all zero.
|
||||||
|
if (KnownZero2[BitWidth-1] || ((KnownZero2 & LowBits) == LowBits))
|
||||||
|
KnownZero |= ~LowBits;
|
||||||
|
|
||||||
|
// If the first operand is negative and not all low bits are zero, then
|
||||||
|
// the upper bits are all one.
|
||||||
|
if (KnownOne2[BitWidth-1] && ((KnownOne2 & LowBits) != 0))
|
||||||
|
KnownOne |= ~LowBits;
|
||||||
|
|
||||||
|
KnownZero &= Mask;
|
||||||
|
KnownOne &= Mask;
|
||||||
|
|
||||||
assert((KnownZero & KnownOne) == 0 && "Bits known to be one AND zero?");
|
assert((KnownZero & KnownOne) == 0 && "Bits known to be one AND zero?");
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue