mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-26 10:29:36 +00:00
PR5207: Change APInt methods trunc(), sext(), zext(), sextOrTrunc() and
zextOrTrunc(), and APSInt methods extend(), extOrTrunc() and new method trunc(), to be const and to return a new value instead of modifying the object in place. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@121120 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
0ea112f104
commit
40f8f6264d
@ -342,9 +342,7 @@ public:
|
||||
|
||||
if (isSingleWord())
|
||||
return isUIntN(N, VAL);
|
||||
APInt Tmp(N, getNumWords(), pVal);
|
||||
Tmp.zext(getBitWidth());
|
||||
return Tmp == (*this);
|
||||
return APInt(N, getNumWords(), pVal).zext(getBitWidth()) == (*this);
|
||||
}
|
||||
|
||||
/// @brief Check if this APInt has an N-bits signed integer value.
|
||||
@ -1013,30 +1011,30 @@ public:
|
||||
/// Truncate the APInt to a specified width. It is an error to specify a width
|
||||
/// that is greater than or equal to the current width.
|
||||
/// @brief Truncate to new width.
|
||||
APInt &trunc(unsigned width);
|
||||
APInt trunc(unsigned width) const;
|
||||
|
||||
/// This operation sign extends the APInt to a new width. If the high order
|
||||
/// bit is set, the fill on the left will be done with 1 bits, otherwise zero.
|
||||
/// It is an error to specify a width that is less than or equal to the
|
||||
/// current width.
|
||||
/// @brief Sign extend to a new width.
|
||||
APInt &sext(unsigned width);
|
||||
APInt sext(unsigned width) const;
|
||||
|
||||
/// This operation zero extends the APInt to a new width. The high order bits
|
||||
/// are filled with 0 bits. It is an error to specify a width that is less
|
||||
/// than or equal to the current width.
|
||||
/// @brief Zero extend to a new width.
|
||||
APInt &zext(unsigned width);
|
||||
APInt zext(unsigned width) const;
|
||||
|
||||
/// Make this APInt have the bit width given by \p width. The value is sign
|
||||
/// extended, truncated, or left alone to make it that width.
|
||||
/// @brief Sign extend or truncate to width
|
||||
APInt &sextOrTrunc(unsigned width);
|
||||
APInt sextOrTrunc(unsigned width) const;
|
||||
|
||||
/// Make this APInt have the bit width given by \p width. The value is zero
|
||||
/// extended, truncated, or left alone to make it that width.
|
||||
/// @brief Zero extend or truncate to width
|
||||
APInt &zextOrTrunc(unsigned width);
|
||||
APInt zextOrTrunc(unsigned width) const;
|
||||
|
||||
/// @}
|
||||
/// @name Bit Manipulation Operators
|
||||
|
@ -68,20 +68,22 @@ public:
|
||||
}
|
||||
using APInt::toString;
|
||||
|
||||
APSInt& extend(uint32_t width) {
|
||||
if (IsUnsigned)
|
||||
zext(width);
|
||||
else
|
||||
sext(width);
|
||||
return *this;
|
||||
APSInt trunc(uint32_t width) const {
|
||||
return APSInt(APInt::trunc(width), IsUnsigned);
|
||||
}
|
||||
|
||||
APSInt& extOrTrunc(uint32_t width) {
|
||||
APSInt extend(uint32_t width) const {
|
||||
if (IsUnsigned)
|
||||
return APSInt(zext(width), IsUnsigned);
|
||||
else
|
||||
return APSInt(sext(width), IsUnsigned);
|
||||
}
|
||||
|
||||
APSInt extOrTrunc(uint32_t width) const {
|
||||
if (IsUnsigned)
|
||||
zextOrTrunc(width);
|
||||
return APSInt(zextOrTrunc(width), IsUnsigned);
|
||||
else
|
||||
sextOrTrunc(width);
|
||||
return *this;
|
||||
return APSInt(sextOrTrunc(width), IsUnsigned);
|
||||
}
|
||||
|
||||
const APSInt &operator%=(const APSInt &RHS) {
|
||||
|
@ -206,14 +206,14 @@ static Value *GetLinearExpression(Value *V, APInt &Scale, APInt &Offset,
|
||||
Value *CastOp = cast<CastInst>(V)->getOperand(0);
|
||||
unsigned OldWidth = Scale.getBitWidth();
|
||||
unsigned SmallWidth = CastOp->getType()->getPrimitiveSizeInBits();
|
||||
Scale.trunc(SmallWidth);
|
||||
Offset.trunc(SmallWidth);
|
||||
Scale = Scale.trunc(SmallWidth);
|
||||
Offset = Offset.trunc(SmallWidth);
|
||||
Extension = isa<SExtInst>(V) ? EK_SignExt : EK_ZeroExt;
|
||||
|
||||
Value *Result = GetLinearExpression(CastOp, Scale, Offset, Extension,
|
||||
TD, Depth+1);
|
||||
Scale.zext(OldWidth);
|
||||
Offset.zext(OldWidth);
|
||||
Scale = Scale.zext(OldWidth);
|
||||
Offset = Offset.zext(OldWidth);
|
||||
|
||||
return Result;
|
||||
}
|
||||
|
@ -610,10 +610,8 @@ static Constant *SymbolicallyEvaluateGEP(Constant *const *Ops, unsigned NumOps,
|
||||
APInt BasePtr(BitWidth, 0);
|
||||
if (ConstantExpr *CE = dyn_cast<ConstantExpr>(Ptr))
|
||||
if (CE->getOpcode() == Instruction::IntToPtr)
|
||||
if (ConstantInt *Base = dyn_cast<ConstantInt>(CE->getOperand(0))) {
|
||||
BasePtr = Base->getValue();
|
||||
BasePtr.zextOrTrunc(BitWidth);
|
||||
}
|
||||
if (ConstantInt *Base = dyn_cast<ConstantInt>(CE->getOperand(0)))
|
||||
BasePtr = Base->getValue().zextOrTrunc(BitWidth);
|
||||
if (Ptr->isNullValue() || BasePtr != 0) {
|
||||
Constant *C = ConstantInt::get(Ptr->getContext(), Offset+BasePtr);
|
||||
return ConstantExpr::getIntToPtr(C, ResultTy);
|
||||
|
@ -3367,8 +3367,8 @@ const SCEV *ScalarEvolution::createSCEV(Value *V) {
|
||||
// If C is a single bit, it may be in the sign-bit position
|
||||
// before the zero-extend. In this case, represent the xor
|
||||
// using an add, which is equivalent, and re-apply the zext.
|
||||
APInt Trunc = APInt(CI->getValue()).trunc(Z0TySize);
|
||||
if (APInt(Trunc).zext(getTypeSizeInBits(UTy)) == CI->getValue() &&
|
||||
APInt Trunc = CI->getValue().trunc(Z0TySize);
|
||||
if (Trunc.zext(getTypeSizeInBits(UTy)) == CI->getValue() &&
|
||||
Trunc.isSignBit())
|
||||
return getZeroExtendExpr(getAddExpr(Z0, getConstant(Trunc)),
|
||||
UTy);
|
||||
|
@ -255,14 +255,13 @@ void llvm::ComputeMaskedBits(Value *V, const APInt &Mask,
|
||||
else
|
||||
SrcBitWidth = SrcTy->getScalarSizeInBits();
|
||||
|
||||
APInt MaskIn(Mask);
|
||||
MaskIn.zextOrTrunc(SrcBitWidth);
|
||||
KnownZero.zextOrTrunc(SrcBitWidth);
|
||||
KnownOne.zextOrTrunc(SrcBitWidth);
|
||||
APInt MaskIn = Mask.zextOrTrunc(SrcBitWidth);
|
||||
KnownZero = KnownZero.zextOrTrunc(SrcBitWidth);
|
||||
KnownOne = KnownOne.zextOrTrunc(SrcBitWidth);
|
||||
ComputeMaskedBits(I->getOperand(0), MaskIn, KnownZero, KnownOne, TD,
|
||||
Depth+1);
|
||||
KnownZero.zextOrTrunc(BitWidth);
|
||||
KnownOne.zextOrTrunc(BitWidth);
|
||||
KnownZero = KnownZero.zextOrTrunc(BitWidth);
|
||||
KnownOne = KnownOne.zextOrTrunc(BitWidth);
|
||||
// Any top bits are known to be zero.
|
||||
if (BitWidth > SrcBitWidth)
|
||||
KnownZero |= APInt::getHighBitsSet(BitWidth, BitWidth - SrcBitWidth);
|
||||
@ -284,15 +283,14 @@ void llvm::ComputeMaskedBits(Value *V, const APInt &Mask,
|
||||
// Compute the bits in the result that are not present in the input.
|
||||
unsigned SrcBitWidth = I->getOperand(0)->getType()->getScalarSizeInBits();
|
||||
|
||||
APInt MaskIn(Mask);
|
||||
MaskIn.trunc(SrcBitWidth);
|
||||
KnownZero.trunc(SrcBitWidth);
|
||||
KnownOne.trunc(SrcBitWidth);
|
||||
APInt MaskIn = Mask.trunc(SrcBitWidth);
|
||||
KnownZero = KnownZero.trunc(SrcBitWidth);
|
||||
KnownOne = KnownOne.trunc(SrcBitWidth);
|
||||
ComputeMaskedBits(I->getOperand(0), MaskIn, KnownZero, KnownOne, TD,
|
||||
Depth+1);
|
||||
assert((KnownZero & KnownOne) == 0 && "Bits known to be one AND zero?");
|
||||
KnownZero.zext(BitWidth);
|
||||
KnownOne.zext(BitWidth);
|
||||
KnownZero = KnownZero.zext(BitWidth);
|
||||
KnownOne = KnownOne.zext(BitWidth);
|
||||
|
||||
// If the sign bit of the input is known set or clear, then we know the
|
||||
// top bits of the result.
|
||||
|
@ -682,7 +682,7 @@ lltok::Kind LLLexer::LexIdentifier() {
|
||||
APInt Tmp(bits, StringRef(TokStart+3, len), 16);
|
||||
uint32_t activeBits = Tmp.getActiveBits();
|
||||
if (activeBits > 0 && activeBits < bits)
|
||||
Tmp.trunc(activeBits);
|
||||
Tmp = Tmp.trunc(activeBits);
|
||||
APSIntVal = APSInt(Tmp, TokStart[0] == 'u');
|
||||
return lltok::APSInt;
|
||||
}
|
||||
@ -809,12 +809,12 @@ lltok::Kind LLLexer::LexDigitOrNegative() {
|
||||
if (TokStart[0] == '-') {
|
||||
uint32_t minBits = Tmp.getMinSignedBits();
|
||||
if (minBits > 0 && minBits < numBits)
|
||||
Tmp.trunc(minBits);
|
||||
Tmp = Tmp.trunc(minBits);
|
||||
APSIntVal = APSInt(Tmp, false);
|
||||
} else {
|
||||
uint32_t activeBits = Tmp.getActiveBits();
|
||||
if (activeBits > 0 && activeBits < numBits)
|
||||
Tmp.trunc(activeBits);
|
||||
Tmp = Tmp.trunc(activeBits);
|
||||
APSIntVal = APSInt(Tmp, true);
|
||||
}
|
||||
return lltok::APSInt;
|
||||
|
@ -2575,7 +2575,7 @@ bool LLParser::ConvertValIDToValue(const Type *Ty, ValID &ID, Value *&V,
|
||||
case ValID::t_APSInt:
|
||||
if (!Ty->isIntegerTy())
|
||||
return Error(ID.Loc, "integer constant must have integer type");
|
||||
ID.APSIntVal.extOrTrunc(Ty->getPrimitiveSizeInBits());
|
||||
ID.APSIntVal = ID.APSIntVal.extOrTrunc(Ty->getPrimitiveSizeInBits());
|
||||
V = ConstantInt::get(Context, ID.APSIntVal);
|
||||
return false;
|
||||
case ValID::t_APFloat:
|
||||
|
@ -2133,7 +2133,7 @@ SDValue DAGCombiner::visitAND(SDNode *N) {
|
||||
if (N1C && N0.getOpcode() == ISD::ANY_EXTEND) {
|
||||
SDValue N0Op0 = N0.getOperand(0);
|
||||
APInt Mask = ~N1C->getAPIntValue();
|
||||
Mask.trunc(N0Op0.getValueSizeInBits());
|
||||
Mask = Mask.trunc(N0Op0.getValueSizeInBits());
|
||||
if (DAG.MaskedValueIsZero(N0Op0, Mask)) {
|
||||
SDValue Zext = DAG.getNode(ISD::ZERO_EXTEND, N->getDebugLoc(),
|
||||
N0.getValueType(), N0Op0);
|
||||
@ -2866,7 +2866,7 @@ SDValue DAGCombiner::visitSHL(SDNode *N) {
|
||||
EVT TruncVT = N1.getValueType();
|
||||
SDValue N100 = N1.getOperand(0).getOperand(0);
|
||||
APInt TruncC = N101C->getAPIntValue();
|
||||
TruncC.trunc(TruncVT.getSizeInBits());
|
||||
TruncC = TruncC.trunc(TruncVT.getSizeInBits());
|
||||
return DAG.getNode(ISD::SHL, N->getDebugLoc(), VT, N0,
|
||||
DAG.getNode(ISD::AND, N->getDebugLoc(), TruncVT,
|
||||
DAG.getNode(ISD::TRUNCATE,
|
||||
@ -3022,7 +3022,7 @@ SDValue DAGCombiner::visitSRA(SDNode *N) {
|
||||
EVT TruncVT = N1.getValueType();
|
||||
SDValue N100 = N1.getOperand(0).getOperand(0);
|
||||
APInt TruncC = N101C->getAPIntValue();
|
||||
TruncC.trunc(TruncVT.getScalarType().getSizeInBits());
|
||||
TruncC = TruncC.trunc(TruncVT.getScalarType().getSizeInBits());
|
||||
return DAG.getNode(ISD::SRA, N->getDebugLoc(), VT, N0,
|
||||
DAG.getNode(ISD::AND, N->getDebugLoc(),
|
||||
TruncVT,
|
||||
@ -3163,7 +3163,7 @@ SDValue DAGCombiner::visitSRL(SDNode *N) {
|
||||
EVT TruncVT = N1.getValueType();
|
||||
SDValue N100 = N1.getOperand(0).getOperand(0);
|
||||
APInt TruncC = N101C->getAPIntValue();
|
||||
TruncC.trunc(TruncVT.getSizeInBits());
|
||||
TruncC = TruncC.trunc(TruncVT.getSizeInBits());
|
||||
return DAG.getNode(ISD::SRL, N->getDebugLoc(), VT, N0,
|
||||
DAG.getNode(ISD::AND, N->getDebugLoc(),
|
||||
TruncVT,
|
||||
@ -3706,7 +3706,7 @@ SDValue DAGCombiner::visitZERO_EXTEND(SDNode *N) {
|
||||
X = DAG.getNode(ISD::TRUNCATE, X.getDebugLoc(), VT, X);
|
||||
}
|
||||
APInt Mask = cast<ConstantSDNode>(N0.getOperand(1))->getAPIntValue();
|
||||
Mask.zext(VT.getSizeInBits());
|
||||
Mask = Mask.zext(VT.getSizeInBits());
|
||||
return DAG.getNode(ISD::AND, N->getDebugLoc(), VT,
|
||||
X, DAG.getConstant(Mask, VT));
|
||||
}
|
||||
@ -3907,7 +3907,7 @@ SDValue DAGCombiner::visitANY_EXTEND(SDNode *N) {
|
||||
X = DAG.getNode(ISD::TRUNCATE, N->getDebugLoc(), VT, X);
|
||||
}
|
||||
APInt Mask = cast<ConstantSDNode>(N0.getOperand(1))->getAPIntValue();
|
||||
Mask.zext(VT.getSizeInBits());
|
||||
Mask = Mask.zext(VT.getSizeInBits());
|
||||
return DAG.getNode(ISD::AND, N->getDebugLoc(), VT,
|
||||
X, DAG.getConstant(Mask, VT));
|
||||
}
|
||||
@ -4614,7 +4614,7 @@ ConstantFoldBITCASTofBUILD_VECTOR(SDNode *BV, EVT DstEltVT) {
|
||||
if (Op.getOpcode() == ISD::UNDEF) continue;
|
||||
EltIsUndef = false;
|
||||
|
||||
NewBits |= APInt(cast<ConstantSDNode>(Op)->getAPIntValue()).
|
||||
NewBits |= cast<ConstantSDNode>(Op)->getAPIntValue().
|
||||
zextOrTrunc(SrcBitSize).zext(DstBitSize);
|
||||
}
|
||||
|
||||
@ -4644,13 +4644,13 @@ ConstantFoldBITCASTofBUILD_VECTOR(SDNode *BV, EVT DstEltVT) {
|
||||
continue;
|
||||
}
|
||||
|
||||
APInt OpVal = APInt(cast<ConstantSDNode>(BV->getOperand(i))->
|
||||
getAPIntValue()).zextOrTrunc(SrcBitSize);
|
||||
APInt OpVal = cast<ConstantSDNode>(BV->getOperand(i))->
|
||||
getAPIntValue().zextOrTrunc(SrcBitSize);
|
||||
|
||||
for (unsigned j = 0; j != NumOutputsPerInput; ++j) {
|
||||
APInt ThisVal = APInt(OpVal).trunc(DstBitSize);
|
||||
APInt ThisVal = OpVal.trunc(DstBitSize);
|
||||
Ops.push_back(DAG.getConstant(ThisVal, DstEltVT));
|
||||
if (isS2V && i == 0 && j == 0 && APInt(ThisVal).zext(SrcBitSize) == OpVal)
|
||||
if (isS2V && i == 0 && j == 0 && ThisVal.zext(SrcBitSize) == OpVal)
|
||||
// Simply turn this into a SCALAR_TO_VECTOR of the new type.
|
||||
return DAG.getNode(ISD::SCALAR_TO_VECTOR, BV->getDebugLoc(), VT,
|
||||
Ops[0]);
|
||||
|
@ -749,7 +749,7 @@ SDValue SelectionDAGLegalize::OptimizeFloatStore(StoreSDNode* ST) {
|
||||
// stores. If the target supports neither 32- nor 64-bits, this
|
||||
// xform is certainly not worth it.
|
||||
const APInt &IntVal =CFP->getValueAPF().bitcastToAPInt();
|
||||
SDValue Lo = DAG.getConstant(APInt(IntVal).trunc(32), MVT::i32);
|
||||
SDValue Lo = DAG.getConstant(IntVal.trunc(32), MVT::i32);
|
||||
SDValue Hi = DAG.getConstant(IntVal.lshr(32).trunc(32), MVT::i32);
|
||||
if (TLI.isBigEndian()) std::swap(Lo, Hi);
|
||||
|
||||
|
@ -1435,7 +1435,7 @@ void DAGTypeLegalizer::ExpandIntRes_Constant(SDNode *N,
|
||||
EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0));
|
||||
unsigned NBitWidth = NVT.getSizeInBits();
|
||||
const APInt &Cst = cast<ConstantSDNode>(N)->getAPIntValue();
|
||||
Lo = DAG.getConstant(APInt(Cst).trunc(NBitWidth), NVT);
|
||||
Lo = DAG.getConstant(Cst.trunc(NBitWidth), NVT);
|
||||
Hi = DAG.getConstant(Cst.lshr(NBitWidth).trunc(NBitWidth), NVT);
|
||||
}
|
||||
|
||||
|
@ -1806,7 +1806,7 @@ void SelectionDAG::ComputeMaskedBits(SDValue Op, const APInt &Mask,
|
||||
|
||||
// If the sign extended bits are demanded, we know that the sign
|
||||
// bit is demanded.
|
||||
InSignBit.zext(BitWidth);
|
||||
InSignBit = InSignBit.zext(BitWidth);
|
||||
if (NewBits.getBoolValue())
|
||||
InputDemandedBits |= InSignBit;
|
||||
|
||||
@ -1849,13 +1849,12 @@ void SelectionDAG::ComputeMaskedBits(SDValue Op, const APInt &Mask,
|
||||
EVT InVT = Op.getOperand(0).getValueType();
|
||||
unsigned InBits = InVT.getScalarType().getSizeInBits();
|
||||
APInt NewBits = APInt::getHighBitsSet(BitWidth, BitWidth - InBits) & Mask;
|
||||
APInt InMask = Mask;
|
||||
InMask.trunc(InBits);
|
||||
KnownZero.trunc(InBits);
|
||||
KnownOne.trunc(InBits);
|
||||
APInt InMask = Mask.trunc(InBits);
|
||||
KnownZero = KnownZero.trunc(InBits);
|
||||
KnownOne = KnownOne.trunc(InBits);
|
||||
ComputeMaskedBits(Op.getOperand(0), InMask, KnownZero, KnownOne, Depth+1);
|
||||
KnownZero.zext(BitWidth);
|
||||
KnownOne.zext(BitWidth);
|
||||
KnownZero = KnownZero.zext(BitWidth);
|
||||
KnownOne = KnownOne.zext(BitWidth);
|
||||
KnownZero |= NewBits;
|
||||
return;
|
||||
}
|
||||
@ -1864,16 +1863,15 @@ void SelectionDAG::ComputeMaskedBits(SDValue Op, const APInt &Mask,
|
||||
unsigned InBits = InVT.getScalarType().getSizeInBits();
|
||||
APInt InSignBit = APInt::getSignBit(InBits);
|
||||
APInt NewBits = APInt::getHighBitsSet(BitWidth, BitWidth - InBits) & Mask;
|
||||
APInt InMask = Mask;
|
||||
InMask.trunc(InBits);
|
||||
APInt InMask = Mask.trunc(InBits);
|
||||
|
||||
// If any of the sign extended bits are demanded, we know that the sign
|
||||
// bit is demanded. Temporarily set this bit in the mask for our callee.
|
||||
if (NewBits.getBoolValue())
|
||||
InMask |= InSignBit;
|
||||
|
||||
KnownZero.trunc(InBits);
|
||||
KnownOne.trunc(InBits);
|
||||
KnownZero = KnownZero.trunc(InBits);
|
||||
KnownOne = KnownOne.trunc(InBits);
|
||||
ComputeMaskedBits(Op.getOperand(0), InMask, KnownZero, KnownOne, Depth+1);
|
||||
|
||||
// Note if the sign bit is known to be zero or one.
|
||||
@ -1885,13 +1883,12 @@ void SelectionDAG::ComputeMaskedBits(SDValue Op, const APInt &Mask,
|
||||
// If the sign bit wasn't actually demanded by our caller, we don't
|
||||
// want it set in the KnownZero and KnownOne result values. Reset the
|
||||
// mask and reapply it to the result values.
|
||||
InMask = Mask;
|
||||
InMask.trunc(InBits);
|
||||
InMask = Mask.trunc(InBits);
|
||||
KnownZero &= InMask;
|
||||
KnownOne &= InMask;
|
||||
|
||||
KnownZero.zext(BitWidth);
|
||||
KnownOne.zext(BitWidth);
|
||||
KnownZero = KnownZero.zext(BitWidth);
|
||||
KnownOne = KnownOne.zext(BitWidth);
|
||||
|
||||
// If the sign bit is known zero or one, the top bits match.
|
||||
if (SignBitKnownZero)
|
||||
@ -1903,26 +1900,24 @@ void SelectionDAG::ComputeMaskedBits(SDValue Op, const APInt &Mask,
|
||||
case ISD::ANY_EXTEND: {
|
||||
EVT InVT = Op.getOperand(0).getValueType();
|
||||
unsigned InBits = InVT.getScalarType().getSizeInBits();
|
||||
APInt InMask = Mask;
|
||||
InMask.trunc(InBits);
|
||||
KnownZero.trunc(InBits);
|
||||
KnownOne.trunc(InBits);
|
||||
APInt InMask = Mask.trunc(InBits);
|
||||
KnownZero = KnownZero.trunc(InBits);
|
||||
KnownOne = KnownOne.trunc(InBits);
|
||||
ComputeMaskedBits(Op.getOperand(0), InMask, KnownZero, KnownOne, Depth+1);
|
||||
KnownZero.zext(BitWidth);
|
||||
KnownOne.zext(BitWidth);
|
||||
KnownZero = KnownZero.zext(BitWidth);
|
||||
KnownOne = KnownOne.zext(BitWidth);
|
||||
return;
|
||||
}
|
||||
case ISD::TRUNCATE: {
|
||||
EVT InVT = Op.getOperand(0).getValueType();
|
||||
unsigned InBits = InVT.getScalarType().getSizeInBits();
|
||||
APInt InMask = Mask;
|
||||
InMask.zext(InBits);
|
||||
KnownZero.zext(InBits);
|
||||
KnownOne.zext(InBits);
|
||||
APInt InMask = Mask.zext(InBits);
|
||||
KnownZero = KnownZero.zext(InBits);
|
||||
KnownOne = KnownOne.zext(InBits);
|
||||
ComputeMaskedBits(Op.getOperand(0), InMask, KnownZero, KnownOne, Depth+1);
|
||||
assert((KnownZero & KnownOne) == 0 && "Bits known to be one AND zero?");
|
||||
KnownZero.trunc(BitWidth);
|
||||
KnownOne.trunc(BitWidth);
|
||||
KnownZero = KnownZero.trunc(BitWidth);
|
||||
KnownOne = KnownOne.trunc(BitWidth);
|
||||
break;
|
||||
}
|
||||
case ISD::AssertZext: {
|
||||
@ -2349,11 +2344,11 @@ SDValue SelectionDAG::getNode(unsigned Opcode, DebugLoc DL,
|
||||
switch (Opcode) {
|
||||
default: break;
|
||||
case ISD::SIGN_EXTEND:
|
||||
return getConstant(APInt(Val).sextOrTrunc(VT.getSizeInBits()), VT);
|
||||
return getConstant(Val.sextOrTrunc(VT.getSizeInBits()), VT);
|
||||
case ISD::ANY_EXTEND:
|
||||
case ISD::ZERO_EXTEND:
|
||||
case ISD::TRUNCATE:
|
||||
return getConstant(APInt(Val).zextOrTrunc(VT.getSizeInBits()), VT);
|
||||
return getConstant(Val.zextOrTrunc(VT.getSizeInBits()), VT);
|
||||
case ISD::UINT_TO_FP:
|
||||
case ISD::SINT_TO_FP: {
|
||||
// No compile time operations on ppcf128.
|
||||
@ -6418,7 +6413,7 @@ bool BuildVectorSDNode::isConstantSplat(APInt &SplatValue,
|
||||
if (OpVal.getOpcode() == ISD::UNDEF)
|
||||
SplatUndef |= APInt::getBitsSet(sz, BitPos, BitPos + EltBitSize);
|
||||
else if (ConstantSDNode *CN = dyn_cast<ConstantSDNode>(OpVal))
|
||||
SplatValue |= APInt(CN->getAPIntValue()).zextOrTrunc(EltBitSize).
|
||||
SplatValue |= CN->getAPIntValue().zextOrTrunc(EltBitSize).
|
||||
zextOrTrunc(sz) << BitPos;
|
||||
else if (ConstantFPSDNode *CN = dyn_cast<ConstantFPSDNode>(OpVal))
|
||||
SplatValue |= CN->getValueAPF().bitcastToAPInt().zextOrTrunc(sz) <<BitPos;
|
||||
@ -6433,10 +6428,10 @@ bool BuildVectorSDNode::isConstantSplat(APInt &SplatValue,
|
||||
while (sz > 8) {
|
||||
|
||||
unsigned HalfSize = sz / 2;
|
||||
APInt HighValue = APInt(SplatValue).lshr(HalfSize).trunc(HalfSize);
|
||||
APInt LowValue = APInt(SplatValue).trunc(HalfSize);
|
||||
APInt HighUndef = APInt(SplatUndef).lshr(HalfSize).trunc(HalfSize);
|
||||
APInt LowUndef = APInt(SplatUndef).trunc(HalfSize);
|
||||
APInt HighValue = SplatValue.lshr(HalfSize).trunc(HalfSize);
|
||||
APInt LowValue = SplatValue.trunc(HalfSize);
|
||||
APInt HighUndef = SplatUndef.lshr(HalfSize).trunc(HalfSize);
|
||||
APInt LowUndef = SplatUndef.trunc(HalfSize);
|
||||
|
||||
// If the two halves do not match (ignoring undef bits), stop here.
|
||||
if ((HighValue & ~LowUndef) != (LowValue & ~HighUndef) ||
|
||||
|
@ -1866,9 +1866,8 @@ static inline bool areJTsAllowed(const TargetLowering &TLI) {
|
||||
}
|
||||
|
||||
static APInt ComputeRange(const APInt &First, const APInt &Last) {
|
||||
APInt LastExt(Last), FirstExt(First);
|
||||
uint32_t BitWidth = std::max(Last.getBitWidth(), First.getBitWidth()) + 1;
|
||||
LastExt.sext(BitWidth); FirstExt.sext(BitWidth);
|
||||
APInt LastExt = Last.sext(BitWidth), FirstExt = First.sext(BitWidth);
|
||||
return (LastExt - FirstExt + 1ULL);
|
||||
}
|
||||
|
||||
|
@ -1520,8 +1520,8 @@ bool TargetLowering::SimplifyDemandedBits(SDValue Op,
|
||||
if ((NewBits & NewMask) == 0)
|
||||
return TLO.CombineTo(Op, Op.getOperand(0));
|
||||
|
||||
APInt InSignBit = APInt::getSignBit(EVT.getScalarType().getSizeInBits());
|
||||
InSignBit.zext(BitWidth);
|
||||
APInt InSignBit =
|
||||
APInt::getSignBit(EVT.getScalarType().getSizeInBits()).zext(BitWidth);
|
||||
APInt InputDemandedBits =
|
||||
APInt::getLowBitsSet(BitWidth,
|
||||
EVT.getScalarType().getSizeInBits()) &
|
||||
@ -1556,8 +1556,7 @@ bool TargetLowering::SimplifyDemandedBits(SDValue Op,
|
||||
case ISD::ZERO_EXTEND: {
|
||||
unsigned OperandBitWidth =
|
||||
Op.getOperand(0).getValueType().getScalarType().getSizeInBits();
|
||||
APInt InMask = NewMask;
|
||||
InMask.trunc(OperandBitWidth);
|
||||
APInt InMask = NewMask.trunc(OperandBitWidth);
|
||||
|
||||
// If none of the top bits are demanded, convert this into an any_extend.
|
||||
APInt NewBits =
|
||||
@ -1571,8 +1570,8 @@ bool TargetLowering::SimplifyDemandedBits(SDValue Op,
|
||||
KnownZero, KnownOne, TLO, Depth+1))
|
||||
return true;
|
||||
assert((KnownZero & KnownOne) == 0 && "Bits known to be one AND zero?");
|
||||
KnownZero.zext(BitWidth);
|
||||
KnownOne.zext(BitWidth);
|
||||
KnownZero = KnownZero.zext(BitWidth);
|
||||
KnownOne = KnownOne.zext(BitWidth);
|
||||
KnownZero |= NewBits;
|
||||
break;
|
||||
}
|
||||
@ -1593,13 +1592,13 @@ bool TargetLowering::SimplifyDemandedBits(SDValue Op,
|
||||
// bit is demanded.
|
||||
APInt InDemandedBits = InMask & NewMask;
|
||||
InDemandedBits |= InSignBit;
|
||||
InDemandedBits.trunc(InBits);
|
||||
InDemandedBits = InDemandedBits.trunc(InBits);
|
||||
|
||||
if (SimplifyDemandedBits(Op.getOperand(0), InDemandedBits, KnownZero,
|
||||
KnownOne, TLO, Depth+1))
|
||||
return true;
|
||||
KnownZero.zext(BitWidth);
|
||||
KnownOne.zext(BitWidth);
|
||||
KnownZero = KnownZero.zext(BitWidth);
|
||||
KnownOne = KnownOne.zext(BitWidth);
|
||||
|
||||
// If the sign bit is known zero, convert this to a zero extend.
|
||||
if (KnownZero.intersects(InSignBit))
|
||||
@ -1620,14 +1619,13 @@ bool TargetLowering::SimplifyDemandedBits(SDValue Op,
|
||||
case ISD::ANY_EXTEND: {
|
||||
unsigned OperandBitWidth =
|
||||
Op.getOperand(0).getValueType().getScalarType().getSizeInBits();
|
||||
APInt InMask = NewMask;
|
||||
InMask.trunc(OperandBitWidth);
|
||||
APInt InMask = NewMask.trunc(OperandBitWidth);
|
||||
if (SimplifyDemandedBits(Op.getOperand(0), InMask,
|
||||
KnownZero, KnownOne, TLO, Depth+1))
|
||||
return true;
|
||||
assert((KnownZero & KnownOne) == 0 && "Bits known to be one AND zero?");
|
||||
KnownZero.zext(BitWidth);
|
||||
KnownOne.zext(BitWidth);
|
||||
KnownZero = KnownZero.zext(BitWidth);
|
||||
KnownOne = KnownOne.zext(BitWidth);
|
||||
break;
|
||||
}
|
||||
case ISD::TRUNCATE: {
|
||||
@ -1635,13 +1633,12 @@ bool TargetLowering::SimplifyDemandedBits(SDValue Op,
|
||||
// zero/one bits live out.
|
||||
unsigned OperandBitWidth =
|
||||
Op.getOperand(0).getValueType().getScalarType().getSizeInBits();
|
||||
APInt TruncMask = NewMask;
|
||||
TruncMask.zext(OperandBitWidth);
|
||||
APInt TruncMask = NewMask.zext(OperandBitWidth);
|
||||
if (SimplifyDemandedBits(Op.getOperand(0), TruncMask,
|
||||
KnownZero, KnownOne, TLO, Depth+1))
|
||||
return true;
|
||||
KnownZero.trunc(BitWidth);
|
||||
KnownOne.trunc(BitWidth);
|
||||
KnownZero = KnownZero.trunc(BitWidth);
|
||||
KnownOne = KnownOne.trunc(BitWidth);
|
||||
|
||||
// If the input is only used by this truncate, see if we can shrink it based
|
||||
// on the known demanded bits.
|
||||
@ -1662,8 +1659,7 @@ bool TargetLowering::SimplifyDemandedBits(SDValue Op,
|
||||
break;
|
||||
APInt HighBits = APInt::getHighBitsSet(OperandBitWidth,
|
||||
OperandBitWidth - BitWidth);
|
||||
HighBits = HighBits.lshr(ShAmt->getZExtValue());
|
||||
HighBits.trunc(BitWidth);
|
||||
HighBits = HighBits.lshr(ShAmt->getZExtValue()).trunc(BitWidth);
|
||||
|
||||
if (ShAmt->getZExtValue() < BitWidth && !(HighBits & NewMask)) {
|
||||
// None of the shifted in bits are needed. Add a truncate of the
|
||||
@ -1969,7 +1965,7 @@ TargetLowering::SimplifySetCC(EVT VT, SDValue N0, SDValue N1,
|
||||
(isOperationLegal(ISD::SETCC, newVT) &&
|
||||
getCondCodeAction(Cond, newVT)==Legal))
|
||||
return DAG.getSetCC(dl, VT, N0.getOperand(0),
|
||||
DAG.getConstant(APInt(C1).trunc(InSize), newVT),
|
||||
DAG.getConstant(C1.trunc(InSize), newVT),
|
||||
Cond);
|
||||
break;
|
||||
}
|
||||
|
@ -3310,7 +3310,7 @@ namespace {
|
||||
// Truncate the significand down to its active bit count, but
|
||||
// don't try to drop below 32.
|
||||
unsigned newPrecision = std::max(32U, significand.getActiveBits());
|
||||
significand.trunc(newPrecision);
|
||||
significand = significand.trunc(newPrecision);
|
||||
}
|
||||
|
||||
|
||||
@ -3415,7 +3415,7 @@ void APFloat::toString(SmallVectorImpl<char> &Str,
|
||||
// Nothing to do.
|
||||
} else if (exp > 0) {
|
||||
// Just shift left.
|
||||
significand.zext(semantics->precision + exp);
|
||||
significand = significand.zext(semantics->precision + exp);
|
||||
significand <<= exp;
|
||||
exp = 0;
|
||||
} else { /* exp < 0 */
|
||||
@ -3434,7 +3434,7 @@ void APFloat::toString(SmallVectorImpl<char> &Str,
|
||||
|
||||
// Multiply significand by 5^e.
|
||||
// N * 5^0101 == N * 5^(1*1) * 5^(0*2) * 5^(1*4) * 5^(0*8)
|
||||
significand.zext(precision);
|
||||
significand = significand.zext(precision);
|
||||
APInt five_to_the_i(precision, 5);
|
||||
while (true) {
|
||||
if (texp & 1) significand *= five_to_the_i;
|
||||
|
@ -995,96 +995,90 @@ double APInt::roundToDouble(bool isSigned) const {
|
||||
}
|
||||
|
||||
// Truncate to new width.
|
||||
APInt &APInt::trunc(unsigned width) {
|
||||
APInt APInt::trunc(unsigned width) const {
|
||||
assert(width < BitWidth && "Invalid APInt Truncate request");
|
||||
assert(width && "Can't truncate to 0 bits");
|
||||
unsigned wordsBefore = getNumWords();
|
||||
BitWidth = width;
|
||||
unsigned wordsAfter = getNumWords();
|
||||
if (wordsBefore != wordsAfter) {
|
||||
if (wordsAfter == 1) {
|
||||
uint64_t *tmp = pVal;
|
||||
VAL = pVal[0];
|
||||
delete [] tmp;
|
||||
} else {
|
||||
uint64_t *newVal = getClearedMemory(wordsAfter);
|
||||
for (unsigned i = 0; i < wordsAfter; ++i)
|
||||
newVal[i] = pVal[i];
|
||||
delete [] pVal;
|
||||
pVal = newVal;
|
||||
}
|
||||
}
|
||||
return clearUnusedBits();
|
||||
|
||||
if (width <= APINT_BITS_PER_WORD)
|
||||
return APInt(width, getRawData()[0]);
|
||||
|
||||
APInt Result(getMemory(getNumWords(width)), width);
|
||||
|
||||
// Copy full words.
|
||||
unsigned i;
|
||||
for (i = 0; i != width / APINT_BITS_PER_WORD; i++)
|
||||
Result.pVal[i] = pVal[i];
|
||||
|
||||
// Truncate and copy any partial word.
|
||||
unsigned bits = (0 - width) % APINT_BITS_PER_WORD;
|
||||
if (bits != 0)
|
||||
Result.pVal[i] = pVal[i] << bits >> bits;
|
||||
|
||||
return Result;
|
||||
}
|
||||
|
||||
// Sign extend to a new width.
|
||||
APInt &APInt::sext(unsigned width) {
|
||||
APInt APInt::sext(unsigned width) const {
|
||||
assert(width > BitWidth && "Invalid APInt SignExtend request");
|
||||
// If the sign bit isn't set, this is the same as zext.
|
||||
if (!isNegative()) {
|
||||
zext(width);
|
||||
return *this;
|
||||
|
||||
if (width <= APINT_BITS_PER_WORD) {
|
||||
uint64_t val = VAL << (APINT_BITS_PER_WORD - BitWidth);
|
||||
val = (int64_t)val >> (width - BitWidth);
|
||||
return APInt(width, val >> (APINT_BITS_PER_WORD - width));
|
||||
}
|
||||
|
||||
// The sign bit is set. First, get some facts
|
||||
unsigned wordsBefore = getNumWords();
|
||||
unsigned wordBits = BitWidth % APINT_BITS_PER_WORD;
|
||||
BitWidth = width;
|
||||
unsigned wordsAfter = getNumWords();
|
||||
APInt Result(getMemory(getNumWords(width)), width);
|
||||
|
||||
// Mask the high order word appropriately
|
||||
if (wordsBefore == wordsAfter) {
|
||||
unsigned newWordBits = width % APINT_BITS_PER_WORD;
|
||||
// The extension is contained to the wordsBefore-1th word.
|
||||
uint64_t mask = ~0ULL;
|
||||
if (newWordBits)
|
||||
mask >>= APINT_BITS_PER_WORD - newWordBits;
|
||||
mask <<= wordBits;
|
||||
if (wordsBefore == 1)
|
||||
VAL |= mask;
|
||||
else
|
||||
pVal[wordsBefore-1] |= mask;
|
||||
return clearUnusedBits();
|
||||
// Copy full words.
|
||||
unsigned i;
|
||||
uint64_t word = 0;
|
||||
for (i = 0; i != BitWidth / APINT_BITS_PER_WORD; i++) {
|
||||
word = getRawData()[i];
|
||||
Result.pVal[i] = word;
|
||||
}
|
||||
|
||||
uint64_t mask = wordBits == 0 ? 0 : ~0ULL << wordBits;
|
||||
uint64_t *newVal = getMemory(wordsAfter);
|
||||
if (wordsBefore == 1)
|
||||
newVal[0] = VAL | mask;
|
||||
else {
|
||||
for (unsigned i = 0; i < wordsBefore; ++i)
|
||||
newVal[i] = pVal[i];
|
||||
newVal[wordsBefore-1] |= mask;
|
||||
// Read and sign-extend any partial word.
|
||||
unsigned bits = (0 - BitWidth) % APINT_BITS_PER_WORD;
|
||||
if (bits != 0)
|
||||
word = (int64_t)getRawData()[i] << bits >> bits;
|
||||
else
|
||||
word = (int64_t)word >> (APINT_BITS_PER_WORD - 1);
|
||||
|
||||
// Write remaining full words.
|
||||
for (; i != width / APINT_BITS_PER_WORD; i++) {
|
||||
Result.pVal[i] = word;
|
||||
word = (int64_t)word >> (APINT_BITS_PER_WORD - 1);
|
||||
}
|
||||
for (unsigned i = wordsBefore; i < wordsAfter; i++)
|
||||
newVal[i] = -1ULL;
|
||||
if (wordsBefore != 1)
|
||||
delete [] pVal;
|
||||
pVal = newVal;
|
||||
return clearUnusedBits();
|
||||
|
||||
// Write any partial word.
|
||||
bits = (0 - width) % APINT_BITS_PER_WORD;
|
||||
if (bits != 0)
|
||||
Result.pVal[i] = word << bits >> bits;
|
||||
|
||||
return Result;
|
||||
}
|
||||
|
||||
// Zero extend to a new width.
|
||||
APInt &APInt::zext(unsigned width) {
|
||||
APInt APInt::zext(unsigned width) const {
|
||||
assert(width > BitWidth && "Invalid APInt ZeroExtend request");
|
||||
unsigned wordsBefore = getNumWords();
|
||||
BitWidth = width;
|
||||
unsigned wordsAfter = getNumWords();
|
||||
if (wordsBefore != wordsAfter) {
|
||||
uint64_t *newVal = getClearedMemory(wordsAfter);
|
||||
if (wordsBefore == 1)
|
||||
newVal[0] = VAL;
|
||||
else
|
||||
for (unsigned i = 0; i < wordsBefore; ++i)
|
||||
newVal[i] = pVal[i];
|
||||
if (wordsBefore != 1)
|
||||
delete [] pVal;
|
||||
pVal = newVal;
|
||||
}
|
||||
return *this;
|
||||
|
||||
if (width <= APINT_BITS_PER_WORD)
|
||||
return APInt(width, VAL);
|
||||
|
||||
APInt Result(getMemory(getNumWords(width)), width);
|
||||
|
||||
// Copy words.
|
||||
unsigned i;
|
||||
for (i = 0; i != getNumWords(); i++)
|
||||
Result.pVal[i] = getRawData()[i];
|
||||
|
||||
// Zero remaining words.
|
||||
memset(&Result.pVal[i], 0, (Result.getNumWords() - i) * APINT_WORD_SIZE);
|
||||
|
||||
return Result;
|
||||
}
|
||||
|
||||
APInt &APInt::zextOrTrunc(unsigned width) {
|
||||
APInt APInt::zextOrTrunc(unsigned width) const {
|
||||
if (BitWidth < width)
|
||||
return zext(width);
|
||||
if (BitWidth > width)
|
||||
@ -1092,7 +1086,7 @@ APInt &APInt::zextOrTrunc(unsigned width) {
|
||||
return *this;
|
||||
}
|
||||
|
||||
APInt &APInt::sextOrTrunc(unsigned width) {
|
||||
APInt APInt::sextOrTrunc(unsigned width) const {
|
||||
if (BitWidth < width)
|
||||
return sext(width);
|
||||
if (BitWidth > width)
|
||||
|
@ -442,9 +442,7 @@ ConstantRange ConstantRange::zeroExtend(uint32_t DstTySize) const {
|
||||
// Change into [0, 1 << src bit width)
|
||||
return ConstantRange(APInt(DstTySize,0), APInt(DstTySize,1).shl(SrcTySize));
|
||||
|
||||
APInt L = Lower; L.zext(DstTySize);
|
||||
APInt U = Upper; U.zext(DstTySize);
|
||||
return ConstantRange(L, U);
|
||||
return ConstantRange(Lower.zext(DstTySize), Upper.zext(DstTySize));
|
||||
}
|
||||
|
||||
/// signExtend - Return a new range in the specified integer type, which must
|
||||
@ -461,9 +459,7 @@ ConstantRange ConstantRange::signExtend(uint32_t DstTySize) const {
|
||||
APInt::getLowBitsSet(DstTySize, SrcTySize-1) + 1);
|
||||
}
|
||||
|
||||
APInt L = Lower; L.sext(DstTySize);
|
||||
APInt U = Upper; U.sext(DstTySize);
|
||||
return ConstantRange(L, U);
|
||||
return ConstantRange(Lower.sext(DstTySize), Upper.sext(DstTySize));
|
||||
}
|
||||
|
||||
/// truncate - Return a new range in the specified integer type, which must be
|
||||
@ -477,9 +473,7 @@ ConstantRange ConstantRange::truncate(uint32_t DstTySize) const {
|
||||
if (isFullSet() || getSetSize().ugt(Size))
|
||||
return ConstantRange(DstTySize, /*isFullSet=*/true);
|
||||
|
||||
APInt L = Lower; L.trunc(DstTySize);
|
||||
APInt U = Upper; U.trunc(DstTySize);
|
||||
return ConstantRange(L, U);
|
||||
return ConstantRange(Lower.trunc(DstTySize), Upper.trunc(DstTySize));
|
||||
}
|
||||
|
||||
/// zextOrTrunc - make this range have the bit width given by \p DstTySize. The
|
||||
|
@ -371,7 +371,7 @@ bool StringRef::getAsInteger(unsigned Radix, APInt &Result) const {
|
||||
if (BitWidth < Result.getBitWidth())
|
||||
BitWidth = Result.getBitWidth(); // don't shrink the result
|
||||
else
|
||||
Result.zext(BitWidth);
|
||||
Result = Result.zext(BitWidth);
|
||||
|
||||
APInt RadixAP, CharAP; // unused unless !IsPowerOf2Radix
|
||||
if (!IsPowerOf2Radix) {
|
||||
|
@ -4006,7 +4006,7 @@ static SDValue SkipExtension(SDNode *N, SelectionDAG &DAG) {
|
||||
for (unsigned i = 0; i != NumElts; ++i) {
|
||||
ConstantSDNode *C = cast<ConstantSDNode>(N->getOperand(i));
|
||||
const APInt &CInt = C->getAPIntValue();
|
||||
Ops.push_back(DAG.getConstant(APInt(CInt).trunc(EltSize), TruncVT));
|
||||
Ops.push_back(DAG.getConstant(CInt.trunc(EltSize), TruncVT));
|
||||
}
|
||||
return DAG.getNode(ISD::BUILD_VECTOR, N->getDebugLoc(),
|
||||
MVT::getVectorVT(TruncVT, NumElts), Ops.data(), NumElts);
|
||||
|
@ -939,8 +939,7 @@ Instruction *InstCombiner::visitICmpInstWithInstAndIntCst(ICmpInst &ICI,
|
||||
// If all the high bits are known, we can do this xform.
|
||||
if ((KnownZero|KnownOne).countLeadingOnes() >= SrcBits-DstBits) {
|
||||
// Pull in the high bits from known-ones set.
|
||||
APInt NewRHS(RHS->getValue());
|
||||
NewRHS.zext(SrcBits);
|
||||
APInt NewRHS = RHS->getValue().zext(SrcBits);
|
||||
NewRHS |= KnownOne;
|
||||
return new ICmpInst(ICI.getPredicate(), LHSI->getOperand(0),
|
||||
ConstantInt::get(ICI.getContext(), NewRHS));
|
||||
@ -1022,10 +1021,8 @@ Instruction *InstCombiner::visitICmpInstWithInstAndIntCst(ICmpInst &ICI,
|
||||
(AndCST->getValue().isNonNegative() && RHSV.isNonNegative()))) {
|
||||
uint32_t BitWidth =
|
||||
cast<IntegerType>(Cast->getOperand(0)->getType())->getBitWidth();
|
||||
APInt NewCST = AndCST->getValue();
|
||||
NewCST.zext(BitWidth);
|
||||
APInt NewCI = RHSV;
|
||||
NewCI.zext(BitWidth);
|
||||
APInt NewCST = AndCST->getValue().zext(BitWidth);
|
||||
APInt NewCI = RHSV.zext(BitWidth);
|
||||
Value *NewAnd =
|
||||
Builder->CreateAnd(Cast->getOperand(0),
|
||||
ConstantInt::get(ICI.getContext(), NewCST),
|
||||
|
@ -29,11 +29,11 @@ static bool MultiplyOverflows(ConstantInt *C1, ConstantInt *C2, bool sign) {
|
||||
uint32_t W = C1->getBitWidth();
|
||||
APInt LHSExt = C1->getValue(), RHSExt = C2->getValue();
|
||||
if (sign) {
|
||||
LHSExt.sext(W * 2);
|
||||
RHSExt.sext(W * 2);
|
||||
LHSExt = LHSExt.sext(W * 2);
|
||||
RHSExt = RHSExt.sext(W * 2);
|
||||
} else {
|
||||
LHSExt.zext(W * 2);
|
||||
RHSExt.zext(W * 2);
|
||||
LHSExt = LHSExt.zext(W * 2);
|
||||
RHSExt = RHSExt.zext(W * 2);
|
||||
}
|
||||
|
||||
APInt MulExt = LHSExt * RHSExt;
|
||||
|
@ -34,7 +34,7 @@ static bool ShrinkDemandedConstant(Instruction *I, unsigned OpNo,
|
||||
if (!OpC) return false;
|
||||
|
||||
// If there are no bits set that aren't demanded, nothing to do.
|
||||
Demanded.zextOrTrunc(OpC->getValue().getBitWidth());
|
||||
Demanded = Demanded.zextOrTrunc(OpC->getValue().getBitWidth());
|
||||
if ((~Demanded & OpC->getValue()) == 0)
|
||||
return false;
|
||||
|
||||
@ -388,15 +388,15 @@ Value *InstCombiner::SimplifyDemandedUseBits(Value *V, APInt DemandedMask,
|
||||
break;
|
||||
case Instruction::Trunc: {
|
||||
unsigned truncBf = I->getOperand(0)->getType()->getScalarSizeInBits();
|
||||
DemandedMask.zext(truncBf);
|
||||
KnownZero.zext(truncBf);
|
||||
KnownOne.zext(truncBf);
|
||||
DemandedMask = DemandedMask.zext(truncBf);
|
||||
KnownZero = KnownZero.zext(truncBf);
|
||||
KnownOne = KnownOne.zext(truncBf);
|
||||
if (SimplifyDemandedBits(I->getOperandUse(0), DemandedMask,
|
||||
KnownZero, KnownOne, Depth+1))
|
||||
return I;
|
||||
DemandedMask.trunc(BitWidth);
|
||||
KnownZero.trunc(BitWidth);
|
||||
KnownOne.trunc(BitWidth);
|
||||
DemandedMask = DemandedMask.trunc(BitWidth);
|
||||
KnownZero = KnownZero.trunc(BitWidth);
|
||||
KnownOne = KnownOne.trunc(BitWidth);
|
||||
assert(!(KnownZero & KnownOne) && "Bits known to be one AND zero?");
|
||||
break;
|
||||
}
|
||||
@ -426,15 +426,15 @@ Value *InstCombiner::SimplifyDemandedUseBits(Value *V, APInt DemandedMask,
|
||||
// Compute the bits in the result that are not present in the input.
|
||||
unsigned SrcBitWidth =I->getOperand(0)->getType()->getScalarSizeInBits();
|
||||
|
||||
DemandedMask.trunc(SrcBitWidth);
|
||||
KnownZero.trunc(SrcBitWidth);
|
||||
KnownOne.trunc(SrcBitWidth);
|
||||
DemandedMask = DemandedMask.trunc(SrcBitWidth);
|
||||
KnownZero = KnownZero.trunc(SrcBitWidth);
|
||||
KnownOne = KnownOne.trunc(SrcBitWidth);
|
||||
if (SimplifyDemandedBits(I->getOperandUse(0), DemandedMask,
|
||||
KnownZero, KnownOne, Depth+1))
|
||||
return I;
|
||||
DemandedMask.zext(BitWidth);
|
||||
KnownZero.zext(BitWidth);
|
||||
KnownOne.zext(BitWidth);
|
||||
DemandedMask = DemandedMask.zext(BitWidth);
|
||||
KnownZero = KnownZero.zext(BitWidth);
|
||||
KnownOne = KnownOne.zext(BitWidth);
|
||||
assert(!(KnownZero & KnownOne) && "Bits known to be one AND zero?");
|
||||
// The top bits are known to be zero.
|
||||
KnownZero |= APInt::getHighBitsSet(BitWidth, BitWidth - SrcBitWidth);
|
||||
@ -453,15 +453,15 @@ Value *InstCombiner::SimplifyDemandedUseBits(Value *V, APInt DemandedMask,
|
||||
if ((NewBits & DemandedMask) != 0)
|
||||
InputDemandedBits.setBit(SrcBitWidth-1);
|
||||
|
||||
InputDemandedBits.trunc(SrcBitWidth);
|
||||
KnownZero.trunc(SrcBitWidth);
|
||||
KnownOne.trunc(SrcBitWidth);
|
||||
InputDemandedBits = InputDemandedBits.trunc(SrcBitWidth);
|
||||
KnownZero = KnownZero.trunc(SrcBitWidth);
|
||||
KnownOne = KnownOne.trunc(SrcBitWidth);
|
||||
if (SimplifyDemandedBits(I->getOperandUse(0), InputDemandedBits,
|
||||
KnownZero, KnownOne, Depth+1))
|
||||
return I;
|
||||
InputDemandedBits.zext(BitWidth);
|
||||
KnownZero.zext(BitWidth);
|
||||
KnownOne.zext(BitWidth);
|
||||
InputDemandedBits = InputDemandedBits.zext(BitWidth);
|
||||
KnownZero = KnownZero.zext(BitWidth);
|
||||
KnownOne = KnownOne.zext(BitWidth);
|
||||
assert(!(KnownZero & KnownOne) && "Bits known to be one AND zero?");
|
||||
|
||||
// If the sign bit of the input is known set or clear, then we know the
|
||||
|
@ -63,8 +63,8 @@ static Value *isBytewiseValue(Value *V) {
|
||||
while (Val.getBitWidth() != 8) {
|
||||
unsigned NextWidth = Val.getBitWidth()/2;
|
||||
Val2 = Val.lshr(NextWidth);
|
||||
Val2.trunc(Val.getBitWidth()/2);
|
||||
Val.trunc(Val.getBitWidth()/2);
|
||||
Val2 = Val2.trunc(Val.getBitWidth()/2);
|
||||
Val = Val.trunc(Val.getBitWidth()/2);
|
||||
|
||||
// If the top/bottom halves aren't the same, reject it.
|
||||
if (Val != Val2)
|
||||
|
@ -202,7 +202,7 @@ static Constant *ExtractConstantBytes(Constant *C, unsigned ByteStart,
|
||||
APInt V = CI->getValue();
|
||||
if (ByteStart)
|
||||
V = V.lshr(ByteStart*8);
|
||||
V.trunc(ByteSize*8);
|
||||
V = V.trunc(ByteSize*8);
|
||||
return ConstantInt::get(CI->getContext(), V);
|
||||
}
|
||||
|
||||
@ -647,25 +647,22 @@ Constant *llvm::ConstantFoldCastInstruction(unsigned opc, Constant *V,
|
||||
case Instruction::ZExt:
|
||||
if (ConstantInt *CI = dyn_cast<ConstantInt>(V)) {
|
||||
uint32_t BitWidth = cast<IntegerType>(DestTy)->getBitWidth();
|
||||
APInt Result(CI->getValue());
|
||||
Result.zext(BitWidth);
|
||||
return ConstantInt::get(V->getContext(), Result);
|
||||
return ConstantInt::get(V->getContext(),
|
||||
CI->getValue().zext(BitWidth));
|
||||
}
|
||||
return 0;
|
||||
case Instruction::SExt:
|
||||
if (ConstantInt *CI = dyn_cast<ConstantInt>(V)) {
|
||||
uint32_t BitWidth = cast<IntegerType>(DestTy)->getBitWidth();
|
||||
APInt Result(CI->getValue());
|
||||
Result.sext(BitWidth);
|
||||
return ConstantInt::get(V->getContext(), Result);
|
||||
return ConstantInt::get(V->getContext(),
|
||||
CI->getValue().sext(BitWidth));
|
||||
}
|
||||
return 0;
|
||||
case Instruction::Trunc: {
|
||||
uint32_t DestBitWidth = cast<IntegerType>(DestTy)->getBitWidth();
|
||||
if (ConstantInt *CI = dyn_cast<ConstantInt>(V)) {
|
||||
APInt Result(CI->getValue());
|
||||
Result.trunc(DestBitWidth);
|
||||
return ConstantInt::get(V->getContext(), Result);
|
||||
return ConstantInt::get(V->getContext(),
|
||||
CI->getValue().trunc(DestBitWidth));
|
||||
}
|
||||
|
||||
// The input must be a constantexpr. See if we can simplify this based on
|
||||
|
@ -171,8 +171,8 @@ TEST_F(ConstantRangeTest, Trunc) {
|
||||
ConstantRange TWrap = Wrap.truncate(10);
|
||||
EXPECT_TRUE(TFull.isFullSet());
|
||||
EXPECT_TRUE(TEmpty.isEmptySet());
|
||||
EXPECT_EQ(TOne, ConstantRange(APInt(One.getLower()).trunc(10),
|
||||
APInt(One.getUpper()).trunc(10)));
|
||||
EXPECT_EQ(TOne, ConstantRange(One.getLower().trunc(10),
|
||||
One.getUpper().trunc(10)));
|
||||
EXPECT_TRUE(TSome.isFullSet());
|
||||
}
|
||||
|
||||
@ -184,10 +184,10 @@ TEST_F(ConstantRangeTest, ZExt) {
|
||||
ConstantRange ZWrap = Wrap.zeroExtend(20);
|
||||
EXPECT_EQ(ZFull, ConstantRange(APInt(20, 0), APInt(20, 0x10000)));
|
||||
EXPECT_TRUE(ZEmpty.isEmptySet());
|
||||
EXPECT_EQ(ZOne, ConstantRange(APInt(One.getLower()).zext(20),
|
||||
APInt(One.getUpper()).zext(20)));
|
||||
EXPECT_EQ(ZSome, ConstantRange(APInt(Some.getLower()).zext(20),
|
||||
APInt(Some.getUpper()).zext(20)));
|
||||
EXPECT_EQ(ZOne, ConstantRange(One.getLower().zext(20),
|
||||
One.getUpper().zext(20)));
|
||||
EXPECT_EQ(ZSome, ConstantRange(Some.getLower().zext(20),
|
||||
Some.getUpper().zext(20)));
|
||||
EXPECT_EQ(ZWrap, ConstantRange(APInt(20, 0), APInt(20, 0x10000)));
|
||||
}
|
||||
|
||||
@ -200,10 +200,10 @@ TEST_F(ConstantRangeTest, SExt) {
|
||||
EXPECT_EQ(SFull, ConstantRange(APInt(20, (uint64_t)INT16_MIN, true),
|
||||
APInt(20, INT16_MAX + 1, true)));
|
||||
EXPECT_TRUE(SEmpty.isEmptySet());
|
||||
EXPECT_EQ(SOne, ConstantRange(APInt(One.getLower()).sext(20),
|
||||
APInt(One.getUpper()).sext(20)));
|
||||
EXPECT_EQ(SSome, ConstantRange(APInt(Some.getLower()).sext(20),
|
||||
APInt(Some.getUpper()).sext(20)));
|
||||
EXPECT_EQ(SOne, ConstantRange(One.getLower().sext(20),
|
||||
One.getUpper().sext(20)));
|
||||
EXPECT_EQ(SSome, ConstantRange(Some.getLower().sext(20),
|
||||
Some.getUpper().sext(20)));
|
||||
EXPECT_EQ(SWrap, ConstantRange(APInt(20, (uint64_t)INT16_MIN, true),
|
||||
APInt(20, INT16_MAX + 1, true)));
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user