mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-02-01 05:01:59 +01:00
[InstCombine][ValueTracking] When computing known bits for Srem make sure we don't compute known bits for the LHS twice.
If we already called computeKnownBits for the RHS being a constant power of 2, we've already computed everything we can and should just stop. I think previously we would still recurse if we had determined the result was negative or had not determined the sign bit at all. llvm-svn: 300432
This commit is contained in:
parent
2ddcbb2d22
commit
8a80f26229
@ -1178,19 +1178,16 @@ static void computeKnownBitsFromOperator(const Operator *I, APInt &KnownZero,
|
||||
KnownOne |= ~LowBits;
|
||||
|
||||
assert((KnownZero & KnownOne) == 0 && "Bits known to be one AND zero?");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// The sign bit is the LHS's sign bit, except when the result of the
|
||||
// remainder is zero.
|
||||
if (KnownZero.isNonNegative()) {
|
||||
APInt LHSKnownZero(BitWidth, 0), LHSKnownOne(BitWidth, 0);
|
||||
computeKnownBits(I->getOperand(0), LHSKnownZero, LHSKnownOne, Depth + 1,
|
||||
Q);
|
||||
// If it's known zero, our sign bit is also zero.
|
||||
if (LHSKnownZero.isNegative())
|
||||
KnownZero.setSignBit();
|
||||
}
|
||||
computeKnownBits(I->getOperand(0), KnownZero2, KnownOne2, Depth + 1, Q);
|
||||
// If it's known zero, our sign bit is also zero.
|
||||
if (KnownZero2.isNegative())
|
||||
KnownZero.setSignBit();
|
||||
|
||||
break;
|
||||
case Instruction::URem: {
|
||||
|
@ -644,13 +644,13 @@ Value *InstCombiner::SimplifyDemandedUseBits(Value *V, APInt DemandedMask,
|
||||
KnownOne |= ~LowBits;
|
||||
|
||||
assert(!(KnownZero & KnownOne) && "Bits known to be one AND zero?");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// The sign bit is the LHS's sign bit, except when the result of the
|
||||
// remainder is zero.
|
||||
if (DemandedMask.isNegative() && KnownZero.isNonNegative()) {
|
||||
APInt LHSKnownZero(BitWidth, 0), LHSKnownOne(BitWidth, 0);
|
||||
if (DemandedMask.isNegative()) {
|
||||
computeKnownBits(I->getOperand(0), LHSKnownZero, LHSKnownOne, Depth + 1,
|
||||
CxtI);
|
||||
// If it's known zero, our sign bit is also zero.
|
||||
|
Loading…
x
Reference in New Issue
Block a user