mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-01 15:40:53 +00:00
[SCEV] Add and use SCEVConstant::getAPInt; NFCI
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@255921 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
e78257c891
commit
4b892417a6
@ -43,6 +43,7 @@ namespace llvm {
|
||||
SCEV(ID, scConstant), V(v) {}
|
||||
public:
|
||||
ConstantInt *getValue() const { return V; }
|
||||
const APInt &getAPInt() const { return getValue()->getValue(); }
|
||||
|
||||
Type *getType() const { return V->getType(); }
|
||||
|
||||
|
@ -501,10 +501,10 @@ bool DependenceAnalysis::intersectConstraints(Constraint *X,
|
||||
if (!C1B2_C2B1 || !C1A2_C2A1 ||
|
||||
!A1B2_A2B1 || !A2B1_A1B2)
|
||||
return false;
|
||||
APInt Xtop = C1B2_C2B1->getValue()->getValue();
|
||||
APInt Xbot = A1B2_A2B1->getValue()->getValue();
|
||||
APInt Ytop = C1A2_C2A1->getValue()->getValue();
|
||||
APInt Ybot = A2B1_A1B2->getValue()->getValue();
|
||||
APInt Xtop = C1B2_C2B1->getAPInt();
|
||||
APInt Xbot = A1B2_A2B1->getAPInt();
|
||||
APInt Ytop = C1A2_C2A1->getAPInt();
|
||||
APInt Ybot = A2B1_A1B2->getAPInt();
|
||||
DEBUG(dbgs() << "\t\tXtop = " << Xtop << "\n");
|
||||
DEBUG(dbgs() << "\t\tXbot = " << Xbot << "\n");
|
||||
DEBUG(dbgs() << "\t\tYtop = " << Ytop << "\n");
|
||||
@ -528,7 +528,7 @@ bool DependenceAnalysis::intersectConstraints(Constraint *X,
|
||||
}
|
||||
if (const SCEVConstant *CUB =
|
||||
collectConstantUpperBound(X->getAssociatedLoop(), Prod1->getType())) {
|
||||
APInt UpperBound = CUB->getValue()->getValue();
|
||||
APInt UpperBound = CUB->getAPInt();
|
||||
DEBUG(dbgs() << "\t\tupper bound = " << UpperBound << "\n");
|
||||
if (Xq.sgt(UpperBound) || Yq.sgt(UpperBound)) {
|
||||
X->setEmpty();
|
||||
@ -1115,8 +1115,8 @@ bool DependenceAnalysis::strongSIVtest(const SCEV *Coeff,
|
||||
|
||||
// Can we compute distance?
|
||||
if (isa<SCEVConstant>(Delta) && isa<SCEVConstant>(Coeff)) {
|
||||
APInt ConstDelta = cast<SCEVConstant>(Delta)->getValue()->getValue();
|
||||
APInt ConstCoeff = cast<SCEVConstant>(Coeff)->getValue()->getValue();
|
||||
APInt ConstDelta = cast<SCEVConstant>(Delta)->getAPInt();
|
||||
APInt ConstCoeff = cast<SCEVConstant>(Coeff)->getAPInt();
|
||||
APInt Distance = ConstDelta; // these need to be initialized
|
||||
APInt Remainder = ConstDelta;
|
||||
APInt::sdivrem(ConstDelta, ConstCoeff, Distance, Remainder);
|
||||
@ -1307,8 +1307,8 @@ bool DependenceAnalysis::weakCrossingSIVtest(const SCEV *Coeff,
|
||||
}
|
||||
|
||||
// check that Coeff divides Delta
|
||||
APInt APDelta = ConstDelta->getValue()->getValue();
|
||||
APInt APCoeff = ConstCoeff->getValue()->getValue();
|
||||
APInt APDelta = ConstDelta->getAPInt();
|
||||
APInt APCoeff = ConstCoeff->getAPInt();
|
||||
APInt Distance = APDelta; // these need to be initialzed
|
||||
APInt Remainder = APDelta;
|
||||
APInt::sdivrem(APDelta, APCoeff, Distance, Remainder);
|
||||
@ -1462,10 +1462,10 @@ bool DependenceAnalysis::exactSIVtest(const SCEV *SrcCoeff,
|
||||
|
||||
// find gcd
|
||||
APInt G, X, Y;
|
||||
APInt AM = ConstSrcCoeff->getValue()->getValue();
|
||||
APInt BM = ConstDstCoeff->getValue()->getValue();
|
||||
APInt AM = ConstSrcCoeff->getAPInt();
|
||||
APInt BM = ConstDstCoeff->getAPInt();
|
||||
unsigned Bits = AM.getBitWidth();
|
||||
if (findGCD(Bits, AM, BM, ConstDelta->getValue()->getValue(), G, X, Y)) {
|
||||
if (findGCD(Bits, AM, BM, ConstDelta->getAPInt(), G, X, Y)) {
|
||||
// gcd doesn't divide Delta, no dependence
|
||||
++ExactSIVindependence;
|
||||
++ExactSIVsuccesses;
|
||||
@ -1480,7 +1480,7 @@ bool DependenceAnalysis::exactSIVtest(const SCEV *SrcCoeff,
|
||||
// UM is perhaps unavailable, let's check
|
||||
if (const SCEVConstant *CUB =
|
||||
collectConstantUpperBound(CurLoop, Delta->getType())) {
|
||||
UM = CUB->getValue()->getValue();
|
||||
UM = CUB->getAPInt();
|
||||
DEBUG(dbgs() << "\t UM = " << UM << "\n");
|
||||
UMvalid = true;
|
||||
}
|
||||
@ -1608,8 +1608,8 @@ bool DependenceAnalysis::exactSIVtest(const SCEV *SrcCoeff,
|
||||
static
|
||||
bool isRemainderZero(const SCEVConstant *Dividend,
|
||||
const SCEVConstant *Divisor) {
|
||||
APInt ConstDividend = Dividend->getValue()->getValue();
|
||||
APInt ConstDivisor = Divisor->getValue()->getValue();
|
||||
APInt ConstDividend = Dividend->getAPInt();
|
||||
APInt ConstDivisor = Divisor->getAPInt();
|
||||
return ConstDividend.srem(ConstDivisor) == 0;
|
||||
}
|
||||
|
||||
@ -1866,10 +1866,10 @@ bool DependenceAnalysis::exactRDIVtest(const SCEV *SrcCoeff,
|
||||
|
||||
// find gcd
|
||||
APInt G, X, Y;
|
||||
APInt AM = ConstSrcCoeff->getValue()->getValue();
|
||||
APInt BM = ConstDstCoeff->getValue()->getValue();
|
||||
APInt AM = ConstSrcCoeff->getAPInt();
|
||||
APInt BM = ConstDstCoeff->getAPInt();
|
||||
unsigned Bits = AM.getBitWidth();
|
||||
if (findGCD(Bits, AM, BM, ConstDelta->getValue()->getValue(), G, X, Y)) {
|
||||
if (findGCD(Bits, AM, BM, ConstDelta->getAPInt(), G, X, Y)) {
|
||||
// gcd doesn't divide Delta, no dependence
|
||||
++ExactRDIVindependence;
|
||||
return true;
|
||||
@ -1883,7 +1883,7 @@ bool DependenceAnalysis::exactRDIVtest(const SCEV *SrcCoeff,
|
||||
// SrcUM is perhaps unavailable, let's check
|
||||
if (const SCEVConstant *UpperBound =
|
||||
collectConstantUpperBound(SrcLoop, Delta->getType())) {
|
||||
SrcUM = UpperBound->getValue()->getValue();
|
||||
SrcUM = UpperBound->getAPInt();
|
||||
DEBUG(dbgs() << "\t SrcUM = " << SrcUM << "\n");
|
||||
SrcUMvalid = true;
|
||||
}
|
||||
@ -1893,7 +1893,7 @@ bool DependenceAnalysis::exactRDIVtest(const SCEV *SrcCoeff,
|
||||
// UM is perhaps unavailable, let's check
|
||||
if (const SCEVConstant *UpperBound =
|
||||
collectConstantUpperBound(DstLoop, Delta->getType())) {
|
||||
DstUM = UpperBound->getValue()->getValue();
|
||||
DstUM = UpperBound->getAPInt();
|
||||
DEBUG(dbgs() << "\t DstUM = " << DstUM << "\n");
|
||||
DstUMvalid = true;
|
||||
}
|
||||
@ -2306,7 +2306,7 @@ bool DependenceAnalysis::gcdMIVtest(const SCEV *Src,
|
||||
Constant = getConstantPart(Product);
|
||||
if (!Constant)
|
||||
return false;
|
||||
APInt ConstCoeff = Constant->getValue()->getValue();
|
||||
APInt ConstCoeff = Constant->getAPInt();
|
||||
RunningGCD = APIntOps::GreatestCommonDivisor(RunningGCD, ConstCoeff.abs());
|
||||
Coefficients = AddRec->getStart();
|
||||
}
|
||||
@ -2327,7 +2327,7 @@ bool DependenceAnalysis::gcdMIVtest(const SCEV *Src,
|
||||
Constant = getConstantPart(Product);
|
||||
if (!Constant)
|
||||
return false;
|
||||
APInt ConstCoeff = Constant->getValue()->getValue();
|
||||
APInt ConstCoeff = Constant->getAPInt();
|
||||
RunningGCD = APIntOps::GreatestCommonDivisor(RunningGCD, ConstCoeff.abs());
|
||||
Coefficients = AddRec->getStart();
|
||||
}
|
||||
@ -2351,7 +2351,7 @@ bool DependenceAnalysis::gcdMIVtest(const SCEV *Src,
|
||||
const SCEVConstant *ConstOp = getConstantPart(Product);
|
||||
if (!ConstOp)
|
||||
return false;
|
||||
APInt ConstOpValue = ConstOp->getValue()->getValue();
|
||||
APInt ConstOpValue = ConstOp->getAPInt();
|
||||
ExtraGCD = APIntOps::GreatestCommonDivisor(ExtraGCD,
|
||||
ConstOpValue.abs());
|
||||
}
|
||||
@ -2361,7 +2361,7 @@ bool DependenceAnalysis::gcdMIVtest(const SCEV *Src,
|
||||
}
|
||||
if (!Constant)
|
||||
return false;
|
||||
APInt ConstDelta = cast<SCEVConstant>(Constant)->getValue()->getValue();
|
||||
APInt ConstDelta = cast<SCEVConstant>(Constant)->getAPInt();
|
||||
DEBUG(dbgs() << " ConstDelta = " << ConstDelta << "\n");
|
||||
if (ConstDelta == 0)
|
||||
return false;
|
||||
@ -2409,7 +2409,7 @@ bool DependenceAnalysis::gcdMIVtest(const SCEV *Src,
|
||||
Constant = getConstantPart(Product);
|
||||
else
|
||||
Constant = cast<SCEVConstant>(Coeff);
|
||||
APInt ConstCoeff = Constant->getValue()->getValue();
|
||||
APInt ConstCoeff = Constant->getAPInt();
|
||||
RunningGCD = APIntOps::GreatestCommonDivisor(RunningGCD, ConstCoeff.abs());
|
||||
}
|
||||
Inner = AddRec->getStart();
|
||||
@ -2427,7 +2427,7 @@ bool DependenceAnalysis::gcdMIVtest(const SCEV *Src,
|
||||
Constant = getConstantPart(Product);
|
||||
else
|
||||
Constant = cast<SCEVConstant>(Coeff);
|
||||
APInt ConstCoeff = Constant->getValue()->getValue();
|
||||
APInt ConstCoeff = Constant->getAPInt();
|
||||
RunningGCD = APIntOps::GreatestCommonDivisor(RunningGCD, ConstCoeff.abs());
|
||||
}
|
||||
Inner = AddRec->getStart();
|
||||
@ -2444,7 +2444,7 @@ bool DependenceAnalysis::gcdMIVtest(const SCEV *Src,
|
||||
// or constant, in which case we give up on this direction.
|
||||
continue;
|
||||
}
|
||||
APInt ConstCoeff = Constant->getValue()->getValue();
|
||||
APInt ConstCoeff = Constant->getAPInt();
|
||||
RunningGCD = APIntOps::GreatestCommonDivisor(RunningGCD, ConstCoeff.abs());
|
||||
DEBUG(dbgs() << "\tRunningGCD = " << RunningGCD << "\n");
|
||||
if (RunningGCD != 0) {
|
||||
@ -3107,8 +3107,8 @@ bool DependenceAnalysis::propagateLine(const SCEV *&Src,
|
||||
const SCEVConstant *Bconst = dyn_cast<SCEVConstant>(B);
|
||||
const SCEVConstant *Cconst = dyn_cast<SCEVConstant>(C);
|
||||
if (!Bconst || !Cconst) return false;
|
||||
APInt Beta = Bconst->getValue()->getValue();
|
||||
APInt Charlie = Cconst->getValue()->getValue();
|
||||
APInt Beta = Bconst->getAPInt();
|
||||
APInt Charlie = Cconst->getAPInt();
|
||||
APInt CdivB = Charlie.sdiv(Beta);
|
||||
assert(Charlie.srem(Beta) == 0 && "C should be evenly divisible by B");
|
||||
const SCEV *AP_K = findCoefficient(Dst, CurLoop);
|
||||
@ -3122,8 +3122,8 @@ bool DependenceAnalysis::propagateLine(const SCEV *&Src,
|
||||
const SCEVConstant *Aconst = dyn_cast<SCEVConstant>(A);
|
||||
const SCEVConstant *Cconst = dyn_cast<SCEVConstant>(C);
|
||||
if (!Aconst || !Cconst) return false;
|
||||
APInt Alpha = Aconst->getValue()->getValue();
|
||||
APInt Charlie = Cconst->getValue()->getValue();
|
||||
APInt Alpha = Aconst->getAPInt();
|
||||
APInt Charlie = Cconst->getAPInt();
|
||||
APInt CdivA = Charlie.sdiv(Alpha);
|
||||
assert(Charlie.srem(Alpha) == 0 && "C should be evenly divisible by A");
|
||||
const SCEV *A_K = findCoefficient(Src, CurLoop);
|
||||
@ -3136,8 +3136,8 @@ bool DependenceAnalysis::propagateLine(const SCEV *&Src,
|
||||
const SCEVConstant *Aconst = dyn_cast<SCEVConstant>(A);
|
||||
const SCEVConstant *Cconst = dyn_cast<SCEVConstant>(C);
|
||||
if (!Aconst || !Cconst) return false;
|
||||
APInt Alpha = Aconst->getValue()->getValue();
|
||||
APInt Charlie = Cconst->getValue()->getValue();
|
||||
APInt Alpha = Aconst->getAPInt();
|
||||
APInt Charlie = Cconst->getAPInt();
|
||||
APInt CdivA = Charlie.sdiv(Alpha);
|
||||
assert(Charlie.srem(Alpha) == 0 && "C should be evenly divisible by A");
|
||||
const SCEV *A_K = findCoefficient(Src, CurLoop);
|
||||
|
@ -876,7 +876,7 @@ int llvm::isStridedPtr(PredicatedScalarEvolution &PSE, Value *Ptr,
|
||||
|
||||
auto &DL = Lp->getHeader()->getModule()->getDataLayout();
|
||||
int64_t Size = DL.getTypeAllocSize(PtrTy->getElementType());
|
||||
const APInt &APStepVal = C->getValue()->getValue();
|
||||
const APInt &APStepVal = C->getAPInt();
|
||||
|
||||
// Huge step value - give up.
|
||||
if (APStepVal.getBitWidth() > 64)
|
||||
@ -1096,7 +1096,7 @@ MemoryDepChecker::isDependent(const MemAccessInfo &A, unsigned AIdx,
|
||||
unsigned TypeByteSize = DL.getTypeAllocSize(ATy);
|
||||
|
||||
// Negative distances are not plausible dependencies.
|
||||
const APInt &Val = C->getValue()->getValue();
|
||||
const APInt &Val = C->getAPInt();
|
||||
if (Val.isNegative()) {
|
||||
bool IsTrueDataDependence = (AIsWrite && !BIsWrite);
|
||||
if (IsTrueDataDependence &&
|
||||
|
@ -294,7 +294,7 @@ bool SCEV::isNonConstantNegative() const {
|
||||
if (!SC) return false;
|
||||
|
||||
// Return true if the value is negative, this matches things like (-42 * V).
|
||||
return SC->getValue()->getValue().isNegative();
|
||||
return SC->getAPInt().isNegative();
|
||||
}
|
||||
|
||||
SCEVCouldNotCompute::SCEVCouldNotCompute() :
|
||||
@ -533,8 +533,8 @@ public:
|
||||
const SCEVConstant *RC = cast<SCEVConstant>(RHS);
|
||||
|
||||
// Compare constant values.
|
||||
const APInt &LA = LC->getValue()->getValue();
|
||||
const APInt &RA = RC->getValue()->getValue();
|
||||
const APInt &LA = LC->getAPInt();
|
||||
const APInt &RA = RC->getAPInt();
|
||||
unsigned LBitWidth = LA.getBitWidth(), RBitWidth = RA.getBitWidth();
|
||||
if (LBitWidth != RBitWidth)
|
||||
return (int)LBitWidth - (int)RBitWidth;
|
||||
@ -760,8 +760,8 @@ public:
|
||||
|
||||
void visitConstant(const SCEVConstant *Numerator) {
|
||||
if (const SCEVConstant *D = dyn_cast<SCEVConstant>(Denominator)) {
|
||||
APInt NumeratorVal = Numerator->getValue()->getValue();
|
||||
APInt DenominatorVal = D->getValue()->getValue();
|
||||
APInt NumeratorVal = Numerator->getAPInt();
|
||||
APInt DenominatorVal = D->getAPInt();
|
||||
uint32_t NumeratorBW = NumeratorVal.getBitWidth();
|
||||
uint32_t DenominatorBW = DenominatorVal.getBitWidth();
|
||||
|
||||
@ -1371,7 +1371,7 @@ bool ScalarEvolution::proveNoWrapByVaryingStart(const SCEV *Start,
|
||||
if (!StartC)
|
||||
return false;
|
||||
|
||||
APInt StartAI = StartC->getValue()->getValue();
|
||||
APInt StartAI = StartC->getAPInt();
|
||||
|
||||
for (unsigned Delta : {-2, -1, 1, 2}) {
|
||||
const SCEV *PreStart = getConstant(StartAI - Delta);
|
||||
@ -1632,8 +1632,8 @@ const SCEV *ScalarEvolution::getSignExtendExpr(const SCEV *Op,
|
||||
auto *SMul = dyn_cast<SCEVMulExpr>(SA->getOperand(1));
|
||||
if (SMul && SC1) {
|
||||
if (auto *SC2 = dyn_cast<SCEVConstant>(SMul->getOperand(0))) {
|
||||
const APInt &C1 = SC1->getValue()->getValue();
|
||||
const APInt &C2 = SC2->getValue()->getValue();
|
||||
const APInt &C1 = SC1->getAPInt();
|
||||
const APInt &C2 = SC2->getAPInt();
|
||||
if (C1.isStrictlyPositive() && C2.isStrictlyPositive() &&
|
||||
C2.ugt(C1) && C2.isPowerOf2())
|
||||
return getAddExpr(getSignExtendExpr(SC1, Ty),
|
||||
@ -1758,8 +1758,8 @@ const SCEV *ScalarEvolution::getSignExtendExpr(const SCEV *Op,
|
||||
auto *SC1 = dyn_cast<SCEVConstant>(Start);
|
||||
auto *SC2 = dyn_cast<SCEVConstant>(Step);
|
||||
if (SC1 && SC2) {
|
||||
const APInt &C1 = SC1->getValue()->getValue();
|
||||
const APInt &C2 = SC2->getValue()->getValue();
|
||||
const APInt &C1 = SC1->getAPInt();
|
||||
const APInt &C2 = SC2->getAPInt();
|
||||
if (C1.isStrictlyPositive() && C2.isStrictlyPositive() && C2.ugt(C1) &&
|
||||
C2.isPowerOf2()) {
|
||||
Start = getSignExtendExpr(Start, Ty);
|
||||
@ -1799,7 +1799,7 @@ const SCEV *ScalarEvolution::getAnyExtendExpr(const SCEV *Op,
|
||||
|
||||
// Sign-extend negative constants.
|
||||
if (const SCEVConstant *SC = dyn_cast<SCEVConstant>(Op))
|
||||
if (SC->getValue()->getValue().isNegative())
|
||||
if (SC->getAPInt().isNegative())
|
||||
return getSignExtendExpr(Op, Ty);
|
||||
|
||||
// Peel off a truncate cast.
|
||||
@ -1877,7 +1877,7 @@ CollectAddOperandsWithScales(DenseMap<const SCEV *, APInt> &M,
|
||||
// Pull a buried constant out to the outside.
|
||||
if (Scale != 1 || AccumulatedConstant != 0 || C->getValue()->isZero())
|
||||
Interesting = true;
|
||||
AccumulatedConstant += Scale * C->getValue()->getValue();
|
||||
AccumulatedConstant += Scale * C->getAPInt();
|
||||
}
|
||||
|
||||
// Next comes everything else. We're especially interested in multiplies
|
||||
@ -1886,7 +1886,7 @@ CollectAddOperandsWithScales(DenseMap<const SCEV *, APInt> &M,
|
||||
const SCEVMulExpr *Mul = dyn_cast<SCEVMulExpr>(Ops[i]);
|
||||
if (Mul && isa<SCEVConstant>(Mul->getOperand(0))) {
|
||||
APInt NewScale =
|
||||
Scale * cast<SCEVConstant>(Mul->getOperand(0))->getValue()->getValue();
|
||||
Scale * cast<SCEVConstant>(Mul->getOperand(0))->getAPInt();
|
||||
if (Mul->getNumOperands() == 2 && isa<SCEVAddExpr>(Mul->getOperand(1))) {
|
||||
// A multiplication of a constant with another add; recurse.
|
||||
const SCEVAddExpr *Add = cast<SCEVAddExpr>(Mul->getOperand(1));
|
||||
@ -1963,7 +1963,7 @@ StrengthenNoWrapFlags(ScalarEvolution *SE, SCEVTypes Type,
|
||||
// (A + C) --> (A + C)<nsw> if the addition does not sign overflow
|
||||
// (A + C) --> (A + C)<nuw> if the addition does not unsign overflow
|
||||
|
||||
const APInt &C = cast<SCEVConstant>(Ops[0])->getValue()->getValue();
|
||||
const APInt &C = cast<SCEVConstant>(Ops[0])->getAPInt();
|
||||
if (!(SignOrUnsignWrap & SCEV::FlagNSW)) {
|
||||
auto NSWRegion =
|
||||
ConstantRange::makeNoWrapRegion(Instruction::Add, C, OBO::NoSignedWrap);
|
||||
@ -2009,8 +2009,7 @@ const SCEV *ScalarEvolution::getAddExpr(SmallVectorImpl<const SCEV *> &Ops,
|
||||
assert(Idx < Ops.size());
|
||||
while (const SCEVConstant *RHSC = dyn_cast<SCEVConstant>(Ops[Idx])) {
|
||||
// We found two constants, fold them together!
|
||||
Ops[0] = getConstant(LHSC->getValue()->getValue() +
|
||||
RHSC->getValue()->getValue());
|
||||
Ops[0] = getConstant(LHSC->getAPInt() + RHSC->getAPInt());
|
||||
if (Ops.size() == 2) return Ops[0];
|
||||
Ops.erase(Ops.begin()+1); // Erase the folded element
|
||||
LHSC = cast<SCEVConstant>(Ops[0]);
|
||||
@ -2429,9 +2428,8 @@ const SCEV *ScalarEvolution::getMulExpr(SmallVectorImpl<const SCEV *> &Ops,
|
||||
++Idx;
|
||||
while (const SCEVConstant *RHSC = dyn_cast<SCEVConstant>(Ops[Idx])) {
|
||||
// We found two constants, fold them together!
|
||||
ConstantInt *Fold = ConstantInt::get(getContext(),
|
||||
LHSC->getValue()->getValue() *
|
||||
RHSC->getValue()->getValue());
|
||||
ConstantInt *Fold =
|
||||
ConstantInt::get(getContext(), LHSC->getAPInt() * RHSC->getAPInt());
|
||||
Ops[0] = getConstant(Fold);
|
||||
Ops.erase(Ops.begin()+1); // Erase the folded element
|
||||
if (Ops.size() == 1) return Ops[0];
|
||||
@ -2653,11 +2651,11 @@ const SCEV *ScalarEvolution::getUDivExpr(const SCEV *LHS,
|
||||
// its operands.
|
||||
// TODO: Generalize this to non-constants by using known-bits information.
|
||||
Type *Ty = LHS->getType();
|
||||
unsigned LZ = RHSC->getValue()->getValue().countLeadingZeros();
|
||||
unsigned LZ = RHSC->getAPInt().countLeadingZeros();
|
||||
unsigned MaxShiftAmt = getTypeSizeInBits(Ty) - LZ - 1;
|
||||
// For non-power-of-two values, effectively round the value up to the
|
||||
// nearest power of two.
|
||||
if (!RHSC->getValue()->getValue().isPowerOf2())
|
||||
if (!RHSC->getAPInt().isPowerOf2())
|
||||
++MaxShiftAmt;
|
||||
IntegerType *ExtTy =
|
||||
IntegerType::get(getContext(), getTypeSizeInBits(Ty) + MaxShiftAmt);
|
||||
@ -2665,8 +2663,8 @@ const SCEV *ScalarEvolution::getUDivExpr(const SCEV *LHS,
|
||||
if (const SCEVConstant *Step =
|
||||
dyn_cast<SCEVConstant>(AR->getStepRecurrence(*this))) {
|
||||
// {X,+,N}/C --> {X/C,+,N/C} if safe and N/C can be folded.
|
||||
const APInt &StepInt = Step->getValue()->getValue();
|
||||
const APInt &DivInt = RHSC->getValue()->getValue();
|
||||
const APInt &StepInt = Step->getAPInt();
|
||||
const APInt &DivInt = RHSC->getAPInt();
|
||||
if (!StepInt.urem(DivInt) &&
|
||||
getZeroExtendExpr(AR, ExtTy) ==
|
||||
getAddRecExpr(getZeroExtendExpr(AR->getStart(), ExtTy),
|
||||
@ -2686,7 +2684,7 @@ const SCEV *ScalarEvolution::getUDivExpr(const SCEV *LHS,
|
||||
getAddRecExpr(getZeroExtendExpr(AR->getStart(), ExtTy),
|
||||
getZeroExtendExpr(Step, ExtTy),
|
||||
AR->getLoop(), SCEV::FlagAnyWrap)) {
|
||||
const APInt &StartInt = StartC->getValue()->getValue();
|
||||
const APInt &StartInt = StartC->getAPInt();
|
||||
const APInt &StartRem = StartInt.urem(StepInt);
|
||||
if (StartRem != 0)
|
||||
LHS = getAddRecExpr(getConstant(StartInt - StartRem), Step,
|
||||
@ -2753,8 +2751,8 @@ const SCEV *ScalarEvolution::getUDivExpr(const SCEV *LHS,
|
||||
}
|
||||
|
||||
static const APInt gcd(const SCEVConstant *C1, const SCEVConstant *C2) {
|
||||
APInt A = C1->getValue()->getValue().abs();
|
||||
APInt B = C2->getValue()->getValue().abs();
|
||||
APInt A = C1->getAPInt().abs();
|
||||
APInt B = C2->getAPInt().abs();
|
||||
uint32_t ABW = A.getBitWidth();
|
||||
uint32_t BBW = B.getBitWidth();
|
||||
|
||||
@ -2795,10 +2793,10 @@ const SCEV *ScalarEvolution::getUDivExactExpr(const SCEV *LHS,
|
||||
// check.
|
||||
APInt Factor = gcd(LHSCst, RHSCst);
|
||||
if (!Factor.isIntN(1)) {
|
||||
LHSCst = cast<SCEVConstant>(
|
||||
getConstant(LHSCst->getValue()->getValue().udiv(Factor)));
|
||||
RHSCst = cast<SCEVConstant>(
|
||||
getConstant(RHSCst->getValue()->getValue().udiv(Factor)));
|
||||
LHSCst =
|
||||
cast<SCEVConstant>(getConstant(LHSCst->getAPInt().udiv(Factor)));
|
||||
RHSCst =
|
||||
cast<SCEVConstant>(getConstant(RHSCst->getAPInt().udiv(Factor)));
|
||||
SmallVector<const SCEV *, 2> Operands;
|
||||
Operands.push_back(LHSCst);
|
||||
Operands.append(Mul->op_begin() + 1, Mul->op_end());
|
||||
@ -3014,9 +3012,8 @@ ScalarEvolution::getSMaxExpr(SmallVectorImpl<const SCEV *> &Ops) {
|
||||
assert(Idx < Ops.size());
|
||||
while (const SCEVConstant *RHSC = dyn_cast<SCEVConstant>(Ops[Idx])) {
|
||||
// We found two constants, fold them together!
|
||||
ConstantInt *Fold = ConstantInt::get(getContext(),
|
||||
APIntOps::smax(LHSC->getValue()->getValue(),
|
||||
RHSC->getValue()->getValue()));
|
||||
ConstantInt *Fold = ConstantInt::get(
|
||||
getContext(), APIntOps::smax(LHSC->getAPInt(), RHSC->getAPInt()));
|
||||
Ops[0] = getConstant(Fold);
|
||||
Ops.erase(Ops.begin()+1); // Erase the folded element
|
||||
if (Ops.size() == 1) return Ops[0];
|
||||
@ -3118,9 +3115,8 @@ ScalarEvolution::getUMaxExpr(SmallVectorImpl<const SCEV *> &Ops) {
|
||||
assert(Idx < Ops.size());
|
||||
while (const SCEVConstant *RHSC = dyn_cast<SCEVConstant>(Ops[Idx])) {
|
||||
// We found two constants, fold them together!
|
||||
ConstantInt *Fold = ConstantInt::get(getContext(),
|
||||
APIntOps::umax(LHSC->getValue()->getValue(),
|
||||
RHSC->getValue()->getValue()));
|
||||
ConstantInt *Fold = ConstantInt::get(
|
||||
getContext(), APIntOps::umax(LHSC->getAPInt(), RHSC->getAPInt()));
|
||||
Ops[0] = getConstant(Fold);
|
||||
Ops.erase(Ops.begin()+1); // Erase the folded element
|
||||
if (Ops.size() == 1) return Ops[0];
|
||||
@ -4110,7 +4106,7 @@ const SCEV *ScalarEvolution::createNodeForGEP(GEPOperator *GEP) {
|
||||
uint32_t
|
||||
ScalarEvolution::GetMinTrailingZeros(const SCEV *S) {
|
||||
if (const SCEVConstant *C = dyn_cast<SCEVConstant>(S))
|
||||
return C->getValue()->getValue().countTrailingZeros();
|
||||
return C->getAPInt().countTrailingZeros();
|
||||
|
||||
if (const SCEVTruncateExpr *T = dyn_cast<SCEVTruncateExpr>(S))
|
||||
return std::min(GetMinTrailingZeros(T->getOperand()),
|
||||
@ -4211,7 +4207,7 @@ ScalarEvolution::getRange(const SCEV *S,
|
||||
return I->second;
|
||||
|
||||
if (const SCEVConstant *C = dyn_cast<SCEVConstant>(S))
|
||||
return setRange(C, SignHint, ConstantRange(C->getValue()->getValue()));
|
||||
return setRange(C, SignHint, ConstantRange(C->getAPInt()));
|
||||
|
||||
unsigned BitWidth = getTypeSizeInBits(S->getType());
|
||||
ConstantRange ConservativeResult(BitWidth, /*isFullSet=*/true);
|
||||
@ -4289,9 +4285,8 @@ ScalarEvolution::getRange(const SCEV *S,
|
||||
if (AddRec->getNoWrapFlags(SCEV::FlagNUW))
|
||||
if (const SCEVConstant *C = dyn_cast<SCEVConstant>(AddRec->getStart()))
|
||||
if (!C->getValue()->isZero())
|
||||
ConservativeResult =
|
||||
ConservativeResult.intersectWith(
|
||||
ConstantRange(C->getValue()->getValue(), APInt(BitWidth, 0)));
|
||||
ConservativeResult = ConservativeResult.intersectWith(
|
||||
ConstantRange(C->getAPInt(), APInt(BitWidth, 0)));
|
||||
|
||||
// If there's no signed wrap, and all the operands have the same sign or
|
||||
// zero, the value won't ever change sign.
|
||||
@ -5487,7 +5482,7 @@ ScalarEvolution::computeExitLimitFromICmp(const Loop *L,
|
||||
if (AddRec->getLoop() == L) {
|
||||
// Form the constant range.
|
||||
ConstantRange CompRange(
|
||||
ICmpInst::makeConstantRange(Cond, RHSC->getValue()->getValue()));
|
||||
ICmpInst::makeConstantRange(Cond, RHSC->getAPInt()));
|
||||
|
||||
const SCEV *Ret = AddRec->getNumIterationsInRange(CompRange, *this);
|
||||
if (!isa<SCEVCouldNotCompute>(Ret)) return Ret;
|
||||
@ -6254,9 +6249,8 @@ const SCEV *ScalarEvolution::computeSCEVAtScope(const SCEV *V, const Loop *L) {
|
||||
// Okay, we know how many times the containing loop executes. If
|
||||
// this is a constant evolving PHI node, get the final value at
|
||||
// the specified iteration number.
|
||||
Constant *RV = getConstantEvolutionLoopExitValue(PN,
|
||||
BTCC->getValue()->getValue(),
|
||||
LI);
|
||||
Constant *RV =
|
||||
getConstantEvolutionLoopExitValue(PN, BTCC->getAPInt(), LI);
|
||||
if (RV) return getSCEV(RV);
|
||||
}
|
||||
}
|
||||
@ -6497,10 +6491,10 @@ SolveQuadraticEquation(const SCEVAddRecExpr *AddRec, ScalarEvolution &SE) {
|
||||
return std::make_pair(CNC, CNC);
|
||||
}
|
||||
|
||||
uint32_t BitWidth = LC->getValue()->getValue().getBitWidth();
|
||||
const APInt &L = LC->getValue()->getValue();
|
||||
const APInt &M = MC->getValue()->getValue();
|
||||
const APInt &N = NC->getValue()->getValue();
|
||||
uint32_t BitWidth = LC->getAPInt().getBitWidth();
|
||||
const APInt &L = LC->getAPInt();
|
||||
const APInt &M = MC->getAPInt();
|
||||
const APInt &N = NC->getAPInt();
|
||||
APInt Two(BitWidth, 2);
|
||||
APInt Four(BitWidth, 4);
|
||||
|
||||
@ -6632,7 +6626,7 @@ ScalarEvolution::HowFarToZero(const SCEV *V, const Loop *L, bool ControlsExit) {
|
||||
// For negative steps (counting down to zero):
|
||||
// N = Start/-Step
|
||||
// First compute the unsigned distance from zero in the direction of Step.
|
||||
bool CountDown = StepC->getValue()->getValue().isNegative();
|
||||
bool CountDown = StepC->getAPInt().isNegative();
|
||||
const SCEV *Distance = CountDown ? Start : getNegativeSCEV(Start);
|
||||
|
||||
// Handle unitary steps, which cannot wraparound.
|
||||
@ -6657,7 +6651,7 @@ ScalarEvolution::HowFarToZero(const SCEV *V, const Loop *L, bool ControlsExit) {
|
||||
// done by counting and comparing the number of trailing zeros of Step and
|
||||
// Distance.
|
||||
if (!CountDown) {
|
||||
const APInt &StepV = StepC->getValue()->getValue();
|
||||
const APInt &StepV = StepC->getAPInt();
|
||||
// StepV.isPowerOf2() returns true if StepV is an positive power of two. It
|
||||
// also returns true if StepV is maximally negative (eg, INT_MIN), but that
|
||||
// case is not handled as this code is guarded by !CountDown.
|
||||
@ -6719,8 +6713,7 @@ ScalarEvolution::HowFarToZero(const SCEV *V, const Loop *L, bool ControlsExit) {
|
||||
|
||||
// Then, try to solve the above equation provided that Start is constant.
|
||||
if (const SCEVConstant *StartC = dyn_cast<SCEVConstant>(Start))
|
||||
return SolveLinEquationWithOverflow(StepC->getValue()->getValue(),
|
||||
-StartC->getValue()->getValue(),
|
||||
return SolveLinEquationWithOverflow(StepC->getAPInt(), -StartC->getAPInt(),
|
||||
*this);
|
||||
return getCouldNotCompute();
|
||||
}
|
||||
@ -6843,7 +6836,7 @@ bool ScalarEvolution::SimplifyICmpOperands(ICmpInst::Predicate &Pred,
|
||||
// If there's a constant operand, canonicalize comparisons with boundary
|
||||
// cases, and canonicalize *-or-equal comparisons to regular comparisons.
|
||||
if (const SCEVConstant *RC = dyn_cast<SCEVConstant>(RHS)) {
|
||||
const APInt &RA = RC->getValue()->getValue();
|
||||
const APInt &RA = RC->getAPInt();
|
||||
switch (Pred) {
|
||||
default: llvm_unreachable("Unexpected ICmpInst::Predicate value!");
|
||||
case ICmpInst::ICMP_EQ:
|
||||
@ -7353,7 +7346,7 @@ bool ScalarEvolution::isKnownPredicateViaNoOverflow(ICmpInst::Predicate Pred,
|
||||
!isa<SCEVConstant>(ConstOp) || NonConstOp != X)
|
||||
return false;
|
||||
|
||||
OutY = cast<SCEVConstant>(ConstOp)->getValue()->getValue();
|
||||
OutY = cast<SCEVConstant>(ConstOp)->getAPInt();
|
||||
return (FlagsPresent & ExpectedFlags) == ExpectedFlags;
|
||||
};
|
||||
|
||||
@ -7715,7 +7708,7 @@ bool ScalarEvolution::isImpliedCond(ICmpInst::Predicate Pred, const SCEV *LHS,
|
||||
APInt Min = ICmpInst::isSigned(Pred) ?
|
||||
getSignedRange(V).getSignedMin() : getUnsignedRange(V).getUnsignedMin();
|
||||
|
||||
if (Min == C->getValue()->getValue()) {
|
||||
if (Min == C->getAPInt()) {
|
||||
// Given (V >= Min && V != Min) we conclude V >= (Min + 1).
|
||||
// This is true even if (Min + 1) wraps around -- in case of
|
||||
// wraparound, (Min + 1) < Min, so (V >= Min => V >= (Min + 1)).
|
||||
@ -7807,8 +7800,8 @@ bool ScalarEvolution::computeConstantDifference(const SCEV *Less,
|
||||
}
|
||||
|
||||
if (isa<SCEVConstant>(Less) && isa<SCEVConstant>(More)) {
|
||||
const auto &M = cast<SCEVConstant>(More)->getValue()->getValue();
|
||||
const auto &L = cast<SCEVConstant>(Less)->getValue()->getValue();
|
||||
const auto &M = cast<SCEVConstant>(More)->getAPInt();
|
||||
const auto &L = cast<SCEVConstant>(Less)->getAPInt();
|
||||
C = M - L;
|
||||
return true;
|
||||
}
|
||||
@ -7818,14 +7811,14 @@ bool ScalarEvolution::computeConstantDifference(const SCEV *Less,
|
||||
if (splitBinaryAdd(Less, L, R, Flags))
|
||||
if (const auto *LC = dyn_cast<SCEVConstant>(L))
|
||||
if (R == More) {
|
||||
C = -(LC->getValue()->getValue());
|
||||
C = -(LC->getAPInt());
|
||||
return true;
|
||||
}
|
||||
|
||||
if (splitBinaryAdd(More, L, R, Flags))
|
||||
if (const auto *LC = dyn_cast<SCEVConstant>(L))
|
||||
if (R == Less) {
|
||||
C = LC->getValue()->getValue();
|
||||
C = LC->getAPInt();
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -8105,7 +8098,7 @@ bool ScalarEvolution::isImpliedCondOperandsViaRanges(ICmpInst::Predicate Pred,
|
||||
!isa<SCEVConstant>(AddLHS->getOperand(0)))
|
||||
return false;
|
||||
|
||||
APInt ConstFoundRHS = cast<SCEVConstant>(FoundRHS)->getValue()->getValue();
|
||||
APInt ConstFoundRHS = cast<SCEVConstant>(FoundRHS)->getAPInt();
|
||||
|
||||
// `FoundLHSRange` is the range we know `FoundLHS` to be in by virtue of the
|
||||
// antecedent "`FoundLHS` `Pred` `FoundRHS`".
|
||||
@ -8114,13 +8107,12 @@ bool ScalarEvolution::isImpliedCondOperandsViaRanges(ICmpInst::Predicate Pred,
|
||||
|
||||
// Since `LHS` is `FoundLHS` + `AddLHS->getOperand(0)`, we can compute a range
|
||||
// for `LHS`:
|
||||
APInt Addend =
|
||||
cast<SCEVConstant>(AddLHS->getOperand(0))->getValue()->getValue();
|
||||
APInt Addend = cast<SCEVConstant>(AddLHS->getOperand(0))->getAPInt();
|
||||
ConstantRange LHSRange = FoundLHSRange.add(ConstantRange(Addend));
|
||||
|
||||
// We can also compute the range of values for `LHS` that satisfy the
|
||||
// consequent, "`LHS` `Pred` `RHS`":
|
||||
APInt ConstRHS = cast<SCEVConstant>(RHS)->getValue()->getValue();
|
||||
APInt ConstRHS = cast<SCEVConstant>(RHS)->getAPInt();
|
||||
ConstantRange SatisfyingLHSRange =
|
||||
ConstantRange::makeSatisfyingICmpRegion(Pred, ConstRHS);
|
||||
|
||||
@ -8244,7 +8236,7 @@ ScalarEvolution::HowManyLessThans(const SCEV *LHS, const SCEV *RHS,
|
||||
// overflow, in which case if RHS - Start is a constant, we don't need to
|
||||
// do a max operation since we can just figure it out statically
|
||||
if (NoWrap && isa<SCEVConstant>(Diff)) {
|
||||
APInt D = dyn_cast<const SCEVConstant>(Diff)->getValue()->getValue();
|
||||
APInt D = dyn_cast<const SCEVConstant>(Diff)->getAPInt();
|
||||
if (D.isNegative())
|
||||
End = Start;
|
||||
} else
|
||||
@ -8325,7 +8317,7 @@ ScalarEvolution::HowManyGreaterThans(const SCEV *LHS, const SCEV *RHS,
|
||||
// overflow, in which case if RHS - Start is a constant, we don't need to
|
||||
// do a max operation since we can just figure it out statically
|
||||
if (NoWrap && isa<SCEVConstant>(Diff)) {
|
||||
APInt D = dyn_cast<const SCEVConstant>(Diff)->getValue()->getValue();
|
||||
APInt D = dyn_cast<const SCEVConstant>(Diff)->getAPInt();
|
||||
if (!D.isNegative())
|
||||
End = Start;
|
||||
} else
|
||||
@ -8385,7 +8377,7 @@ const SCEV *SCEVAddRecExpr::getNumIterationsInRange(ConstantRange Range,
|
||||
getNoWrapFlags(FlagNW));
|
||||
if (const auto *ShiftedAddRec = dyn_cast<SCEVAddRecExpr>(Shifted))
|
||||
return ShiftedAddRec->getNumIterationsInRange(
|
||||
Range.subtract(SC->getValue()->getValue()), SE);
|
||||
Range.subtract(SC->getAPInt()), SE);
|
||||
// This is strange and shouldn't happen.
|
||||
return SE.getCouldNotCompute();
|
||||
}
|
||||
@ -8413,7 +8405,7 @@ const SCEV *SCEVAddRecExpr::getNumIterationsInRange(ConstantRange Range,
|
||||
// If A is negative then the lower of the range is the last possible loop
|
||||
// value. Also note that we already checked for a full range.
|
||||
APInt One(BitWidth,1);
|
||||
APInt A = cast<SCEVConstant>(getOperand(1))->getValue()->getValue();
|
||||
APInt A = cast<SCEVConstant>(getOperand(1))->getAPInt();
|
||||
APInt End = A.sge(One) ? (Range.getUpper() - One) : Range.getLower();
|
||||
|
||||
// The exit value should be (End+A)/A.
|
||||
@ -8464,7 +8456,7 @@ const SCEV *SCEVAddRecExpr::getNumIterationsInRange(ConstantRange Range,
|
||||
if (Range.contains(R1Val->getValue())) {
|
||||
// The next iteration must be out of the range...
|
||||
ConstantInt *NextVal =
|
||||
ConstantInt::get(SE.getContext(), R1->getValue()->getValue()+1);
|
||||
ConstantInt::get(SE.getContext(), R1->getAPInt() + 1);
|
||||
|
||||
R1Val = EvaluateConstantChrecAtConstant(this, NextVal, SE);
|
||||
if (!Range.contains(R1Val->getValue()))
|
||||
@ -8475,7 +8467,7 @@ const SCEV *SCEVAddRecExpr::getNumIterationsInRange(ConstantRange Range,
|
||||
// If R1 was not in the range, then it is a good return value. Make
|
||||
// sure that R1-1 WAS in the range though, just in case.
|
||||
ConstantInt *NextVal =
|
||||
ConstantInt::get(SE.getContext(), R1->getValue()->getValue()-1);
|
||||
ConstantInt::get(SE.getContext(), R1->getAPInt() - 1);
|
||||
R1Val = EvaluateConstantChrecAtConstant(this, NextVal, SE);
|
||||
if (Range.contains(R1Val->getValue()))
|
||||
return R1;
|
||||
|
@ -246,19 +246,15 @@ static bool FactorOutConstant(const SCEV *&S, const SCEV *&Remainder,
|
||||
// Check for divisibility.
|
||||
if (const SCEVConstant *FC = dyn_cast<SCEVConstant>(Factor)) {
|
||||
ConstantInt *CI =
|
||||
ConstantInt::get(SE.getContext(),
|
||||
C->getValue()->getValue().sdiv(
|
||||
FC->getValue()->getValue()));
|
||||
ConstantInt::get(SE.getContext(), C->getAPInt().sdiv(FC->getAPInt()));
|
||||
// If the quotient is zero and the remainder is non-zero, reject
|
||||
// the value at this scale. It will be considered for subsequent
|
||||
// smaller scales.
|
||||
if (!CI->isZero()) {
|
||||
const SCEV *Div = SE.getConstant(CI);
|
||||
S = Div;
|
||||
Remainder =
|
||||
SE.getAddExpr(Remainder,
|
||||
SE.getConstant(C->getValue()->getValue().srem(
|
||||
FC->getValue()->getValue())));
|
||||
Remainder = SE.getAddExpr(
|
||||
Remainder, SE.getConstant(C->getAPInt().srem(FC->getAPInt())));
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@ -271,10 +267,9 @@ static bool FactorOutConstant(const SCEV *&S, const SCEV *&Remainder,
|
||||
// of the given factor. If so, we can factor it.
|
||||
const SCEVConstant *FC = cast<SCEVConstant>(Factor);
|
||||
if (const SCEVConstant *C = dyn_cast<SCEVConstant>(M->getOperand(0)))
|
||||
if (!C->getValue()->getValue().srem(FC->getValue()->getValue())) {
|
||||
if (!C->getAPInt().srem(FC->getAPInt())) {
|
||||
SmallVector<const SCEV *, 4> NewMulOps(M->op_begin(), M->op_end());
|
||||
NewMulOps[0] = SE.getConstant(
|
||||
C->getValue()->getValue().sdiv(FC->getValue()->getValue()));
|
||||
NewMulOps[0] = SE.getConstant(C->getAPInt().sdiv(FC->getAPInt()));
|
||||
S = SE.getMulExpr(NewMulOps);
|
||||
return true;
|
||||
}
|
||||
@ -793,7 +788,7 @@ Value *SCEVExpander::visitUDivExpr(const SCEVUDivExpr *S) {
|
||||
|
||||
Value *LHS = expandCodeFor(S->getLHS(), Ty);
|
||||
if (const SCEVConstant *SC = dyn_cast<SCEVConstant>(S->getRHS())) {
|
||||
const APInt &RHS = SC->getValue()->getValue();
|
||||
const APInt &RHS = SC->getAPInt();
|
||||
if (RHS.isPowerOf2())
|
||||
return InsertBinop(Instruction::LShr, LHS,
|
||||
ConstantInt::get(Ty, RHS.logBase2()));
|
||||
@ -1892,7 +1887,7 @@ bool SCEVExpander::isHighCostExpansionHelper(
|
||||
// integer, consider the division cheap irrespective of whether it occurs in
|
||||
// the user code since it can be lowered into a right shift.
|
||||
if (auto *SC = dyn_cast<SCEVConstant>(UDivExpr->getRHS()))
|
||||
if (SC->getValue()->getValue().isPowerOf2()) {
|
||||
if (SC->getAPInt().isPowerOf2()) {
|
||||
const DataLayout &DL =
|
||||
L->getHeader()->getParent()->getParent()->getDataLayout();
|
||||
unsigned Width = cast<IntegerType>(UDivExpr->getType())->getBitWidth();
|
||||
|
@ -324,8 +324,7 @@ Value *llvm::getStrideFromPointer(Value *Ptr, ScalarEvolution *SE, Loop *Lp) {
|
||||
if (M->getOperand(0)->getSCEVType() != scConstant)
|
||||
return nullptr;
|
||||
|
||||
const APInt &APStepVal =
|
||||
cast<SCEVConstant>(M->getOperand(0))->getValue()->getValue();
|
||||
const APInt &APStepVal = cast<SCEVConstant>(M->getOperand(0))->getAPInt();
|
||||
|
||||
// Huge step value - give up.
|
||||
if (APStepVal.getBitWidth() > 64)
|
||||
|
@ -253,8 +253,7 @@ bool AlignmentFromAssumptions::extractAlignmentInfo(CallInst *I,
|
||||
|
||||
// The mask must have some trailing ones (otherwise the condition is
|
||||
// trivial and tells us nothing about the alignment of the left operand).
|
||||
unsigned TrailingOnes =
|
||||
MaskSCEV->getValue()->getValue().countTrailingOnes();
|
||||
unsigned TrailingOnes = MaskSCEV->getAPInt().countTrailingOnes();
|
||||
if (!TrailingOnes)
|
||||
return false;
|
||||
|
||||
|
@ -1943,8 +1943,8 @@ linearFunctionTestReplace(Loop *L,
|
||||
const SCEV *ARStep = AR->getStepRecurrence(*SE);
|
||||
// For constant IVCount, avoid truncation.
|
||||
if (isa<SCEVConstant>(ARStart) && isa<SCEVConstant>(IVCount)) {
|
||||
const APInt &Start = cast<SCEVConstant>(ARStart)->getValue()->getValue();
|
||||
APInt Count = cast<SCEVConstant>(IVCount)->getValue()->getValue();
|
||||
const APInt &Start = cast<SCEVConstant>(ARStart)->getAPInt();
|
||||
APInt Count = cast<SCEVConstant>(IVCount)->getAPInt();
|
||||
// Note that the post-inc value of BackedgeTakenCount may have overflowed
|
||||
// above such that IVCount is now zero.
|
||||
if (IVCount != BackedgeTakenCount && Count == 0) {
|
||||
|
@ -222,7 +222,7 @@ bool LoopIdiomRecognize::runOnCountableLoop() {
|
||||
// If this loop executes exactly one time, then it should be peeled, not
|
||||
// optimized by this pass.
|
||||
if (const SCEVConstant *BECst = dyn_cast<SCEVConstant>(BECount))
|
||||
if (BECst->getValue()->getValue() == 0)
|
||||
if (BECst->getAPInt() == 0)
|
||||
return false;
|
||||
|
||||
SmallVector<BasicBlock *, 8> ExitBlocks;
|
||||
@ -253,7 +253,7 @@ static unsigned getStoreSizeInBytes(StoreInst *SI, const DataLayout *DL) {
|
||||
|
||||
static unsigned getStoreStride(const SCEVAddRecExpr *StoreEv) {
|
||||
const SCEVConstant *ConstStride = cast<SCEVConstant>(StoreEv->getOperand(1));
|
||||
return ConstStride->getValue()->getValue().getZExtValue();
|
||||
return ConstStride->getAPInt().getZExtValue();
|
||||
}
|
||||
|
||||
bool LoopIdiomRecognize::isLegalStore(StoreInst *SI) {
|
||||
|
@ -82,7 +82,7 @@ struct StoreToLoadForwardingCandidate {
|
||||
// dependence wouldn't be valid if these weren't monotonic accesses.
|
||||
auto *Dist = cast<SCEVConstant>(
|
||||
PSE.getSE()->getMinusSCEV(StorePtrSCEV, LoadPtrSCEV));
|
||||
const APInt &Val = Dist->getValue()->getValue();
|
||||
const APInt &Val = Dist->getAPInt();
|
||||
return Val.abs() == TypeByteSize;
|
||||
}
|
||||
|
||||
|
@ -480,7 +480,7 @@ void LoopReroll::collectPossibleIVs(Loop *L,
|
||||
continue;
|
||||
if (const SCEVConstant *IncSCEV =
|
||||
dyn_cast<SCEVConstant>(PHISCEV->getStepRecurrence(*SE))) {
|
||||
const APInt &AInt = IncSCEV->getValue()->getValue().abs();
|
||||
const APInt &AInt = IncSCEV->getAPInt().abs();
|
||||
if (IncSCEV->getValue()->isZero() || AInt.uge(MaxInc))
|
||||
continue;
|
||||
IVToIncMap[&*I] = IncSCEV->getValue()->getSExtValue();
|
||||
|
@ -544,7 +544,7 @@ static const SCEV *getExactSDiv(const SCEV *LHS, const SCEV *RHS,
|
||||
// Handle a few RHS special cases.
|
||||
const SCEVConstant *RC = dyn_cast<SCEVConstant>(RHS);
|
||||
if (RC) {
|
||||
const APInt &RA = RC->getValue()->getValue();
|
||||
const APInt &RA = RC->getAPInt();
|
||||
// Handle x /s -1 as x * -1, to give ScalarEvolution a chance to do
|
||||
// some folding.
|
||||
if (RA.isAllOnesValue())
|
||||
@ -558,8 +558,8 @@ static const SCEV *getExactSDiv(const SCEV *LHS, const SCEV *RHS,
|
||||
if (const SCEVConstant *C = dyn_cast<SCEVConstant>(LHS)) {
|
||||
if (!RC)
|
||||
return nullptr;
|
||||
const APInt &LA = C->getValue()->getValue();
|
||||
const APInt &RA = RC->getValue()->getValue();
|
||||
const APInt &LA = C->getAPInt();
|
||||
const APInt &RA = RC->getAPInt();
|
||||
if (LA.srem(RA) != 0)
|
||||
return nullptr;
|
||||
return SE.getConstant(LA.sdiv(RA));
|
||||
@ -623,7 +623,7 @@ static const SCEV *getExactSDiv(const SCEV *LHS, const SCEV *RHS,
|
||||
/// value, and mutate S to point to a new SCEV with that value excluded.
|
||||
static int64_t ExtractImmediate(const SCEV *&S, ScalarEvolution &SE) {
|
||||
if (const SCEVConstant *C = dyn_cast<SCEVConstant>(S)) {
|
||||
if (C->getValue()->getValue().getMinSignedBits() <= 64) {
|
||||
if (C->getAPInt().getMinSignedBits() <= 64) {
|
||||
S = SE.getConstant(C->getType(), 0);
|
||||
return C->getValue()->getSExtValue();
|
||||
}
|
||||
@ -2401,14 +2401,14 @@ void LSRInstance::CollectInterestingTypesAndFactors() {
|
||||
if (const SCEVConstant *Factor =
|
||||
dyn_cast_or_null<SCEVConstant>(getExactSDiv(NewStride, OldStride,
|
||||
SE, true))) {
|
||||
if (Factor->getValue()->getValue().getMinSignedBits() <= 64)
|
||||
Factors.insert(Factor->getValue()->getValue().getSExtValue());
|
||||
if (Factor->getAPInt().getMinSignedBits() <= 64)
|
||||
Factors.insert(Factor->getAPInt().getSExtValue());
|
||||
} else if (const SCEVConstant *Factor =
|
||||
dyn_cast_or_null<SCEVConstant>(getExactSDiv(OldStride,
|
||||
NewStride,
|
||||
SE, true))) {
|
||||
if (Factor->getValue()->getValue().getMinSignedBits() <= 64)
|
||||
Factors.insert(Factor->getValue()->getValue().getSExtValue());
|
||||
if (Factor->getAPInt().getMinSignedBits() <= 64)
|
||||
Factors.insert(Factor->getAPInt().getSExtValue());
|
||||
}
|
||||
}
|
||||
|
||||
@ -2831,7 +2831,7 @@ static bool canFoldIVIncExpr(const SCEV *IncExpr, Instruction *UserInst,
|
||||
if (!IncConst || !isAddressUse(UserInst, Operand))
|
||||
return false;
|
||||
|
||||
if (IncConst->getValue()->getValue().getMinSignedBits() > 64)
|
||||
if (IncConst->getAPInt().getMinSignedBits() > 64)
|
||||
return false;
|
||||
|
||||
MemAccessTy AccessTy = getAccessType(UserInst);
|
||||
@ -3773,10 +3773,9 @@ void LSRInstance::GenerateCrossUseConstantOffsets() {
|
||||
// value to the immediate would produce a value closer to zero than the
|
||||
// immediate itself, then the formula isn't worthwhile.
|
||||
if (const SCEVConstant *C = dyn_cast<SCEVConstant>(NewF.ScaledReg))
|
||||
if (C->getValue()->isNegative() !=
|
||||
(NewF.BaseOffset < 0) &&
|
||||
(C->getValue()->getValue().abs() * APInt(BitWidth, F.Scale))
|
||||
.ule(std::abs(NewF.BaseOffset)))
|
||||
if (C->getValue()->isNegative() != (NewF.BaseOffset < 0) &&
|
||||
(C->getAPInt().abs() * APInt(BitWidth, F.Scale))
|
||||
.ule(std::abs(NewF.BaseOffset)))
|
||||
continue;
|
||||
|
||||
// OK, looks good.
|
||||
@ -3804,11 +3803,11 @@ void LSRInstance::GenerateCrossUseConstantOffsets() {
|
||||
// zero than the immediate itself, then the formula isn't worthwhile.
|
||||
for (const SCEV *NewReg : NewF.BaseRegs)
|
||||
if (const SCEVConstant *C = dyn_cast<SCEVConstant>(NewReg))
|
||||
if ((C->getValue()->getValue() + NewF.BaseOffset).abs().slt(
|
||||
std::abs(NewF.BaseOffset)) &&
|
||||
(C->getValue()->getValue() +
|
||||
NewF.BaseOffset).countTrailingZeros() >=
|
||||
countTrailingZeros<uint64_t>(NewF.BaseOffset))
|
||||
if ((C->getAPInt() + NewF.BaseOffset)
|
||||
.abs()
|
||||
.slt(std::abs(NewF.BaseOffset)) &&
|
||||
(C->getAPInt() + NewF.BaseOffset).countTrailingZeros() >=
|
||||
countTrailingZeros<uint64_t>(NewF.BaseOffset))
|
||||
goto skip_formula;
|
||||
|
||||
// Ok, looks good.
|
||||
|
@ -4682,7 +4682,7 @@ void InterleavedAccessInfo::analyzeInterleaving(
|
||||
if (!DistToA)
|
||||
continue;
|
||||
|
||||
int DistanceToA = DistToA->getValue()->getValue().getSExtValue();
|
||||
int DistanceToA = DistToA->getAPInt().getSExtValue();
|
||||
|
||||
// Skip if the distance is not multiple of size as they are not in the
|
||||
// same group.
|
||||
@ -5304,7 +5304,7 @@ static bool isLikelyComplexAddressComputation(Value *Ptr,
|
||||
if (!C)
|
||||
return true;
|
||||
|
||||
const APInt &APStepVal = C->getValue()->getValue();
|
||||
const APInt &APStepVal = C->getAPInt();
|
||||
|
||||
// Huge step value - give up.
|
||||
if (APStepVal.getBitWidth() > 64)
|
||||
|
Loading…
Reference in New Issue
Block a user