Use *CheckUse = nullptr;
static bool parseRangeCheckICmp(Loop *L, ICmpInst *ICI, ScalarEvolution &SE,
- const SCEV *&Index, const SCEV *&End);
+ const SCEVAddRecExpr *&Index,
+ const SCEV *&End);
static void
extractRangeChecksFromCond(Loop *L, ScalarEvolution &SE, Use &ConditionUse,
/// is being range checked.
bool InductiveRangeCheck::parseRangeCheckICmp(Loop *L, ICmpInst *ICI,
ScalarEvolution &SE,
- const SCEV *&Index,
+ const SCEVAddRecExpr *&Index,
const SCEV *&End) {
auto IsLoopInvariant = [&SE, L](Value *V) {
return SE.isLoopInvariant(SE.getSCEV(V), L);
// Both LHS and RHS are loop variant
return false;
+ const auto *AddRec = dyn_cast<SCEVAddRecExpr>(SE.getSCEV(LHS));
+ if (!AddRec)
+ return false;
+
// We strengthen "0 <= I" to "0 <= I < INT_SMAX" and "I < L" to "0 <= I < L".
// We can potentially do much better here.
// If we want to adjust upper bound for the unsigned range check as we do it
case ICmpInst::ICMP_SGE:
if (match(RHS, m_ConstantInt<0>())) {
- Index = SE.getSCEV(LHS);
+ Index = AddRec;
End = SIntMaxSCEV(Index->getType());
return true;
}
case ICmpInst::ICMP_SGT:
if (match(RHS, m_ConstantInt<-1>())) {
- Index = SE.getSCEV(LHS);
+ Index = AddRec;
End = SIntMaxSCEV(Index->getType());
return true;
}
case ICmpInst::ICMP_SLT:
case ICmpInst::ICMP_ULT:
- Index = SE.getSCEV(LHS);
+ Index = AddRec;
End = SE.getSCEV(RHS);
return true;
const SCEV *RHSS = SE.getSCEV(RHS);
bool Signed = Pred == ICmpInst::ICMP_SLE;
if (SE.willNotOverflow(Instruction::BinaryOps::Add, Signed, RHSS, One)) {
- Index = SE.getSCEV(LHS);
+ Index = AddRec;
End = SE.getAddExpr(RHSS, One);
return true;
}
if (!ICI)
return;
- const SCEV *End = nullptr, *Index = nullptr;
- if (!parseRangeCheckICmp(L, ICI, SE, Index, End))
+ const SCEV *End = nullptr;
+ const SCEVAddRecExpr *IndexAddRec = nullptr;
+ if (!parseRangeCheckICmp(L, ICI, SE, IndexAddRec, End))
return;
- assert(Index && "Index was not computed");
+ assert(IndexAddRec && "IndexAddRec was not computed");
assert(End && "End was not computed");
- const auto *IndexAddRec = dyn_cast<SCEVAddRecExpr>(Index);
- bool IsAffineIndex =
- IndexAddRec && (IndexAddRec->getLoop() == L) && IndexAddRec->isAffine();
-
- if (!IsAffineIndex)
+ if ((IndexAddRec->getLoop() != L) || !IndexAddRec->isAffine())
return;
InductiveRangeCheck IRC;