@@ -76,13 +76,13 @@ void DemandedBits::determineLiveOperandBits(
7676 computeKnownBits (V2, Known2, DL, &AC, UserI, &DT);
7777 }
7878 };
79- auto GetShiftedRange = [&](unsigned Min, unsigned Max, bool ShiftLeft) {
80- auto ShiftF = [& ](const APInt &Mask, unsigned ShiftAmnt) {
79+ auto GetShiftedRange = [&](uint64_t Min, uint64_t Max, bool ShiftLeft) {
80+ auto ShiftF = [ShiftLeft ](const APInt &Mask, unsigned ShiftAmnt) {
8181 return ShiftLeft ? Mask.shl (ShiftAmnt) : Mask.lshr (ShiftAmnt);
8282 };
8383 AB = APInt::getZero (BitWidth);
84- unsigned LoopRange = Max - Min;
85- auto Mask = AOut;
84+ uint64_t LoopRange = Max - Min;
85+ APInt Mask = AOut;
8686 for (unsigned ShiftAmnt = 1 ; ShiftAmnt <= LoopRange; ShiftAmnt <<= 1 ) {
8787 APInt Shifted = ShiftF (Mask, ShiftAmnt);
8888 Mask |= Shifted;
@@ -198,8 +198,8 @@ void DemandedBits::determineLiveOperandBits(
198198 AB |= APInt::getHighBitsSet (BitWidth, ShiftAmt);
199199 } else {
200200 ComputeKnownBits (BitWidth, UserI->getOperand (1 ), nullptr );
201- unsigned Min = Known.getMinValue ().getLimitedValue (BitWidth - 1 );
202- unsigned Max = Known.getMaxValue ().getLimitedValue (BitWidth - 1 );
201+ uint64_t Min = Known.getMinValue ().getLimitedValue (BitWidth - 1 );
202+ uint64_t Max = Known.getMaxValue ().getLimitedValue (BitWidth - 1 );
203203 // similar to Lshr case
204204 GetShiftedRange (Min, Max, /* ShiftLeft=*/ false );
205205 const auto *S = cast<ShlOperator>(UserI);
@@ -223,8 +223,8 @@ void DemandedBits::determineLiveOperandBits(
223223 AB |= APInt::getLowBitsSet (BitWidth, ShiftAmt);
224224 } else {
225225 ComputeKnownBits (BitWidth, UserI->getOperand (1 ), nullptr );
226- unsigned Min = Known.getMinValue ().getLimitedValue (BitWidth - 1 );
227- unsigned Max = Known.getMaxValue ().getLimitedValue (BitWidth - 1 );
226+ uint64_t Min = Known.getMinValue ().getLimitedValue (BitWidth - 1 );
227+ uint64_t Max = Known.getMaxValue ().getLimitedValue (BitWidth - 1 );
228228 // Suppose AOut == 0b0000 0001
229229 // [min, max] = [1, 3]
230230 // iteration 1 shift by 1 mask is 0b0000 0011
@@ -261,19 +261,19 @@ void DemandedBits::determineLiveOperandBits(
261261 AB |= APInt::getLowBitsSet (BitWidth, ShiftAmt);
262262 } else {
263263 ComputeKnownBits (BitWidth, UserI->getOperand (1 ), nullptr );
264- unsigned Min = Known.getMinValue ().getLimitedValue (BitWidth - 1 );
265- unsigned Max = Known.getMaxValue ().getLimitedValue (BitWidth - 1 );
264+ uint64_t Min = Known.getMinValue ().getLimitedValue (BitWidth - 1 );
265+ uint64_t Max = Known.getMaxValue ().getLimitedValue (BitWidth - 1 );
266266 GetShiftedRange (Min, Max, /* ShiftLeft=*/ true );
267- if (Max) {
267+ if (Max &&
268+ (AOut & APInt::getHighBitsSet (BitWidth, Max)).getBoolValue ()) {
268269 // Suppose AOut = 0011 1100
269270 // [min, max] = [1, 3]
270271 // ShiftAmount = 1 : Mask is 1000 0000
271272 // ShiftAmount = 2 : Mask is 1100 0000
272273 // ShiftAmount = 3 : Mask is 1110 0000
273274 // The Mask with Max covers every case in [min, max],
274275 // so we are done
275- if ((AOut & APInt::getHighBitsSet (BitWidth, Max)).getBoolValue ())
276- AB.setSignBit ();
276+ AB.setSignBit ();
277277 }
278278 // If the shift is exact, then the low bits are not dead
279279 // (they must be zero).
0 commit comments