diff options
author | Duncan Sands <baldrick@free.fr> | 2010-01-29 06:18:37 +0000 |
---|---|---|
committer | Duncan Sands <baldrick@free.fr> | 2010-01-29 06:18:37 +0000 |
commit | cfd54181a44db5ac75cd4a7d0a3c6a199ab01c29 (patch) | |
tree | 40eef7735635ed3cb0359caa78abf762700cd489 | |
parent | 8cdf54c222e911f09b57ab0d8fdd3408979df91b (diff) | |
download | external_llvm-cfd54181a44db5ac75cd4a7d0a3c6a199ab01c29.zip external_llvm-cfd54181a44db5ac75cd4a7d0a3c6a199ab01c29.tar.gz external_llvm-cfd54181a44db5ac75cd4a7d0a3c6a199ab01c29.tar.bz2 |
It looks like the changes to the SRem logic of SimplifyDemandedUseBits
(fix for PR6165) are needed here too.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@94801 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Analysis/ValueTracking.cpp | 25 |
1 files changed, 17 insertions, 8 deletions
diff --git a/lib/Analysis/ValueTracking.cpp b/lib/Analysis/ValueTracking.cpp index 91e5bc3..f9331e7 100644 --- a/lib/Analysis/ValueTracking.cpp +++ b/lib/Analysis/ValueTracking.cpp @@ -421,20 +421,29 @@ void llvm::ComputeMaskedBits(Value *V, const APInt &Mask, } case Instruction::SRem: if (ConstantInt *Rem = dyn_cast<ConstantInt>(I->getOperand(1))) { - APInt RA = Rem->getValue(); - if (RA.isPowerOf2() || (-RA).isPowerOf2()) { - APInt LowBits = RA.isStrictlyPositive() ? (RA - 1) : ~RA; + APInt RA = Rem->getValue().abs(); + if (RA.isPowerOf2()) { + APInt LowBits = RA - 1; APInt Mask2 = LowBits | APInt::getSignBit(BitWidth); ComputeMaskedBits(I->getOperand(0), Mask2, KnownZero2, KnownOne2, TD, Depth+1); - // If the sign bit of the first operand is zero, the sign bit of - // the result is zero. If the first operand has no one bits below - // the second operand's single 1 bit, its sign will be zero. + // The low bits of the first operand are unchanged by the srem. + KnownZero = KnownZero2 & LowBits; + KnownOne = KnownOne2 & LowBits; + + // 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)) - KnownZero2 |= ~LowBits; + KnownZero |= ~LowBits; - KnownZero |= KnownZero2 & Mask; + // 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?"); } |