|
@@ -268,19 +268,20 @@ static Constant *ExtractConstantBytes(Constant *C, unsigned ByteStart,
|
|
ConstantInt *Amt = dyn_cast<ConstantInt>(CE->getOperand(1));
|
|
ConstantInt *Amt = dyn_cast<ConstantInt>(CE->getOperand(1));
|
|
if (!Amt)
|
|
if (!Amt)
|
|
return nullptr;
|
|
return nullptr;
|
|
- unsigned ShAmt = Amt->getZExtValue();
|
|
|
|
|
|
+ APInt ShAmt = Amt->getValue();
|
|
// Cannot analyze non-byte shifts.
|
|
// Cannot analyze non-byte shifts.
|
|
if ((ShAmt & 7) != 0)
|
|
if ((ShAmt & 7) != 0)
|
|
return nullptr;
|
|
return nullptr;
|
|
- ShAmt >>= 3;
|
|
|
|
|
|
+ ShAmt.lshrInPlace(3);
|
|
|
|
|
|
// If the extract is known to be all zeros, return zero.
|
|
// If the extract is known to be all zeros, return zero.
|
|
- if (ByteStart >= CSize-ShAmt)
|
|
|
|
- return Constant::getNullValue(IntegerType::get(CE->getContext(),
|
|
|
|
- ByteSize*8));
|
|
|
|
|
|
+ if (ShAmt.uge(CSize - ByteStart))
|
|
|
|
+ return Constant::getNullValue(
|
|
|
|
+ IntegerType::get(CE->getContext(), ByteSize * 8));
|
|
// If the extract is known to be fully in the input, extract it.
|
|
// If the extract is known to be fully in the input, extract it.
|
|
- if (ByteStart+ByteSize+ShAmt <= CSize)
|
|
|
|
- return ExtractConstantBytes(CE->getOperand(0), ByteStart+ShAmt, ByteSize);
|
|
|
|
|
|
+ if (ShAmt.ule(CSize - (ByteStart + ByteSize)))
|
|
|
|
+ return ExtractConstantBytes(CE->getOperand(0),
|
|
|
|
+ ByteStart + ShAmt.getZExtValue(), ByteSize);
|
|
|
|
|
|
// TODO: Handle the 'partially zero' case.
|
|
// TODO: Handle the 'partially zero' case.
|
|
return nullptr;
|
|
return nullptr;
|
|
@@ -290,19 +291,20 @@ static Constant *ExtractConstantBytes(Constant *C, unsigned ByteStart,
|
|
ConstantInt *Amt = dyn_cast<ConstantInt>(CE->getOperand(1));
|
|
ConstantInt *Amt = dyn_cast<ConstantInt>(CE->getOperand(1));
|
|
if (!Amt)
|
|
if (!Amt)
|
|
return nullptr;
|
|
return nullptr;
|
|
- unsigned ShAmt = Amt->getZExtValue();
|
|
|
|
|
|
+ APInt ShAmt = Amt->getValue();
|
|
// Cannot analyze non-byte shifts.
|
|
// Cannot analyze non-byte shifts.
|
|
if ((ShAmt & 7) != 0)
|
|
if ((ShAmt & 7) != 0)
|
|
return nullptr;
|
|
return nullptr;
|
|
- ShAmt >>= 3;
|
|
|
|
|
|
+ ShAmt.lshrInPlace(3);
|
|
|
|
|
|
// If the extract is known to be all zeros, return zero.
|
|
// If the extract is known to be all zeros, return zero.
|
|
- if (ByteStart+ByteSize <= ShAmt)
|
|
|
|
- return Constant::getNullValue(IntegerType::get(CE->getContext(),
|
|
|
|
- ByteSize*8));
|
|
|
|
|
|
+ if (ShAmt.uge(ByteStart + ByteSize))
|
|
|
|
+ return Constant::getNullValue(
|
|
|
|
+ IntegerType::get(CE->getContext(), ByteSize * 8));
|
|
// If the extract is known to be fully in the input, extract it.
|
|
// If the extract is known to be fully in the input, extract it.
|
|
- if (ByteStart >= ShAmt)
|
|
|
|
- return ExtractConstantBytes(CE->getOperand(0), ByteStart-ShAmt, ByteSize);
|
|
|
|
|
|
+ if (ShAmt.ule(ByteStart))
|
|
|
|
+ return ExtractConstantBytes(CE->getOperand(0),
|
|
|
|
+ ByteStart - ShAmt.getZExtValue(), ByteSize);
|
|
|
|
|
|
// TODO: Handle the 'partially zero' case.
|
|
// TODO: Handle the 'partially zero' case.
|
|
return nullptr;
|
|
return nullptr;
|