30#include "llvm/ADT/SmallVector.h"
31#include "llvm/Analysis/LoopInfo.h"
32#include "llvm/Analysis/ScalarEvolution.h"
37#pragma clang diagnostic push
38#pragma clang diagnostic ignored "-Wunused-variable"
40#pragma GCC diagnostic push
41#pragma GCC diagnostic ignored "-Wunused-variable"
44#if LLVM_VERSION_MAJOR <= 22
45#define SCEVUse const SCEV *
55 const Loop *L, Value *ExitCond,
bool ExitIfTrue,
bool ControlsExit,
56 bool AllowPredicates) {
57 ScalarEvolution::ExitLimitCacheTy Cache(L, ExitIfTrue, AllowPredicates);
59 ControlsExit, AllowPredicates);
63 llvm::TargetLibraryInfo &TLI,
64 llvm::AssumptionCache &AC,
65 llvm::DominatorTree &DT,
67 : ScalarEvolution(F, TLI, AC, DT, LI),
71 const Loop *L, BasicBlock *ExitingBlock,
bool AllowPredicates) {
73 SmallVector<BasicBlock *, 8> ExitingBlocks;
74 L->getExitingBlocks(ExitingBlocks);
75 for (
auto &ExitingBlock : ExitingBlocks) {
76 BasicBlock *Exit =
nullptr;
77 for (
auto *SBB : successors(ExitingBlock)) {
78 if (!L->contains(SBB)) {
86 ExitingBlock =
nullptr;
89 std::remove(ExitingBlocks.begin(), ExitingBlocks.end(),
nullptr),
92 assert(L->contains(ExitingBlock) &&
"Exit count for non-loop block?");
95 const BasicBlock *Latch = L->getLoopLatch();
96 if (!Latch || !DT.dominates(ExitingBlock, Latch))
97 return getCouldNotCompute();
99 bool IsOnlyExit = ExitingBlocks.size() == 1;
100 auto *Term = ExitingBlock->getTerminator();
101 if (Instruction *BI =
102 (
isAnyBranch(Term) ? cast<Instruction>(Term) :
nullptr)) {
104 bool ExitIfTrue = !L->contains(BI->getSuccessor(0));
105 assert(ExitIfTrue == L->contains(BI->getSuccessor(1)) &&
106 "It should have one successor in loop and one exit block!");
113 if (SwitchInst *SI = dyn_cast<SwitchInst>(Term)) {
115 BasicBlock *Exit =
nullptr;
116 for (
auto *SBB : successors(ExitingBlock))
117 if (!L->contains(SBB)) {
121 return getCouldNotCompute();
124 assert(Exit &&
"Exiting block must have at least one exit");
129 return getCouldNotCompute();
132ScalarEvolution::ExitLimit
134 const Loop *L, SwitchInst *Switch, BasicBlock *ExitingBlock,
135 bool ControlsOnlyExit) {
136 assert(!L->contains(ExitingBlock) &&
"Not an exiting block!");
139 if (Switch->getDefaultDest() == ExitingBlock)
140 return getCouldNotCompute();
144 assert(L->contains(Switch->getDefaultDest()) &&
145 "Default case must not exit the loop!");
146 const SCEV *LHS = getSCEVAtScope(Switch->getCondition(), L);
147 const SCEV *RHS = getConstant(Switch->findCaseDest(ExitingBlock));
150 ExitLimit EL = howFarToZero(getMinusSCEV(LHS, RHS), L, ControlsOnlyExit);
154 return getCouldNotCompute();
157ScalarEvolution::ExitLimit
159 ExitLimitCacheTy &Cache,
const Loop *L, Value *ExitCond,
bool ExitIfTrue,
160 bool ControlsExit,
bool AllowPredicates) {
163 Cache.find(L, ExitCond, ExitIfTrue, ControlsExit, AllowPredicates))
167 ControlsExit, AllowPredicates);
168 Cache.insert(L, ExitCond, ExitIfTrue, ControlsExit, AllowPredicates, EL);
172ScalarEvolution::ExitLimit
174 ExitLimitCacheTy &Cache,
const Loop *L, Value *ExitCond,
bool ExitIfTrue,
175 bool ControlsExit,
bool AllowPredicates) {
177 if (BinaryOperator *BO = dyn_cast<BinaryOperator>(ExitCond)) {
178 if (BO->getOpcode() == Instruction::And) {
180 bool EitherMayExit = !ExitIfTrue;
182 Cache, L, BO->getOperand(0), ExitIfTrue,
183 ControlsExit && !EitherMayExit, AllowPredicates);
185 Cache, L, BO->getOperand(1), ExitIfTrue,
186 ControlsExit && !EitherMayExit, AllowPredicates);
187 const SCEV *BECount = getCouldNotCompute();
188 const SCEV *MaxBECount = getCouldNotCompute();
192 if (EL0.ExactNotTaken == getCouldNotCompute() ||
193 EL1.ExactNotTaken == getCouldNotCompute())
194 BECount = getCouldNotCompute();
197 getUMinFromMismatchedTypes(EL0.ExactNotTaken, EL1.ExactNotTaken);
198#if LLVM_VERSION_MAJOR >= 16
199 if (EL0.ConstantMaxNotTaken == getCouldNotCompute())
200 MaxBECount = EL1.ConstantMaxNotTaken;
201 else if (EL1.ConstantMaxNotTaken == getCouldNotCompute())
202 MaxBECount = EL0.ConstantMaxNotTaken;
204 MaxBECount = getUMinFromMismatchedTypes(EL0.ConstantMaxNotTaken,
205 EL1.ConstantMaxNotTaken);
209 if (EL0.ConstantMaxNotTaken == EL1.ConstantMaxNotTaken)
210 MaxBECount = EL0.ConstantMaxNotTaken;
211 if (EL0.ExactNotTaken == EL1.ExactNotTaken)
212 BECount = EL0.ExactNotTaken;
215 if (EL0.MaxNotTaken == getCouldNotCompute())
216 MaxBECount = EL1.MaxNotTaken;
217 else if (EL1.MaxNotTaken == getCouldNotCompute())
218 MaxBECount = EL0.MaxNotTaken;
221 getUMinFromMismatchedTypes(EL0.MaxNotTaken, EL1.MaxNotTaken);
225 if (EL0.MaxNotTaken == EL1.MaxNotTaken)
226 MaxBECount = EL0.MaxNotTaken;
227 if (EL0.ExactNotTaken == EL1.ExactNotTaken)
228 BECount = EL0.ExactNotTaken;
236 if (isa<SCEVCouldNotCompute>(MaxBECount) &&
237 !isa<SCEVCouldNotCompute>(BECount))
238 MaxBECount = getConstant(getUnsignedRangeMax(BECount));
240#if LLVM_VERSION_MAJOR >= 20
241 return ExitLimit(BECount, MaxBECount, MaxBECount,
false,
242 {ArrayRef(EL0.Predicates), ArrayRef(EL1.Predicates)});
243#elif LLVM_VERSION_MAJOR >= 16
244 return ExitLimit(BECount, MaxBECount, MaxBECount,
false,
245 {&EL0.Predicates, &EL1.Predicates});
247 return ExitLimit(BECount, MaxBECount,
false,
248 {&EL0.Predicates, &EL1.Predicates});
251 if (BO->getOpcode() == Instruction::Or) {
253 bool EitherMayExit = ExitIfTrue;
255 Cache, L, BO->getOperand(0), ExitIfTrue,
256 ControlsExit && !EitherMayExit, AllowPredicates);
258 Cache, L, BO->getOperand(1), ExitIfTrue,
259 ControlsExit && !EitherMayExit, AllowPredicates);
260 const SCEV *BECount = getCouldNotCompute();
261 const SCEV *MaxBECount = getCouldNotCompute();
265 if (EL0.ExactNotTaken == getCouldNotCompute() ||
266 EL1.ExactNotTaken == getCouldNotCompute())
267 BECount = getCouldNotCompute();
270 getUMinFromMismatchedTypes(EL0.ExactNotTaken, EL1.ExactNotTaken);
271#if LLVM_VERSION_MAJOR >= 16
272 if (EL0.ConstantMaxNotTaken == getCouldNotCompute())
273 MaxBECount = EL1.ConstantMaxNotTaken;
274 else if (EL1.ConstantMaxNotTaken == getCouldNotCompute())
275 MaxBECount = EL0.ConstantMaxNotTaken;
277 MaxBECount = getUMinFromMismatchedTypes(EL0.ConstantMaxNotTaken,
278 EL1.ConstantMaxNotTaken);
282 if (EL0.ConstantMaxNotTaken == EL1.ConstantMaxNotTaken)
283 MaxBECount = EL0.ConstantMaxNotTaken;
284 if (EL0.ExactNotTaken == EL1.ExactNotTaken)
285 BECount = EL0.ExactNotTaken;
287#if LLVM_VERSION_MAJOR >= 20
288 return ExitLimit(BECount, MaxBECount, MaxBECount,
false,
289 {ArrayRef(EL0.Predicates), ArrayRef(EL1.Predicates)});
291 return ExitLimit(BECount, MaxBECount, MaxBECount,
false,
292 {&EL0.Predicates, &EL1.Predicates});
295 if (EL0.MaxNotTaken == getCouldNotCompute())
296 MaxBECount = EL1.MaxNotTaken;
297 else if (EL1.MaxNotTaken == getCouldNotCompute())
298 MaxBECount = EL0.MaxNotTaken;
301 getUMinFromMismatchedTypes(EL0.MaxNotTaken, EL1.MaxNotTaken);
305 if (EL0.MaxNotTaken == EL1.MaxNotTaken)
306 MaxBECount = EL0.MaxNotTaken;
307 if (EL0.ExactNotTaken == EL1.ExactNotTaken)
308 BECount = EL0.ExactNotTaken;
310 return ExitLimit(BECount, MaxBECount,
false,
311 {&EL0.Predicates, &EL1.Predicates});
318 if (ICmpInst *ExitCondICmp = dyn_cast<ICmpInst>(ExitCond)) {
320 computeExitLimitFromICmp(L, ExitCondICmp, ExitIfTrue, ControlsExit);
321 if (EL.hasFullInfo() || !AllowPredicates)
325 return computeExitLimitFromICmp(L, ExitCondICmp, ExitIfTrue, ControlsExit,
333 if (ConstantInt *CI = dyn_cast<ConstantInt>(ExitCond)) {
334 if (ExitIfTrue == !CI->getZExtValue())
336 return getCouldNotCompute();
339 return getZero(CI->getType());
343 return computeExitCountExhaustively(L, ExitCond, ExitIfTrue);
347 const Loop *L, ICmpInst *ExitCond,
bool ExitIfTrue,
bool ControlsExit,
348 bool AllowPredicates) {
350#if LLVM_VERSION_MAJOR >= 20
351 llvm::CmpPredicate Pred = ExitCond->getPredicate();
353 auto Pred = ExitCond->getPredicate();
356 Pred = ExitCond->getInversePredicate();
357 const auto OriginalPred = Pred;
359#if LLVM_VERSION_MAJOR < 14
361 if (LoadInst *LI = dyn_cast<LoadInst>(ExitCond->getOperand(0)))
362 if (Constant *RHS = dyn_cast<Constant>(ExitCond->getOperand(1))) {
363 ExitLimit ItCnt = computeLoadConstantCompareExitLimit(LI, RHS, L, Pred);
364 if (ItCnt.hasAnyInfo())
369 SCEVUse LHS = getSCEV(ExitCond->getOperand(0));
370 SCEVUse RHS = getSCEV(ExitCond->getOperand(1));
372#define PROP_PHI(LHS) \
373 if (auto un = dyn_cast<SCEVUnknown>(LHS)) { \
374 if (auto pn = dyn_cast_or_null<PHINode>(un->getValue())) { \
375 const SCEV *sc = nullptr; \
376 bool failed = false; \
377 for (auto &a : pn->incoming_values()) { \
378 auto subsc = getSCEV(a); \
379 if (sc == nullptr) { \
397 LHS = getSCEVAtScope(LHS, L);
398 RHS = getSCEVAtScope(RHS, L);
402 if (isLoopInvariant(LHS, L) && !isLoopInvariant(RHS, L)) {
405 Pred = ICmpInst::getSwappedPredicate(Pred);
409 (void)SimplifyICmpOperands(Pred, LHS, RHS);
413 if (
const SCEVConstant *RHSC = dyn_cast<SCEVConstant>(RHS))
414 if (
const SCEVAddRecExpr *AddRec = dyn_cast<SCEVAddRecExpr>(LHS))
415 if (AddRec->getLoop() == L) {
417 ConstantRange CompRange =
418 ConstantRange::makeExactICmpRegion(Pred, RHSC->getAPInt());
420 const SCEV *Ret = AddRec->getNumIterationsInRange(CompRange, *
this);
421 if (!isa<SCEVCouldNotCompute>(Ret))
426 case ICmpInst::ICMP_NE: {
429 howFarToZero(getMinusSCEV(LHS, RHS), L, ControlsExit, AllowPredicates);
434 case ICmpInst::ICMP_EQ: {
436 ExitLimit EL = howFarToNonZero(getMinusSCEV(LHS, RHS), L);
441 case ICmpInst::ICMP_SLT:
442 case ICmpInst::ICMP_ULT:
443 case ICmpInst::ICMP_SLE:
444 case ICmpInst::ICMP_ULE: {
445 bool IsSigned = Pred == ICmpInst::ICMP_SLT || Pred == ICmpInst::ICMP_SLE;
447 if (Pred == ICmpInst::ICMP_SLE || Pred == ICmpInst::ICMP_ULE) {
448 if (!isa<IntegerType>(RHS->getType()))
450 SmallVector<SCEVUse, 2> sv = {
452 getConstant(ConstantInt::get(cast<IntegerType>(RHS->getType()), 1))};
456 RHS = getAddExpr(sv, SCEV::FlagNSW);
458 RHS = getAddExpr(sv, SCEV::FlagNUW);
466 case ICmpInst::ICMP_SGT:
467 case ICmpInst::ICMP_UGT:
468 case ICmpInst::ICMP_SGE:
469 case ICmpInst::ICMP_UGE: {
470 bool IsSigned = Pred == ICmpInst::ICMP_SGT || Pred == ICmpInst::ICMP_SGE;
471 if (Pred == ICmpInst::ICMP_SGE || Pred == ICmpInst::ICMP_UGE) {
472 if (!isa<IntegerType>(RHS->getType()))
474 SmallVector<SCEVUse, 2> sv = {
476 getConstant(ConstantInt::get(cast<IntegerType>(RHS->getType()), -1,
481 RHS = getAddExpr(sv, SCEV::FlagNSW);
483 RHS = getAddExpr(sv, SCEV::FlagNUW);
485#if LLVM_VERSION_MAJOR >= 24
486 ExitLimit EL = ScalarEvolution::howManyLessThans(
487 LHS, RHS, L, IsSigned,
true, ControlsExit, AllowPredicates);
489 ExitLimit EL = howManyGreaterThans(LHS, RHS, L, IsSigned, ControlsExit,
500 auto *ExhaustiveCount = computeExitCountExhaustively(L, ExitCond, ExitIfTrue);
502 if (!isa<SCEVCouldNotCompute>(ExhaustiveCount))
503 return ExhaustiveCount;
505 return computeShiftCompareExitLimit(ExitCond->getOperand(0),
506 ExitCond->getOperand(1), L, OriginalPred);
509#if LLVM_VERSION_MAJOR >= 13
510static const SCEV *getSignedOverflowLimitForStep(
const SCEV *Step,
511 ICmpInst::Predicate *Pred,
512 ScalarEvolution *SE) {
513 unsigned BitWidth = SE->getTypeSizeInBits(Step->getType());
514 if (SE->isKnownPositive(Step)) {
515 *Pred = ICmpInst::ICMP_SLT;
516 return SE->getConstant(APInt::getSignedMinValue(BitWidth) -
517 SE->getSignedRangeMax(Step));
519 if (SE->isKnownNegative(Step)) {
520 *Pred = ICmpInst::ICMP_SGT;
521 return SE->getConstant(APInt::getSignedMaxValue(BitWidth) -
522 SE->getSignedRangeMin(Step));
526static const SCEV *getUnsignedOverflowLimitForStep(
const SCEV *Step,
527 ICmpInst::Predicate *Pred,
528 ScalarEvolution *SE) {
529 unsigned BitWidth = SE->getTypeSizeInBits(Step->getType());
530 *Pred = ICmpInst::ICMP_ULT;
532 return SE->getConstant(APInt::getMinValue(BitWidth) -
533 SE->getUnsignedRangeMax(Step));
540using WrapFlagsTy = std::remove_cv_t<
decltype(SCEV::FlagNSW)>;
544struct ExtendOpTraitsBase {
545#if LLVM_VERSION_MAJOR >= 24
546 typedef const SCEV *(ScalarEvolution::*GetExtendExprTy)(
SCEVUse, Type *,
549 typedef const SCEV *(ScalarEvolution::*GetExtendExprTy)(
const SCEV *, Type *,
555template <
typename ExtendOp>
struct ExtendOpTraits {
568struct ExtendOpTraits<SCEVSignExtendExpr> :
public ExtendOpTraitsBase {
569 static const WrapFlagsTy WrapType = SCEV::FlagNSW;
571 static const GetExtendExprTy GetExtendExpr;
573 static const SCEV *getOverflowLimitForStep(
const SCEV *Step,
574 ICmpInst::Predicate *Pred,
575 ScalarEvolution *SE) {
576 return getSignedOverflowLimitForStep(Step, Pred, SE);
580const ExtendOpTraitsBase::GetExtendExprTy
581 ExtendOpTraits<SCEVSignExtendExpr>::GetExtendExpr =
582 &ScalarEvolution::getSignExtendExpr;
585struct ExtendOpTraits<SCEVZeroExtendExpr> :
public ExtendOpTraitsBase {
586 static const WrapFlagsTy WrapType = SCEV::FlagNUW;
588 static const GetExtendExprTy GetExtendExpr;
590 static const SCEV *getOverflowLimitForStep(
const SCEV *Step,
591 ICmpInst::Predicate *Pred,
592 ScalarEvolution *SE) {
593 return getUnsignedOverflowLimitForStep(Step, Pred, SE);
597const ExtendOpTraitsBase::GetExtendExprTy
598 ExtendOpTraits<SCEVZeroExtendExpr>::GetExtendExpr =
599 &ScalarEvolution::getZeroExtendExpr;
603static bool hasFlags(WrapFlagsTy Flags, WrapFlagsTy TestFlags) {
604 return TestFlags == ScalarEvolution::maskFlags(Flags, TestFlags);
607template <
typename ExtendOpTy>
608static const SCEV *getPreStartForExtend(
const SCEVAddRecExpr *AR, Type *Ty,
609 ScalarEvolution *SE,
unsigned Depth) {
610 auto WrapType = ExtendOpTraits<ExtendOpTy>::WrapType;
611 auto GetExtendExpr = ExtendOpTraits<ExtendOpTy>::GetExtendExpr;
613 const Loop *L = AR->getLoop();
614 const SCEV *Start = AR->getStart();
615 const SCEV *Step = AR->getStepRecurrence(*SE);
618 const SCEVAddExpr *SA = dyn_cast<SCEVAddExpr>(Start);
625 SmallVector<SCEVUse, 4> DiffOps;
626 for (
const SCEV *Op : SA->operands())
628 DiffOps.push_back(Op);
630 if (DiffOps.size() == SA->getNumOperands())
638 ScalarEvolution::maskFlags(SA->getNoWrapFlags(), SCEV::FlagNUW);
639 const SCEV *PreStart = SE->getAddExpr(DiffOps, PreStartFlags);
640 const SCEVAddRecExpr *PreAR = dyn_cast<SCEVAddRecExpr>(
641#
if LLVM_VERSION_MAJOR >= 24
642 SE->getAddRecExpr(PreStart, Step, L, SCEV::FlagNone));
644 SE->getAddRecExpr(PreStart, Step, L, SCEV::FlagAnyWrap));
651 const SCEV *BECount = SE->getBackedgeTakenCount(L);
652#if LLVM_VERSION_MAJOR >= 23
653 if (PreAR && any(PreAR->getNoWrapFlags(WrapType)) &&
654 !isa<SCEVCouldNotCompute>(BECount) && SE->isKnownPositive(BECount))
657 if (PreAR && PreAR->getNoWrapFlags(WrapType) &&
658 !isa<SCEVCouldNotCompute>(BECount) && SE->isKnownPositive(BECount))
663 unsigned BitWidth = SE->getTypeSizeInBits(AR->getType());
664 Type *WideTy = IntegerType::get(SE->getContext(), BitWidth * 2);
665 const SCEV *OperandExtendedStart =
666 SE->getAddExpr((SE->*GetExtendExpr)(PreStart, WideTy, Depth),
667 (SE->*GetExtendExpr)(Step, WideTy, Depth));
668 if ((SE->*GetExtendExpr)(Start, WideTy, Depth) == OperandExtendedStart) {
669#if LLVM_VERSION_MAJOR >= 23
670 if (PreAR && any(AR->getNoWrapFlags(WrapType)))
672 if (PreAR && AR->getNoWrapFlags(WrapType))
678 SE->setNoWrapFlags(
const_cast<SCEVAddRecExpr *
>(PreAR), WrapType);
684 ICmpInst::Predicate Pred;
685 const SCEV *OverflowLimit =
686 ExtendOpTraits<ExtendOpTy>::getOverflowLimitForStep(Step, &Pred, SE);
689 SE->isLoopEntryGuardedByCond(L, Pred, PreStart, OverflowLimit))
695template <
typename ExtendOpTy>
696static const SCEV *getExtendAddRecStart(
const SCEVAddRecExpr *AR, Type *Ty,
697 ScalarEvolution *SE,
unsigned Depth) {
698 auto GetExtendExpr = ExtendOpTraits<ExtendOpTy>::GetExtendExpr;
700 const SCEV *PreStart = getPreStartForExtend<ExtendOpTy>(AR, Ty, SE, Depth);
702 return (SE->*GetExtendExpr)(AR->getStart(), Ty, Depth);
704 return SE->getAddExpr(
705 (SE->*GetExtendExpr)(AR->getStepRecurrence(*SE), Ty, Depth),
706 (SE->*GetExtendExpr)(PreStart, Ty, Depth));
709static WrapFlagsTy StrengthenNoWrapFlags(ScalarEvolution *SE, SCEVTypes Type,
710 const ArrayRef<const SCEV *> Ops,
712 using namespace std::placeholders;
714 using OBO = OverflowingBinaryOperator;
717 Type == scAddExpr || Type == scAddRecExpr || Type == scMulExpr;
719 assert(CanAnalyze &&
"don't call from other places!");
721 auto SignOrUnsignMask = SCEV::FlagNUW | SCEV::FlagNSW;
722 WrapFlagsTy SignOrUnsignWrap =
723 ScalarEvolution::maskFlags(Flags, SignOrUnsignMask);
726 auto IsKnownNonNegative = [&](
const SCEV *S) {
727 return SE->isKnownNonNegative(S);
730 if (SignOrUnsignWrap == SCEV::FlagNSW && all_of(Ops, IsKnownNonNegative))
731 Flags = ScalarEvolution::setFlags(Flags, (WrapFlagsTy)SignOrUnsignMask);
733 SignOrUnsignWrap = ScalarEvolution::maskFlags(Flags, SignOrUnsignMask);
735 if (SignOrUnsignWrap != SignOrUnsignMask &&
736 (Type == scAddExpr || Type == scMulExpr) && Ops.size() == 2 &&
737 isa<SCEVConstant>(Ops[0])) {
742 return Instruction::Add;
744 return Instruction::Mul;
746 llvm_unreachable(
"Unexpected SCEV op.");
750 const APInt &C = cast<SCEVConstant>(Ops[0])->getAPInt();
753 if (!(SignOrUnsignWrap & SCEV::FlagNSW)) {
754 auto NSWRegion = ConstantRange::makeGuaranteedNoWrapRegion(
755 Opcode, C, OBO::NoSignedWrap);
756 if (NSWRegion.contains(SE->getSignedRange(Ops[1])))
757 Flags = ScalarEvolution::setFlags(Flags, SCEV::FlagNSW);
761 if (!(SignOrUnsignWrap & SCEV::FlagNUW)) {
762 auto NUWRegion = ConstantRange::makeGuaranteedNoWrapRegion(
763 Opcode, C, OBO::NoUnsignedWrap);
764 if (NUWRegion.contains(SE->getUnsignedRange(Ops[1])))
765 Flags = ScalarEvolution::setFlags(Flags, SCEV::FlagNUW);
771 if (Type == scAddRecExpr && hasFlags(Flags, SCEV::FlagNW) &&
772 !hasFlags(Flags, SCEV::FlagNUW) && Ops.size() == 2 && Ops[0]->isZero() &&
773 IsKnownNonNegative(Ops[1]))
774 Flags = ScalarEvolution::setFlags(Flags, SCEV::FlagNUW);
777 if (Type == scMulExpr && !hasFlags(Flags, SCEV::FlagNUW) && Ops.size() == 2) {
778 if (
auto *UDiv = dyn_cast<SCEVUDivExpr>(Ops[0]))
779 if (UDiv->getOperand(1) == Ops[1])
780 Flags = ScalarEvolution::setFlags(Flags, SCEV::FlagNUW);
781 if (
auto *UDiv = dyn_cast<SCEVUDivExpr>(Ops[1]))
782 if (UDiv->getOperand(1) == Ops[0])
783 Flags = ScalarEvolution::setFlags(Flags, SCEV::FlagNUW);
790 const SCEV *LHS,
const SCEV *RHS,
const Loop *L,
bool IsSigned,
791 bool ControlsExit,
bool AllowPredicates) {
792#if LLVM_VERSION_MAJOR >= 20
793 SmallVector<const SCEVPredicate *, 4> Predicates;
795 SmallPtrSet<const SCEVPredicate *, 4> Predicates;
798 const SCEVAddRecExpr *IV = dyn_cast<SCEVAddRecExpr>(LHS);
799 bool PredicatedIV =
false;
801 auto canAssumeNoSelfWrap = [&](
const SCEVAddRecExpr *AR) {
816 if (!isLoopInvariant(RHS, L))
819 auto *StrideC = dyn_cast<SCEVConstant>(AR->getStepRecurrence(*
this));
820 if (!StrideC || !StrideC->getAPInt().isPowerOf2())
823 if (!ControlsExit || !loopHasNoAbnormalExits(L))
830 if (
auto *ZExt = dyn_cast<SCEVZeroExtendExpr>(LHS)) {
831 const SCEVAddRecExpr *AR = dyn_cast<SCEVAddRecExpr>(ZExt->getOperand());
832 if (AR && AR->getLoop() == L && AR->isAffine()) {
833 auto Flags = AR->getNoWrapFlags();
834 if (!hasFlags(Flags, SCEV::FlagNW) && canAssumeNoSelfWrap(AR)) {
835 Flags = setFlags(Flags, SCEV::FlagNW);
837 SmallVector<const SCEV *, 4> Operands{AR->operands()};
838 Flags = StrengthenNoWrapFlags(
this, scAddRecExpr, Operands, Flags);
840 setNoWrapFlags(
const_cast<SCEVAddRecExpr *
>(AR), Flags);
842 if (AR->hasNoUnsignedWrap()) {
845 const SCEV *Step = AR->getStepRecurrence(*
this);
846 Type *Ty = ZExt->getType();
847 auto S = getAddRecExpr(
848 getExtendAddRecStart<SCEVZeroExtendExpr>(AR, Ty,
this, 0),
849 getZeroExtendExpr(Step, Ty, 0), L, AR->getNoWrapFlags());
850 IV = dyn_cast<SCEVAddRecExpr>(S);
856 if (!IV && AllowPredicates) {
860 IV = convertSCEVToAddRecWithPredicates(LHS, L, Predicates);
865 if (!IV || IV->getLoop() != L || !IV->isAffine())
866 return getCouldNotCompute();
878 auto WrapType = IsSigned ? SCEV::FlagNSW : SCEV::FlagNUW;
880#if LLVM_VERSION_MAJOR >= 23
881 bool NoWrap = ControlsExit && any(IV->getNoWrapFlags(WrapType));
883 bool NoWrap = ControlsExit && IV->getNoWrapFlags(WrapType);
886 ICmpInst::Predicate Cond = IsSigned ? ICmpInst::ICMP_SLT : ICmpInst::ICMP_ULT;
888 const SCEV *Stride = IV->getStepRecurrence(*
this);
890 bool PositiveStride = isKnownPositive(Stride);
893 if (!PositiveStride) {
927 !loopHasNoAbnormalExits(L)) {
928 return getCouldNotCompute();
935 if (IsSigned && isKnownNonPositive(Stride))
936 return getCouldNotCompute();
938 if (!isKnownNonZero(Stride)) {
942 if (!isLoopInvariant(RHS, L))
943 return getCouldNotCompute();
953 auto wouldZeroStrideBeUB = [&]() {
962 auto *StartIfZero = getMinusSCEV(IV->getStart(), Stride);
963 return isLoopEntryGuardedByCond(L, Cond, StartIfZero, RHS);
965 if (!wouldZeroStrideBeUB()) {
966 Stride = getUMaxExpr(Stride, getOne(Stride->getType()));
969 }
else if (!Stride->isOne() && !NoWrap) {
970 auto isUBOnWrap = [&]() {
976 return canAssumeNoSelfWrap(IV);
983 if (canIVOverflowOnLT(RHS, Stride, IsSigned) && !isUBOnWrap())
984 return getCouldNotCompute();
996 const SCEV *Start = IV->getStart();
1002 const SCEV *OrigStart = Start;
1003 const SCEV *OrigRHS = RHS;
1004#if LLVM_VERSION_MAJOR >= 24
1005 if (Start->getType()->isPointerTy()) {
1006 Start = getPtrToAddrExpr(Start);
1007 if (isa<SCEVCouldNotCompute>(Start))
1010 if (RHS->getType()->isPointerTy()) {
1011 RHS = getPtrToAddrExpr(RHS);
1012 if (isa<SCEVCouldNotCompute>(RHS))
1016 if (Start->getType()->isPointerTy()) {
1017 Start = getLosslessPtrToIntExpr(Start);
1018 if (isa<SCEVCouldNotCompute>(Start))
1021 if (RHS->getType()->isPointerTy()) {
1022 RHS = getLosslessPtrToIntExpr(RHS);
1023 if (isa<SCEVCouldNotCompute>(RHS))
1033 if (!isLoopInvariant(RHS, L)) {
1034#if LLVM_VERSION_MAJOR >= 24
1035 const SCEV *MaxBECount = computeMaxBECountForLT(
1036 Start, Stride, RHS, getTypeSizeInBits(LHS->getType()), IsSigned,
1039 const SCEV *MaxBECount = computeMaxBECountForLT(
1040 Start, Stride, RHS, getTypeSizeInBits(LHS->getType()), IsSigned);
1042#if LLVM_VERSION_MAJOR >= 16
1043 return ExitLimit(getCouldNotCompute() , MaxBECount,
1044 MaxBECount,
false , Predicates);
1046 return ExitLimit(getCouldNotCompute() , MaxBECount,
1047 false , Predicates);
1055 const SCEV *BECount =
nullptr;
1056 auto *OrigStartMinusStride = getMinusSCEV(OrigStart, Stride);
1057 assert(isAvailableAtLoopEntry(OrigStartMinusStride, L) &&
"Must be!");
1058 assert(isAvailableAtLoopEntry(OrigStart, L) &&
"Must be!");
1059 assert(isAvailableAtLoopEntry(OrigRHS, L) &&
"Must be!");
1061 if (isLoopEntryGuardedByCond(L, Cond, OrigStartMinusStride, OrigStart) &&
1062 isLoopEntryGuardedByCond(L, Cond, OrigStartMinusStride, OrigRHS)) {
1081 const SCEV *MinusOne = getMinusOne(Stride->getType());
1082 const SCEV *Numerator =
1083 getMinusSCEV(getAddExpr(RHS, MinusOne), getMinusSCEV(Start, Stride));
1084 BECount = getUDivExpr(Numerator, Stride);
1087 const SCEV *BECountIfBackedgeTaken =
nullptr;
1089 auto canProveRHSGreaterThanEqualStart = [&]() {
1090 auto CondGE = IsSigned ? ICmpInst::ICMP_SGE : ICmpInst::ICMP_UGE;
1091 if (isLoopEntryGuardedByCond(L, CondGE, OrigRHS, OrigStart))
1103 auto CondGT = IsSigned ? ICmpInst::ICMP_SGT : ICmpInst::ICMP_UGT;
1104 auto StartMinusOne =
1105 getAddExpr(OrigStart, getMinusOne(OrigStart->getType()));
1106 return isLoopEntryGuardedByCond(L, CondGT, OrigRHS, StartMinusOne);
1112 if (canProveRHSGreaterThanEqualStart()) {
1123 End = IsSigned ? getSMaxExpr(RHS, Start) : getUMaxExpr(RHS, Start);
1127 BECountIfBackedgeTaken =
1128 getUDivCeilSCEV(getMinusSCEV(RHS, Start), Stride);
1142 const SCEV *One = getOne(Stride->getType());
1143 bool MayAddOverflow = [&] {
1144 if (
auto *StrideC = dyn_cast<SCEVConstant>(Stride)) {
1145 if (StrideC->getAPInt().isPowerOf2()) {
1190 if (Start == Stride || Start == getMinusSCEV(Stride, One)) {
1201 const SCEV *Delta = getMinusSCEV(End, Start);
1202 if (!MayAddOverflow) {
1206 getUDivExpr(getAddExpr(Delta, getMinusSCEV(Stride, One)), Stride);
1208 BECount = getUDivCeilSCEV(Delta, Stride);
1212 const SCEV *MaxBECount;
1213 bool MaxOrZero =
false;
1214 if (isa<SCEVConstant>(BECount)) {
1215 MaxBECount = BECount;
1216 }
else if (BECountIfBackedgeTaken &&
1217 isa<SCEVConstant>(BECountIfBackedgeTaken)) {
1221 MaxBECount = BECountIfBackedgeTaken;
1224#if LLVM_VERSION_MAJOR >= 24
1225 MaxBECount = computeMaxBECountForLT(
1226 Start, Stride, RHS, getTypeSizeInBits(LHS->getType()), IsSigned,
1229 MaxBECount = computeMaxBECountForLT(
1230 Start, Stride, RHS, getTypeSizeInBits(LHS->getType()), IsSigned);
1234 if (isa<SCEVCouldNotCompute>(MaxBECount) &&
1235 !isa<SCEVCouldNotCompute>(BECount))
1236 MaxBECount = getConstant(getUnsignedRangeMax(BECount));
1237#if LLVM_VERSION_MAJOR >= 16
1238 return ExitLimit(BECount, MaxBECount, MaxBECount, MaxOrZero, Predicates);
1240 return ExitLimit(BECount, MaxBECount, MaxOrZero, Predicates);
1245 const SCEV *LHS,
const SCEV *RHS,
const Loop *L,
bool IsSigned,
1246 bool ControlsExit,
bool AllowPredicates) {
1247 SmallPtrSet<const SCEVPredicate *, 4> Predicates;
1249 const SCEVAddRecExpr *IV = dyn_cast<SCEVAddRecExpr>(LHS);
1251 if (!IV && AllowPredicates) {
1255 IV = convertSCEVToAddRecWithPredicates(LHS, L, Predicates);
1259 if (!IV || IV->getLoop() != L || !IV->isAffine())
1260 return getCouldNotCompute();
1262 bool NoWrap = ControlsExit &&
true;
1265 const SCEV *Stride = IV->getStepRecurrence(*
this);
1267 bool PositiveStride = isKnownPositive(Stride);
1270 if (!PositiveStride) {
1314 return getCouldNotCompute();
1315 }
else if (!Stride->isOne() &&
1316 doesIVOverflowOnLT(RHS, Stride, IsSigned, NoWrap))
1321 return getCouldNotCompute();
1323 ICmpInst::Predicate Cond = IsSigned ? ICmpInst::ICMP_SLT : ICmpInst::ICMP_ULT;
1324 const SCEV *Start = IV->getStart();
1325 const SCEV *End = RHS;
1331 if (!isLoopInvariant(RHS, L)) {
1332 const SCEV *MaxBECount = computeMaxBECountForLT(
1333 Start, Stride, RHS, getTypeSizeInBits(LHS->getType()), IsSigned);
1334 return ExitLimit(getCouldNotCompute() , MaxBECount,
1335 false , Predicates);
1341 const SCEV *BECountIfBackedgeTaken =
1342 computeBECount(getMinusSCEV(End, Start), Stride,
false);
1350 const SCEV *BECount;
1351 if (isLoopEntryGuardedByCond(L, Cond, getMinusSCEV(Start, Stride), RHS))
1352 BECount = BECountIfBackedgeTaken;
1354 End = IsSigned ? getSMaxExpr(RHS, Start) : getUMaxExpr(RHS, Start);
1355 BECount = computeBECount(getMinusSCEV(End, Start), Stride,
false);
1358 const SCEV *MaxBECount;
1359 bool MaxOrZero =
false;
1360 if (isa<SCEVConstant>(BECount))
1361 MaxBECount = BECount;
1362 else if (isa<SCEVConstant>(BECountIfBackedgeTaken)) {
1366 MaxBECount = BECountIfBackedgeTaken;
1369 MaxBECount = computeMaxBECountForLT(
1370 Start, Stride, RHS, getTypeSizeInBits(LHS->getType()), IsSigned);
1373 if (isa<SCEVCouldNotCompute>(MaxBECount) &&
1374 !isa<SCEVCouldNotCompute>(BECount))
1375 MaxBECount = getConstant(getUnsignedRangeMax(BECount));
1377 return ExitLimit(BECount, MaxBECount, MaxOrZero, Predicates);
1381#pragma clang diagnostic pop
1383#pragma GCC diagnostic pop
static llvm::SmallPtrSet< llvm::BasicBlock *, 4 > getGuaranteedUnreachable(llvm::Function *F)
static bool isConditionalBranch(const llvm::Value *V)
static llvm::Value * getBranchCondition(llvm::Value *V)
The condition of a branch isConditionalBranch says yes to.
static bool isAnyBranch(const llvm::Value *V)
ScalarEvolution::ExitLimit howManyLessThans(const llvm::SCEV *LHS, const llvm::SCEV *RHS, const llvm::Loop *L, bool IsSigned, bool ControlsExit, bool AllowPredicates)
llvm::SmallPtrSet< llvm::BasicBlock *, 4 > GuaranteedUnreachable
ScalarEvolution::ExitLimit computeExitLimitFromICmp(const llvm::Loop *L, llvm::ICmpInst *ExitCond, bool ExitIfTrue, bool ControlsExit, bool AllowPredicates=false)
ScalarEvolution::ExitLimit computeExitLimitFromCond(const llvm::Loop *L, llvm::Value *ExitCond, bool ExitIfTrue, bool ControlsExit, bool AllowPredicates)
ScalarEvolution::ExitLimit computeExitLimitFromSingleExitSwitch(const llvm::Loop *L, llvm::SwitchInst *Switch, llvm::BasicBlock *ExitingBB, bool IsSubExpr)
ScalarEvolution::ExitLimit computeExitLimit(const llvm::Loop *L, llvm::BasicBlock *ExitingBlock, bool AllowPredicates)
ScalarEvolution::ExitLimit computeExitLimitFromCondCached(ExitLimitCacheTy &Cache, const llvm::Loop *L, llvm::Value *ExitCond, bool ExitIfTrue, bool ControlsExit, bool AllowPredicates)
ScalarEvolution::ExitLimit computeExitLimitFromCondImpl(ExitLimitCacheTy &Cache, const llvm::Loop *L, llvm::Value *ExitCond, bool ExitIfTrue, bool ControlsExit, bool AllowPredicates)
MustExitScalarEvolution(llvm::Function &F, llvm::TargetLibraryInfo &TLI, llvm::AssumptionCache &AC, llvm::DominatorTree &DT, llvm::LoopInfo &LI)
bool loopIsFiniteByAssumption(const llvm::Loop *L)