84#define DEBUG_TYPE "indvars"
87STATISTIC(NumReplaced ,
"Number of exit values replaced");
88STATISTIC(NumLFTR ,
"Number of loop exit tests replaced");
89STATISTIC(NumElimExt ,
"Number of IV sign/zero extends eliminated");
90STATISTIC(NumElimIV ,
"Number of congruent IVs eliminated");
94 cl::desc(
"Choose the strategy to replace exit value in IndVarSimplify"),
98 "only replace exit value when the cost is cheap"),
101 "only replace exit value when it is an unused "
102 "induction variable in the loop and has cheap replacement cost"),
104 "only replace exit values when loop def likely dead"),
106 "always replace exit value whenever possible")));
110 cl::desc(
"Use post increment control-dependent ranges in IndVarSimplify"),
115 cl::desc(
"Disable Linear Function Test Replace optimization"));
119 cl::desc(
"Predicate conditions in read only loops"));
123 cl::desc(
"Predicate conditions that trap in loops with only local writes"));
127 cl::desc(
"Allow widening of indvars to eliminate s/zext"));
131class IndVarSimplify {
138 std::unique_ptr<MemorySSAUpdater> MSSAU;
143 bool RunUnswitching =
false;
146 bool rewriteNonIntegerIVs(
Loop *L);
152 bool canonicalizeExitCondition(
Loop *L);
159 bool rewriteFirstIterationLoopExitValues(
Loop *L);
162 const SCEV *ExitCount,
165 bool sinkUnusedInvariants(
Loop *L);
171 : LI(LI), SE(SE), DT(DT),
DL(
DL), TLI(TLI),
TTI(
TTI),
172 WidenIndVars(WidenIndVars) {
174 MSSAU = std::make_unique<MemorySSAUpdater>(MSSA);
179 bool runUnswitching()
const {
return RunUnswitching; }
190 bool isExact =
false;
209bool IndVarSimplify::handleFloatingPointIV(
Loop *L,
PHINode *PN) {
211 unsigned BackEdge = IncomingEdge^1;
217 if (!InitValueVal || !
ConvertToSInt(InitValueVal->getValueAPF(), InitValue))
223 if (Incr ==
nullptr || Incr->getOpcode() != Instruction::FAdd)
return false;
229 if (IncValueVal ==
nullptr || Incr->getOperand(0) != PN ||
235 Value::user_iterator IncrUse = Incr->user_begin();
237 if (IncrUse == Incr->user_end())
return false;
239 if (IncrUse != Incr->user_end())
return false;
246 if (!Compare || !
Compare->hasOneUse() ||
266 if (ExitValueVal ==
nullptr ||
272 switch (
Compare->getPredicate()) {
273 default:
return false;
306 if (InitValue >= ExitValue)
309 uint32_t
Range = uint32_t(ExitValue-InitValue);
313 if (++
Range == 0)
return false;
316 unsigned Leftover =
Range % uint32_t(IncValue);
327 if (Leftover != 0 && int32_t(ExitValue+IncValue) < ExitValue)
332 if (InitValue <= ExitValue)
335 uint32_t
Range = uint32_t(InitValue-ExitValue);
339 if (++
Range == 0)
return false;
342 unsigned Leftover =
Range % uint32_t(-IncValue);
353 if (Leftover != 0 && int32_t(ExitValue+IncValue) > ExitValue)
368 Incr->
getName() +
".int", Incr->getIterator());
372 ICmpInst *NewCompare =
new ICmpInst(
379 WeakTrackingVH WeakPH = PN;
384 Compare->replaceAllUsesWith(NewCompare);
408bool IndVarSimplify::rewriteNonIntegerIVs(Loop *L) {
417 for (WeakTrackingVH &
PHI : PHIs)
419 Changed |= handleFloatingPointIV(L, PN);
438bool IndVarSimplify::rewriteFirstIterationLoopExitValues(Loop *L) {
442 SmallVector<BasicBlock *, 8> ExitBlocks;
443 L->getUniqueExitBlocks(ExitBlocks);
445 bool MadeAnyChanges =
false;
446 for (
auto *ExitBB : ExitBlocks) {
449 for (PHINode &PN : ExitBB->phis()) {
451 IncomingValIdx !=
E; ++IncomingValIdx) {
459 if (!
L->getLoopLatch() ||
460 !DT->
dominates(IncomingBB,
L->getLoopLatch()))
470 Cond = BI->getCondition();
472 Cond =
SI->getCondition();
476 if (!
L->isLoopInvariant(
Cond))
482 if (!ExitVal || ExitVal->getParent() !=
L->getHeader())
488 auto *LoopPreheader =
L->getLoopPreheader();
489 assert(LoopPreheader &&
"Invalid loop");
490 int PreheaderIdx = ExitVal->getBasicBlockIndex(LoopPreheader);
491 if (PreheaderIdx != -1) {
492 assert(ExitVal->getParent() ==
L->getHeader() &&
493 "ExitVal must be in loop header");
494 MadeAnyChanges =
true;
496 ExitVal->getIncomingValue(PreheaderIdx));
502 return MadeAnyChanges;
515 bool IsSigned = Cast->
getOpcode() == Instruction::SExt;
516 if (!IsSigned && Cast->
getOpcode() != Instruction::ZExt)
529 if (NarrowIVWidth >= Width)
539 TTI->getArithmeticInstrCost(Instruction::Add, Ty) >
540 TTI->getArithmeticInstrCost(Instruction::Add,
569class IndVarSimplifyVisitor :
public IVVisitor {
571 const TargetTransformInfo *
TTI;
577 IndVarSimplifyVisitor(PHINode *
IV, ScalarEvolution *SCEV,
578 const TargetTransformInfo *
TTI,
579 const DominatorTree *DTree)
586 void visitCast(CastInst *Cast)
override {
visitIVCast(Cast, WI, SE,
TTI); }
596bool IndVarSimplify::simplifyAndExtend(Loop *L,
602 L->getBlocks()[0]->getModule(), Intrinsic::experimental_guard);
603 bool HasGuards = GuardDecl && !GuardDecl->use_empty();
613 while (!LoopPhis.empty()) {
621 PHINode *CurrIV = LoopPhis.pop_back_val();
624 IndVarSimplifyVisitor Visitor(CurrIV, SE,
TTI, DT);
631 if (Visitor.WI.WidestNativeType) {
634 }
while(!LoopPhis.empty());
644 DT, DeadInsts, ElimExt, Widened,
646 NumElimExt += ElimExt;
647 NumWidened += Widened;
649 LoopPhis.push_back(WidePhi);
669 case Instruction::Add:
670 case Instruction::Sub:
672 case Instruction::GetElementPtr:
682 if (Phi && Phi->getParent() == L->getHeader()) {
687 if (IncI->
getOpcode() == Instruction::GetElementPtr)
692 if (Phi && Phi->getParent() == L->getHeader()) {
715 assert(L->getLoopLatch() &&
"Must be in simplified form");
738 if (!L->isLoopInvariant(
RHS)) {
739 if (!L->isLoopInvariant(
LHS))
752 int Idx = Phi->getBasicBlockIndex(L->getLoopLatch());
757 Value *IncV = Phi->getIncomingValue(Idx);
808 assert(Phi->getParent() == L->getHeader());
809 assert(L->getLoopLatch());
818 int LatchIdx = Phi->getBasicBlockIndex(L->getLoopLatch());
819 Value *IncV = Phi->getIncomingValue(LatchIdx);
840 const SCEV *BestInit =
nullptr;
842 assert(LatchBlock &&
"Must be in simplified form");
856 if (PhiWidth < BCWidth || !
DL.isLegalInteger(PhiWidth))
865 Value *IncPhi = Phi->getIncomingValueForBlock(LatchBlock);
879 if (!Phi->getType()->isIntegerTy() &&
899 else if (PhiWidth <= SE->getTypeSizeInBits(BestPhi->
getType()))
912 const SCEV *ExitCount,
bool UsePostInc,
Loop *L,
935 "Computed iteration count is not loop invariant!");
936 return Rewriter.expandCodeFor(IVLimit, ARBase->
getType(),
946linearFunctionTestReplace(Loop *L, BasicBlock *ExitingBB,
947 const SCEV *ExitCount,
948 PHINode *IndVar, SCEVExpander &
Rewriter) {
949 assert(
L->getLoopLatch() &&
"Loop no longer in simplified form?");
955 Value *CmpIndVar = IndVar;
956 bool UsePostInc =
false;
961 if (ExitingBB ==
L->getLoopLatch()) {
990 if (BO->hasNoUnsignedWrap())
992 if (BO->hasNoSignedWrap())
997 IndVar, ExitingBB, ExitCount, UsePostInc, L,
Rewriter, SE);
1000 "genLoopLimit missed a cast");
1004 ICmpInst::Predicate
P;
1006 P = ICmpInst::ICMP_NE;
1008 P = ICmpInst::ICMP_EQ;
1015 Builder.SetCurrentDebugLocation(
Cond->getDebugLoc());
1024 if (CmpIndVarSize > ExitCntSize) {
1034 const SCEV *
IV = SE->
getSCEV(CmpIndVar);
1036 const SCEV *ZExtTrunc =
1039 if (ZExtTrunc ==
IV) {
1041 ExitCnt = Builder.CreateZExt(ExitCnt, IndVar->
getType(),
1044 const SCEV *SExtTrunc =
1046 if (SExtTrunc ==
IV) {
1048 ExitCnt = Builder.CreateSExt(ExitCnt, IndVar->
getType(),
1055 L->makeLoopInvariant(ExitCnt, Discard);
1057 CmpIndVar = Builder.CreateTrunc(CmpIndVar, ExitCnt->
getType(),
1060 LLVM_DEBUG(
dbgs() <<
"INDVARS: Rewriting loop exit condition to:\n"
1061 <<
" LHS:" << *CmpIndVar <<
'\n'
1062 <<
" op:\t" << (
P == ICmpInst::ICMP_NE ?
"!=" :
"==")
1064 <<
" RHS:\t" << *ExitCnt <<
"\n"
1065 <<
"ExitCount:\t" << *ExitCount <<
"\n"
1068 Value *
Cond = Builder.CreateICmp(
P, CmpIndVar, ExitCnt,
"exitcond");
1089bool IndVarSimplify::sinkUnusedInvariants(Loop *L) {
1091 if (!ExitBlock)
return false;
1094 if (!Preheader)
return false;
1096 bool MadeAnyChanges =
false;
1113 if (
I.mayHaveSideEffects() ||
I.mayReadFromMemory())
1117 if (
I.isDebugOrPseudoInst())
1133 bool UsedInLoop =
false;
1134 for (Use &U :
I.uses()) {
1140 UseBB =
P->getIncomingBlock(i);
1142 if (UseBB == Preheader ||
L->contains(UseBB)) {
1155 MadeAnyChanges =
true;
1158 return MadeAnyChanges;
1164 LLVM_DEBUG(
dbgs() <<
"Replacing condition of loop-exiting branch " << *BI
1165 <<
" with " << *NewCond <<
"\n");
1167 if (OldCond->use_empty())
1174 bool ExitIfTrue = !L->contains(*
succ_begin(ExitingBB));
1176 return ConstantInt::get(OldCond->getType(),
1177 IsTaken ? ExitIfTrue : !ExitIfTrue);
1190 assert(L->isLoopSimplifyForm() &&
"Should only do it in simplify form!");
1191 auto *LoopPreheader = L->getLoopPreheader();
1192 auto *LoopHeader = L->getHeader();
1194 for (
auto &PN : LoopHeader->phis()) {
1206 while (!Worklist.
empty()) {
1208 if (!Visited.
insert(
I).second)
1212 if (!L->contains(
I))
1217 for (
User *U :
I->users())
1219 I->replaceAllUsesWith(Res);
1230 BasicBlock *Preheader = L->getLoopPreheader();
1231 assert(Preheader &&
"Preheader doesn't exist");
1233 auto *LHSV = Rewriter.expandCodeFor(LIP.
LHS);
1234 auto *RHSV = Rewriter.expandCodeFor(LIP.
RHS);
1235 bool ExitIfTrue = !L->contains(*
succ_begin(ExitingBB));
1240 return Builder.CreateICmp(InvariantPred, LHSV, RHSV,
1244static std::optional<Value *>
1246 const SCEV *MaxIter,
bool Inverted,
bool SkipLastIter,
1264 auto *MaxIterTy = MaxIter->
getType();
1293 return std::nullopt;
1308 "Not a loop exit!");
1321 auto GoThrough = [&](
Value *V) {
1342 if (!GoThrough(Curr))
1345 }
while (!Worklist.
empty());
1352 if (!SkipLastIter && LeafConditions.
size() > 1 &&
1356 for (
auto *ICmp : LeafConditions) {
1359 const SCEV *ExitMax = EL.SymbolicMaxNotTaken;
1368 if (WideExitMax == WideMaxIter)
1369 ICmpsFailingOnLastIter.
insert(ICmp);
1373 for (
auto *OldCond : LeafConditions) {
1378 bool OptimisticSkipLastIter = SkipLastIter;
1379 if (!OptimisticSkipLastIter) {
1380 if (ICmpsFailingOnLastIter.
size() > 1)
1381 OptimisticSkipLastIter =
true;
1382 else if (ICmpsFailingOnLastIter.
size() == 1)
1383 OptimisticSkipLastIter = !ICmpsFailingOnLastIter.
count(OldCond);
1387 OptimisticSkipLastIter, SE, Rewriter)) {
1389 auto *NewCond = *Replaced;
1391 NCI->setName(OldCond->
getName() +
".first_iter");
1393 LLVM_DEBUG(
dbgs() <<
"Unknown exit count: Replacing " << *OldCond
1394 <<
" with " << *NewCond <<
"\n");
1400 ICmpsFailingOnLastIter.
erase(OldCond);
1406bool IndVarSimplify::canonicalizeExitCondition(Loop *L) {
1416 SmallVector<BasicBlock*, 16> ExitingBlocks;
1417 L->getExitingBlocks(ExitingBlocks);
1419 for (
auto *ExitingBB : ExitingBlocks) {
1426 if (!ICmp || !ICmp->hasOneUse())
1429 auto *
LHS = ICmp->getOperand(0);
1430 auto *
RHS = ICmp->getOperand(1);
1434 if (!
L->isLoopInvariant(
RHS)) {
1435 if (!
L->isLoopInvariant(
LHS))
1442 Value *LHSOp =
nullptr;
1446 const unsigned InnerBitWidth =
DL.getTypeSizeInBits(LHSOp->
getType());
1447 const unsigned OuterBitWidth =
DL.getTypeSizeInBits(
RHS->
getType());
1448 auto FullCR = ConstantRange::getFull(InnerBitWidth);
1449 FullCR = FullCR.zeroExtend(OuterBitWidth);
1451 if (FullCR.contains(RHSCR)) {
1454 ICmp->setPredicate(ICmp->getUnsignedPredicate());
1464 for (
auto *ExitingBB : ExitingBlocks) {
1471 if (!ICmp || !ICmp->hasOneUse() || !ICmp->isUnsigned())
1474 bool Swapped =
false;
1475 auto *
LHS = ICmp->getOperand(0);
1476 auto *
RHS = ICmp->getOperand(1);
1477 if (
L->isLoopInvariant(
LHS) ==
L->isLoopInvariant(
RHS))
1480 if (
L->isLoopInvariant(
LHS)) {
1491 Value *LHSOp =
nullptr;
1508 auto doRotateTransform = [&]() {
1509 assert(ICmp->isUnsigned() &&
"must have proven unsigned already");
1511 Instruction::Trunc,
RHS, LHSOp->
getType(),
"",
1512 L->getLoopPreheader()->getTerminator()->getIterator());
1516 ICmp->setOperand(Swapped ? 1 : 0, LHSOp);
1517 ICmp->setOperand(Swapped ? 0 : 1, NewRHS);
1519 ICmp->setSameSign(
false);
1524 const unsigned InnerBitWidth =
DL.getTypeSizeInBits(LHSOp->
getType());
1525 const unsigned OuterBitWidth =
DL.getTypeSizeInBits(
RHS->
getType());
1526 auto FullCR = ConstantRange::getFull(InnerBitWidth);
1527 FullCR = FullCR.zeroExtend(OuterBitWidth);
1529 if (FullCR.contains(RHSCR)) {
1530 doRotateTransform();
1542bool IndVarSimplify::optimizeLoopExits(Loop *L, SCEVExpander &
Rewriter) {
1543 SmallVector<BasicBlock*, 16> ExitingBlocks;
1544 L->getExitingBlocks(ExitingBlocks);
1561 if (!DT->
dominates(ExitingBB,
L->getLoopLatch()))
1576 if (ExitingBlocks.
empty())
1587 llvm::sort(ExitingBlocks, [&](BasicBlock *
A, BasicBlock *
B) {
1590 if (
A ==
B)
return false;
1595 "expected total dominance order!");
1600 for (
unsigned i = 1; i < ExitingBlocks.
size(); i++) {
1606 bool SkipLastIter =
false;
1608 auto UpdateSkipLastIter = [&](
const SCEV *MaxExitCount) {
1612 CurrMaxExit = MaxExitCount;
1617 if (CurrMaxExit == MaxBECount)
1618 SkipLastIter =
true;
1620 SmallPtrSet<const SCEV *, 8> DominatingExactExitCounts;
1621 for (BasicBlock *ExitingBB : ExitingBlocks) {
1622 const SCEV *ExactExitCount = SE->
getExitCount(L, ExitingBB);
1624 L, ExitingBB, ScalarEvolution::ExitCountKind::SymbolicMaximum);
1629 auto OptimizeCond = [&](
bool SkipLastIter) {
1631 MaxBECount, SkipLastIter,
1651 if (OptimizeCond(
false))
1653 else if (SkipLastIter && OptimizeCond(
true))
1655 UpdateSkipLastIter(MaxExitCount);
1659 UpdateSkipLastIter(ExactExitCount);
1666 if (ExactExitCount->
isZero()) {
1667 foldExit(L, ExitingBB,
true, DeadInsts);
1675 "Exit counts must be integers");
1687 foldExit(L, ExitingBB,
false, DeadInsts);
1696 if (!DominatingExactExitCounts.
insert(ExactExitCount).second) {
1697 foldExit(L, ExitingBB,
false, DeadInsts);
1723 if (CB->onlyAccessesInaccessibleMemory())
1730bool IndVarSimplify::predicateLoopExits(Loop *L, SCEVExpander &
Rewriter) {
1731 SmallVector<BasicBlock*, 16> ExitingBlocks;
1732 L->getExitingBlocks(ExitingBlocks);
1777 if (!ExitBlock->
phis().empty())
1780 const SCEV *ExitCount = SE->
getExitCount(L, ExitingBB);
1782 !
Rewriter.isSafeToExpand(ExitCount))
1786 "Exit count must be loop invariant");
1794 for (BasicBlock *ExitingBB : ExitingBlocks)
1805 llvm::sort(ExitingBlocks, [&](BasicBlock *
A, BasicBlock *
B) {
1819 for (
unsigned i = 1; i < ExitingBlocks.size(); i++)
1821 "Not sorted by dominance");
1825 for (
unsigned i = 0, e = ExitingBlocks.size(); i < e; i++)
1826 if (BadExit(ExitingBlocks[i])) {
1827 ExitingBlocks.resize(i);
1831 if (ExitingBlocks.empty())
1842 bool HasThreadLocalSideEffects =
false;
1843 for (BasicBlock *BB :
L->blocks())
1846 if (
I.mayHaveSideEffects()) {
1849 HasThreadLocalSideEffects =
true;
1855 if (!
SI->isSimple())
1873 Rewriter.setInsertPoint(
L->getLoopPreheader()->getTerminator());
1875 Value *ExactBTCV =
nullptr;
1876 for (BasicBlock *ExitingBB : ExitingBlocks) {
1877 const SCEV *ExitCount = SE->
getExitCount(L, ExitingBB);
1880 if (HasThreadLocalSideEffects) {
1882 for (
const BasicBlock *Succ : BI->
successors()) {
1894 if (ExitCount == ExactBTC) {
1896 B.getFalse() :
B.getTrue();
1900 ExactBTCV =
Rewriter.expandCodeFor(ExactBTC);
1904 ECV =
B.CreateZExt(ECV, WiderTy);
1905 RHS =
B.CreateZExt(
RHS, WiderTy);
1908 ICmpInst::ICMP_NE : ICmpInst::ICMP_EQ;
1909 NewCond =
B.CreateICmp(Pred, ECV,
RHS);
1916 RunUnswitching =
true;
1926bool IndVarSimplify::run(Loop *L) {
1928 assert(
L->isRecursivelyLCSSAForm(*DT, *LI) &&
1929 "LCSSA required to run indvars!");
1940 if (!
L->isLoopSimplifyForm())
1946 Changed |= rewriteNonIntegerIVs(L);
1950#if LLVM_ENABLE_ABI_BREAKING_CHECKS
1970 NumReplaced += Rewrites;
1976 NumElimIV +=
Rewriter.replaceCongruentIVs(L, DT, DeadInsts,
TTI);
1980 Changed |= canonicalizeExitCondition(L);
1983 if (optimizeLoopExits(L,
Rewriter)) {
1993 if (predicateLoopExits(L,
Rewriter)) {
2004 SmallVector<BasicBlock*, 16> ExitingBlocks;
2005 L->getExitingBlocks(ExitingBlocks);
2006 for (BasicBlock *ExitingBB : ExitingBlocks) {
2020 const SCEV *ExitCount = SE->
getExitCount(L, ExitingBB);
2041 if (!
Rewriter.isSafeToExpand(ExitCount))
2044 Changed |= linearFunctionTestReplace(L, ExitingBB,
2056 while (!DeadInsts.
empty()) {
2070 Changed |= sinkUnusedInvariants(L);
2075 Changed |= rewriteFirstIterationLoopExitValues(L);
2081 assert(
L->isRecursivelyLCSSAForm(*DT, *LI) &&
2082 "Indvars did not preserve LCSSA!");
2084 MSSAU->getMemorySSA()->verifyMemorySSA();
2092 Function *
F = L.getHeader()->getParent();
2102 if (IVS.runUnswitching()) {
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file declares a class to represent arbitrary precision floating point values and provide a varie...
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
#define clEnumValN(ENUMVAL, FLAGNAME, DESC)
This file contains the declarations for the subclasses of Constant, which represent the different fla...
This header defines various interfaces for pass management in LLVM.
This defines the Use class.
static Value * genLoopLimit(PHINode *IndVar, BasicBlock *ExitingBB, const SCEV *ExitCount, bool UsePostInc, Loop *L, SCEVExpander &Rewriter, ScalarEvolution *SE)
Insert an IR expression which computes the value held by the IV IndVar (which must be an loop counter...
static void replaceExitCond(BranchInst *BI, Value *NewCond, SmallVectorImpl< WeakTrackingVH > &DeadInsts)
static cl::opt< bool > DisableLFTR("disable-lftr", cl::Hidden, cl::init(false), cl::desc("Disable Linear Function Test Replace optimization"))
static bool isLoopExitTestBasedOn(Value *V, BasicBlock *ExitingBB)
Whether the current loop exit test is based on this value.
static cl::opt< ReplaceExitVal > ReplaceExitValue("replexitval", cl::Hidden, cl::init(OnlyCheapRepl), cl::desc("Choose the strategy to replace exit value in IndVarSimplify"), cl::values(clEnumValN(NeverRepl, "never", "never replace exit value"), clEnumValN(OnlyCheapRepl, "cheap", "only replace exit value when the cost is cheap"), clEnumValN(UnusedIndVarInLoop, "unusedindvarinloop", "only replace exit value when it is an unused " "induction variable in the loop and has cheap replacement cost"), clEnumValN(NoHardUse, "noharduse", "only replace exit values when loop def likely dead"), clEnumValN(AlwaysRepl, "always", "always replace exit value whenever possible")))
static void visitIVCast(CastInst *Cast, WideIVInfo &WI, ScalarEvolution *SE, const TargetTransformInfo *TTI)
Update information about the induction variable that is extended by this sign or zero extend operatio...
static void replaceLoopPHINodesWithPreheaderValues(LoopInfo *LI, Loop *L, SmallVectorImpl< WeakTrackingVH > &DeadInsts, ScalarEvolution &SE)
static bool needsLFTR(Loop *L, BasicBlock *ExitingBB)
linearFunctionTestReplace policy.
static bool optimizeLoopExitWithUnknownExitCount(const Loop *L, BranchInst *BI, BasicBlock *ExitingBB, const SCEV *MaxIter, bool SkipLastIter, ScalarEvolution *SE, SCEVExpander &Rewriter, SmallVectorImpl< WeakTrackingVH > &DeadInsts)
static Value * createInvariantCond(const Loop *L, BasicBlock *ExitingBB, const ScalarEvolution::LoopInvariantPredicate &LIP, SCEVExpander &Rewriter)
static bool isLoopCounter(PHINode *Phi, Loop *L, ScalarEvolution *SE)
Return true if the given phi is a "counter" in L.
static std::optional< Value * > createReplacement(ICmpInst *ICmp, const Loop *L, BasicBlock *ExitingBB, const SCEV *MaxIter, bool Inverted, bool SkipLastIter, ScalarEvolution *SE, SCEVExpander &Rewriter)
static bool hasConcreteDefImpl(Value *V, SmallPtrSetImpl< Value * > &Visited, unsigned Depth)
Recursive helper for hasConcreteDef().
static bool hasConcreteDef(Value *V)
Return true if the given value is concrete.
static void foldExit(const Loop *L, BasicBlock *ExitingBB, bool IsTaken, SmallVectorImpl< WeakTrackingVH > &DeadInsts)
static PHINode * getLoopPhiForCounter(Value *IncV, Loop *L)
Given an Value which is hoped to be part of an add recurance in the given loop, return the associated...
static Constant * createFoldedExitCond(const Loop *L, BasicBlock *ExitingBB, bool IsTaken)
static cl::opt< bool > LoopPredicationTraps("indvars-predicate-loop-traps", cl::Hidden, cl::init(true), cl::desc("Predicate conditions that trap in loops with only local writes"))
static cl::opt< bool > UsePostIncrementRanges("indvars-post-increment-ranges", cl::Hidden, cl::desc("Use post increment control-dependent ranges in IndVarSimplify"), cl::init(true))
static PHINode * FindLoopCounter(Loop *L, BasicBlock *ExitingBB, const SCEV *BECount, ScalarEvolution *SE, DominatorTree *DT)
Search the loop header for a loop counter (anadd rec w/step of one) suitable for use by LFTR.
static cl::opt< bool > AllowIVWidening("indvars-widen-indvars", cl::Hidden, cl::init(true), cl::desc("Allow widening of indvars to eliminate s/zext"))
static bool crashingBBWithoutEffect(const BasicBlock &BB)
static bool ConvertToSInt(const APFloat &APF, int64_t &IntVal)
Convert APF to an integer, if possible.
static cl::opt< bool > LoopPredication("indvars-predicate-loops", cl::Hidden, cl::init(true), cl::desc("Predicate conditions in read only loops"))
This file exposes an interface to building/using memory SSA to walk memory instructions using a use/d...
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
const SmallVectorImpl< MachineOperand > & Cond
This file defines the SmallPtrSet class.
This file defines the SmallVector class.
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
Virtual Register Rewriter
static const uint32_t IV[8]
static constexpr roundingMode rmTowardZero
opStatus convertToInteger(MutableArrayRef< integerPart > Input, unsigned int Width, bool IsSigned, roundingMode RM, bool *IsExact) const
PassT::Result & getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs)
Get the result of an analysis pass for a given IR unit.
LLVM Basic Block Representation.
iterator_range< const_phi_iterator > phis() const
Returns a range that iterates over the phis in the basic block.
LLVM_ABI const_iterator getFirstInsertionPt() const
Returns an iterator to the first instruction in this block that is suitable for inserting a non-PHI i...
InstListType::iterator iterator
Instruction iterators...
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction if the block is well formed or null if the block is not well forme...
Conditional or Unconditional Branch instruction.
iterator_range< succ_op_iterator > successors()
void setCondition(Value *V)
bool isConditional() const
BasicBlock * getSuccessor(unsigned i) const
Value * getCondition() const
Represents analyses that only rely on functions' control flow.
This is the base class for all instructions that perform data casts.
Instruction::CastOps getOpcode() const
Return the opcode of this CastInst.
static LLVM_ABI CastInst * Create(Instruction::CastOps, Value *S, Type *Ty, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Provides a way to construct any of the CastInst subclasses using an opcode instead of the subclass's ...
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
@ FCMP_OEQ
0 0 0 1 True if ordered and equal
@ ICMP_SLT
signed less than
@ ICMP_SLE
signed less or equal
@ FCMP_OLT
0 1 0 0 True if ordered and less than
@ FCMP_ULE
1 1 0 1 True if unordered, less than, or equal
@ FCMP_OGT
0 0 1 0 True if ordered and greater than
@ FCMP_OGE
0 0 1 1 True if ordered and greater than or equal
@ ICMP_SGT
signed greater than
@ FCMP_ULT
1 1 0 0 True if unordered or less than
@ FCMP_ONE
0 1 1 0 True if ordered and operands are unequal
@ FCMP_UEQ
1 0 0 1 True if unordered or equal
@ ICMP_ULT
unsigned less than
@ FCMP_UGT
1 0 1 0 True if unordered or greater than
@ FCMP_OLE
0 1 0 1 True if ordered and less than or equal
@ ICMP_SGE
signed greater or equal
@ FCMP_UNE
1 1 1 0 True if unordered or not equal
@ ICMP_ULE
unsigned less or equal
@ FCMP_UGE
1 0 1 1 True if unordered, greater than, or equal
Predicate getInversePredicate() const
For example, EQ -> NE, UGT -> ULE, SLT -> SGE, OEQ -> UNE, UGT -> OLE, OLT -> UGE,...
An abstraction over a floating-point predicate, and a pack of an integer predicate with samesign info...
const APFloat & getValueAPF() const
static ConstantInt * getSigned(IntegerType *Ty, int64_t V)
Return a ConstantInt with the specified value for the specified type.
This is an important base class in LLVM.
A parsed version of the target data layout string in and methods for querying it.
bool isLegalInteger(uint64_t Width) const
Returns true if the specified type is known to be a native integer type supported by the CPU.
static DebugLoc getDropped()
bool properlyDominates(const DomTreeNodeBase< NodeT > *A, const DomTreeNodeBase< NodeT > *B) const
properlyDominates - Returns true iff A dominates B and A != B.
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
LLVM_ABI bool dominates(const BasicBlock *BB, const Use &U) const
Return true if the (end of the) basic block BB dominates the use U.
This instruction compares its operands according to the predicate given to the constructor.
CmpPredicate getCmpPredicate() const
CmpPredicate getInverseCmpPredicate() const
This provides a uniform API for creating instructions and inserting them into a basic block: either a...
PreservedAnalyses run(Loop &L, LoopAnalysisManager &AM, LoopStandardAnalysisResults &AR, LPMUpdater &U)
const DebugLoc & getDebugLoc() const
Return the debug location for this node as a DebugLoc.
unsigned getOpcode() const
Returns a member of one of the enums like Instruction::Add.
void setDebugLoc(DebugLoc Loc)
Set the debug location information for this instruction.
LLVM_ABI const DataLayout & getDataLayout() const
Get the data layout of the module this instruction belongs to.
This class provides an interface for updating the loop pass manager based on mutations to the loop ne...
LoopT * getLoopFor(const BlockT *BB) const
Return the inner most loop that BB lives in.
bool replacementPreservesLCSSAForm(Instruction *From, Value *To)
Returns true if replacing From with To everywhere is guaranteed to preserve LCSSA form.
Represents a single loop in the control flow graph.
An analysis that produces MemorySSA for a function.
Encapsulates MemorySSA, including all data associated with memory accesses.
MutableArrayRef - Represent a mutable reference to an array (0 or more elements consecutively in memo...
void addIncoming(Value *V, BasicBlock *BB)
Add an incoming value to the end of the PHI list.
void setIncomingValue(unsigned i, Value *V)
Value * getIncomingValueForBlock(const BasicBlock *BB) const
BasicBlock * getIncomingBlock(unsigned i) const
Return incoming basic block number i.
Value * getIncomingValue(unsigned i) const
Return incoming value number x.
static unsigned getIncomingValueNumForOperand(unsigned i)
unsigned getNumIncomingValues() const
Return the number of incoming edges.
static PHINode * Create(Type *Ty, unsigned NumReservedValues, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
Constructors - NumReservedValues is a hint for the number of incoming edges that this phi node will h...
static LLVM_ABI PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
A set of analyses that are preserved following a run of a transformation pass.
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
This node represents a polynomial recurrence on the trip count of the specified loop.
const SCEV * getStart() const
LLVM_ABI const SCEV * evaluateAtIteration(const SCEV *It, ScalarEvolution &SE) const
Return the value of this chain of recurrences at the specified iteration number.
const SCEV * getStepRecurrence(ScalarEvolution &SE) const
Constructs and returns the recurrence indicating how much this expression steps by.
LLVM_ABI const SCEVAddRecExpr * getPostIncExpr(ScalarEvolution &SE) const
Return an expression representing the value of this expression one iteration of the loop ahead.
This class uses information about analyze scalars to rewrite expressions in canonical form.
bool hasNoUnsignedWrap() const
bool hasNoSignedWrap() const
This class represents an analyzed expression in the program.
LLVM_ABI bool isOne() const
Return true if the expression is a constant one.
LLVM_ABI bool isZero() const
Return true if the expression is a constant zero.
LLVM_ABI Type * getType() const
Return the LLVM type of this SCEV expression.
The main scalar evolution driver.
LLVM_ABI std::optional< LoopInvariantPredicate > getLoopInvariantExitCondDuringFirstIterations(CmpPredicate Pred, const SCEV *LHS, const SCEV *RHS, const Loop *L, const Instruction *CtxI, const SCEV *MaxIter)
If the result of the predicate LHS Pred RHS is loop invariant with respect to L at given Context duri...
LLVM_ABI Type * getWiderType(Type *Ty1, Type *Ty2) const
LLVM_ABI bool isLoopEntryGuardedByCond(const Loop *L, CmpPredicate Pred, const SCEV *LHS, const SCEV *RHS)
Test whether entry to the loop is protected by a conditional between LHS and RHS.
LLVM_ABI const SCEV * getSCEVAtScope(const SCEV *S, const Loop *L)
Return a SCEV expression for the specified value at the specified scope in the program.
LLVM_ABI const SCEV * getBackedgeTakenCount(const Loop *L, ExitCountKind Kind=Exact)
If the specified loop has a predictable backedge-taken count, return it, otherwise return a SCEVCould...
LLVM_ABI ExitLimit computeExitLimitFromCond(const Loop *L, Value *ExitCond, bool ExitIfTrue, bool ControlsOnlyExit, bool AllowPredicates=false)
Compute the number of times the backedge of the specified loop will execute if its exit condition wer...
LLVM_ABI uint64_t getTypeSizeInBits(Type *Ty) const
Return the size in bits of the specified type, for which isSCEVable must return true.
LLVM_ABI const SCEV * getSCEV(Value *V)
Return a SCEV expression for the full generality of the specified expression.
const SCEV * getOne(Type *Ty)
Return a SCEV for the constant 1 of a specific type.
LLVM_ABI std::optional< bool > evaluatePredicateAt(CmpPredicate Pred, const SCEV *LHS, const SCEV *RHS, const Instruction *CtxI)
Check whether the condition described by Pred, LHS, and RHS is true or false in the given Context.
LLVM_ABI void forgetLoop(const Loop *L)
This method should be called by the client when it has changed a loop in a way that may effect Scalar...
LLVM_ABI bool isLoopInvariant(const SCEV *S, const Loop *L)
Return true if the value of the given SCEV is unchanging in the specified loop.
LLVM_ABI const SCEV * getZeroExtendExpr(const SCEV *Op, Type *Ty, unsigned Depth=0)
LLVM_ABI bool isSCEVable(Type *Ty) const
Test if values of the given type are analyzable within the SCEV framework.
LLVM_ABI Type * getEffectiveSCEVType(Type *Ty) const
Return a type with the same bitwidth as the given type and which represents how SCEV will treat the g...
ConstantRange getUnsignedRange(const SCEV *S)
Determine the unsigned range for a particular SCEV.
LLVM_ABI void forgetTopmostLoop(const Loop *L)
LLVM_ABI void forgetValue(Value *V)
This method should be called by the client when it has changed a value in a way that may effect its v...
LLVM_ABI const SCEV * getTruncateExpr(const SCEV *Op, Type *Ty, unsigned Depth=0)
LLVM_ABI const SCEV * getMinusSCEV(const SCEV *LHS, const SCEV *RHS, SCEV::NoWrapFlags Flags=SCEV::FlagAnyWrap, unsigned Depth=0)
Return LHS-RHS.
const SCEV * getMinusOne(Type *Ty)
Return a SCEV for the constant -1 of a specific type.
LLVM_ABI const SCEV * getNoopOrZeroExtend(const SCEV *V, Type *Ty)
Return a SCEV corresponding to a conversion of the input value to the specified type.
LLVM_ABI const SCEV * getUMinFromMismatchedTypes(const SCEV *LHS, const SCEV *RHS, bool Sequential=false)
Promote the operands to the wider of the types using zero-extension, and then perform a umin operatio...
LLVM_ABI const SCEV * getCouldNotCompute()
LLVM_ABI const SCEV * getExitCount(const Loop *L, const BasicBlock *ExitingBlock, ExitCountKind Kind=Exact)
Return the number of times the backedge executes before the given exit would be taken; if not exactly...
LLVM_ABI const SCEV * getSignExtendExpr(const SCEV *Op, Type *Ty, unsigned Depth=0)
@ SymbolicMaximum
An expression which provides an upper bound on the exact trip count.
LLVM_ABI const SCEV * applyLoopGuards(const SCEV *Expr, const Loop *L)
Try to apply information from loop guards for L to Expr.
LLVM_ABI bool isKnownPredicateAt(CmpPredicate Pred, const SCEV *LHS, const SCEV *RHS, const Instruction *CtxI)
Test if the given expression is known to satisfy the condition described by Pred, LHS,...
const SCEV * getSymbolicMaxBackedgeTakenCount(const Loop *L)
When successful, this returns a SCEV that is greater than or equal to (i.e.
A templated base class for SmallPtrSet which provides the typesafe interface that is common across al...
bool erase(PtrType Ptr)
Remove pointer from the set.
size_type count(ConstPtrType Ptr) const
count - Return 1 if the specified pointer is in the set, 0 otherwise.
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
reference emplace_back(ArgTypes &&... Args)
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Provides information about what library functions are available for the current target.
The instances of the Type class are immutable: once they are created, they are never changed.
bool isPointerTy() const
True if this is an instance of PointerType.
bool isIntegerTy() const
True if this is an instance of IntegerType.
Value * getOperand(unsigned i) const
unsigned getNumOperands() const
LLVM Value Representation.
Type * getType() const
All values are typed, get the type of this value.
bool hasOneUse() const
Return true if there is exactly one use of this value.
LLVM_ABI void replaceAllUsesWith(Value *V)
Change all uses of this to point to a new Value.
iterator_range< user_iterator > users()
LLVM_ABI LLVMContext & getContext() const
All values hold a context through their type.
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
LLVM_ABI void takeName(Value *V)
Transfer the name from V to this value.
const ParentTy * getParent() const
self_iterator getIterator()
This provides a very simple, boring adaptor for a begin and end iterator into a range type.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ C
The default llvm calling convention, compatible with C.
@ BasicBlock
Various leaf nodes.
LLVM_ABI Function * getDeclarationIfExists(const Module *M, ID id)
Look up the Function declaration of the intrinsic id in the Module M and return it if it exists.
auto m_LogicalOr()
Matches L || R where L and R are arbitrary values.
CastInst_match< OpTy, ZExtInst > m_ZExt(const OpTy &Op)
Matches ZExt.
class_match< Value > m_Value()
Match an arbitrary value and ignore it.
auto m_LogicalAnd()
Matches L && R where L and R are arbitrary values.
cst_pred_ty< is_one > m_scev_One()
Match an integer 1.
specificloop_ty m_SpecificLoop(const Loop *L)
SCEVAffineAddRec_match< Op0_t, Op1_t, class_match< const Loop > > m_scev_AffineAddRec(const Op0_t &Op0, const Op1_t &Op1)
bool match(const SCEV *S, const Pattern &P)
class_match< const SCEV > m_SCEV()
ValuesClass values(OptsTy... Options)
Helper to build a ValuesClass by forwarding a variable number of arguments as an initializer list to ...
initializer< Ty > init(const Ty &Val)
PointerTypeMap run(const Module &M)
Compute the PointerTypeMap for the module M.
@ User
could "use" a pointer
friend class Instruction
Iterator for Instructions in a `BasicBlock.
This is an optimization pass for GlobalISel generic memory operations.
LLVM_ABI bool mustExecuteUBIfPoisonOnPathTo(Instruction *Root, Instruction *OnPathTo, DominatorTree *DT)
Return true if undefined behavior would provable be executed on the path to OnPathTo if Root produced...
FunctionAddr VTableAddr Value
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
LLVM_ABI bool RecursivelyDeleteTriviallyDeadInstructions(Value *V, const TargetLibraryInfo *TLI=nullptr, MemorySSAUpdater *MSSAU=nullptr, std::function< void(Value *)> AboutToDeleteCallback=std::function< void(Value *)>())
If the specified value is a trivially dead instruction, delete it.
constexpr bool isInt(int64_t x)
Checks if an integer fits into the given bit width.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
FunctionAddr VTableAddr uintptr_t uintptr_t Int32Ty
PHINode * createWideIV(const WideIVInfo &WI, LoopInfo *LI, ScalarEvolution *SE, SCEVExpander &Rewriter, DominatorTree *DT, SmallVectorImpl< WeakTrackingVH > &DeadInsts, unsigned &NumElimExt, unsigned &NumWidened, bool HasGuards, bool UsePostIncrementRanges)
Widen Induction Variables - Extend the width of an IV to cover its widest uses.
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
LLVM_ABI Value * simplifyInstruction(Instruction *I, const SimplifyQuery &Q)
See if we can compute a simplified version of this instruction.
AnalysisManager< Loop, LoopStandardAnalysisResults & > LoopAnalysisManager
The loop analysis manager.
auto dyn_cast_or_null(const Y &Val)
LLVM_ABI bool DeleteDeadPHIs(BasicBlock *BB, const TargetLibraryInfo *TLI=nullptr, MemorySSAUpdater *MSSAU=nullptr)
Examine each PHI in the given block and delete it if it is dead.
auto reverse(ContainerTy &&C)
void sort(IteratorTy Start, IteratorTy End)
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
LLVM_ABI cl::opt< unsigned > SCEVCheapExpansionBudget
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
std::pair< bool, bool > simplifyUsersOfIV(PHINode *CurrIV, ScalarEvolution *SE, DominatorTree *DT, LoopInfo *LI, const TargetTransformInfo *TTI, SmallVectorImpl< WeakTrackingVH > &Dead, SCEVExpander &Rewriter, IVVisitor *V=nullptr)
simplifyUsersOfIV - Simplify instructions that use this induction variable by using ScalarEvolution t...
RNSuccIterator< NodeRef, BlockT, RegionT > succ_begin(NodeRef Node)
IRBuilder(LLVMContext &, FolderTy, InserterTy, MDNode *, ArrayRef< OperandBundleDef >) -> IRBuilder< FolderTy, InserterTy >
LLVM_ABI bool VerifyMemorySSA
Enables verification of MemorySSA.
@ UMin
Unsigned integer min implemented in terms of select(cmp()).
DWARFExpression::Operation Op
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
LLVM_ABI PreservedAnalyses getLoopPassPreservedAnalyses()
Returns the minimum set of Analyses that all loop passes must preserve.
void erase_if(Container &C, UnaryPredicate P)
Provide a container algorithm similar to C++ Library Fundamentals v2's erase_if which is equivalent t...
LLVM_ABI bool isAlmostDeadIV(PHINode *IV, BasicBlock *LatchBlock, Value *Cond)
Return true if the induction variable IV in a Loop whose latch is LatchBlock would become dead if the...
LLVM_ABI int rewriteLoopExitValues(Loop *L, LoopInfo *LI, TargetLibraryInfo *TLI, ScalarEvolution *SE, const TargetTransformInfo *TTI, SCEVExpander &Rewriter, DominatorTree *DT, ReplaceExitVal ReplaceExitValue, SmallVector< WeakTrackingVH, 16 > &DeadInsts)
If the final value of any expressions that are recurrent in the loop can be computed,...
iterator_range< pointer_iterator< WrappedIteratorT > > make_pointer_range(RangeT &&Range)
LLVM_ABI bool RecursivelyDeleteDeadPHINode(PHINode *PN, const TargetLibraryInfo *TLI=nullptr, MemorySSAUpdater *MSSAU=nullptr)
If the specified value is an effectively dead PHI node, due to being a def-use chain of single-use no...
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
The adaptor from a function pass to a loop pass computes these analyses and makes them available to t...
TargetTransformInfo & TTI
Collect information about induction variables that are used by sign/zero extend operations.