73#define DEBUG_TYPE "loop-unroll"
77 cl::desc(
"Forget everything in SCEV when doing LoopUnroll, instead of just"
78 " the current top-most loop. This is sometimes preferred to reduce"
83 cl::desc(
"The cost threshold for loop unrolling"));
88 cl::desc(
"The cost threshold for loop unrolling when optimizing for "
93 cl::desc(
"The cost threshold for partial loop unrolling"));
97 cl::desc(
"The maximum 'boost' (represented as a percentage >= 100) applied "
98 "to the threshold when aggressively unrolling a loop due to the "
99 "dynamic cost savings. If completely unrolling a loop will reduce "
100 "the total runtime from X to Y, we boost the loop unroll "
101 "threshold to DefaultThreshold*std::min(MaxPercentThresholdBoost, "
102 "X/Y). This limit avoids excessive code bloat."));
106 cl::desc(
"Don't allow loop unrolling to simulate more than this number of "
107 "iterations when checking full unroll profitability"));
111 cl::desc(
"Use this unroll count for all loops including those with "
112 "unroll_count pragma values, for testing purposes"));
116 cl::desc(
"Set the max unroll count for partial and runtime unrolling, for"
117 "testing purposes"));
122 "Set the max unroll count for full unrolling, for testing purposes"));
126 cl::desc(
"Allows loops to be partially unrolled until "
127 "-unroll-threshold loop size is reached."));
131 cl::desc(
"Allow generation of a loop remainder (extra iterations) "
132 "when unrolling a loop."));
136 cl::desc(
"Unroll loops with run-time trip counts"));
141 "The max of trip count upper bound that is considered in unrolling"));
145 cl::desc(
"Unrolled size limit for loops with unroll metadata "
146 "(full, enable, or count)."));
150 cl::desc(
"If the runtime tripcount for the loop is lower than the "
151 "threshold, the loop is considered as flat and will be less "
152 "aggressively unrolled."));
156 cl::desc(
"Allow the loop remainder to be unrolled."));
163 cl::desc(
"Enqueue and re-visit child loops in the loop PM after unrolling. "
164 "This shouldn't typically be needed as child loops (or their "
165 "clones) were already visited."));
169 cl::desc(
"Threshold (max size of unrolled loop) to use in aggressive (O3) "
174 cl::desc(
"Default threshold (max size of unrolled "
175 "loop), used in all but O3 optimizations"));
179 cl::desc(
"Maximum allowed iterations to unroll under pragma unroll full."));
184static const unsigned NoThreshold = std::numeric_limits<unsigned>::max();
192 std::optional<unsigned> UserThreshold, std::optional<unsigned> UserCount,
193 std::optional<bool> UserAllowPartial, std::optional<bool> UserRuntime,
194 std::optional<bool> UserUpperBound,
195 std::optional<unsigned> UserFullUnrollMaxCount) {
207 UP.
MaxCount = std::numeric_limits<unsigned>::max();
226 TTI.getUnrollingPreferences(L, SE, UP, &ORE);
229 bool OptForSize = L->getHeader()->getParent()->hasOptSize() ||
272 UP.
Count = *UserCount;
273 if (UserAllowPartial)
274 UP.
Partial = *UserAllowPartial;
279 if (UserFullUnrollMaxCount)
293struct UnrolledInstState {
297 unsigned IsCounted : 1;
301struct UnrolledInstStateKeyInfo {
302 using PtrInfo = DenseMapInfo<Instruction *>;
303 using PairInfo = DenseMapInfo<std::pair<Instruction *, int>>;
305 static inline UnrolledInstState getEmptyKey() {
306 return {PtrInfo::getEmptyKey(), 0, 0, 0};
309 static inline UnrolledInstState getTombstoneKey() {
310 return {PtrInfo::getTombstoneKey(), 0, 0, 0};
313 static inline unsigned getHashValue(
const UnrolledInstState &S) {
314 return PairInfo::getHashValue({S.I, S.Iteration});
317 static inline bool isEqual(
const UnrolledInstState &
LHS,
318 const UnrolledInstState &
RHS) {
319 return PairInfo::isEqual({
LHS.I,
LHS.Iteration}, {
RHS.I,
RHS.Iteration});
323struct EstimatedUnrollCost {
325 unsigned UnrolledCost;
329 unsigned RolledDynamicCost;
333 PragmaInfo(
bool UUC,
bool PFU,
unsigned PC,
bool PEU)
334 : UserUnrollCount(UUC), PragmaFullUnroll(PFU), PragmaCount(PC),
335 PragmaEnableUnroll(PEU) {}
336 const bool UserUnrollCount;
337 const bool PragmaFullUnroll;
338 const unsigned PragmaCount;
339 const bool PragmaEnableUnroll;
361 unsigned MaxIterationsCountToAnalyze) {
365 assert(MaxIterationsCountToAnalyze <
366 (
unsigned)(std::numeric_limits<int>::max() / 2) &&
367 "The unroll iterations max is too large!");
371 if (!L->isInnermost())
375 if (!TripCount || TripCount > MaxIterationsCountToAnalyze)
408 auto AddCostRecursively = [&](
Instruction &RootI,
int Iteration) {
409 assert(Iteration >= 0 &&
"Cannot have a negative iteration!");
410 assert(CostWorklist.
empty() &&
"Must start with an empty cost list");
411 assert(PHIUsedList.
empty() &&
"Must start with an empty phi used list");
417 for (;; --Iteration) {
423 auto CostIter = InstCostMap.
find({
I, Iteration, 0, 0});
424 if (CostIter == InstCostMap.
end())
429 auto &Cost = *CostIter;
435 Cost.IsCounted =
true;
439 if (PhiI->getParent() == L->getHeader()) {
440 assert(Cost.IsFree &&
"Loop PHIs shouldn't be evaluated as they "
441 "inherently simplify during unrolling.");
449 PhiI->getIncomingValueForBlock(L->getLoopLatch())))
450 if (L->contains(OpI))
459 transform(
I->operands(), std::back_inserter(Operands),
461 if (auto Res = SimplifiedValues.lookup(Op))
465 UnrolledCost +=
TTI.getInstructionCost(
I, Operands,
CostKind);
467 <<
"Adding cost of instruction (iteration " << Iteration
479 if (!OpI || !L->contains(OpI))
485 }
while (!CostWorklist.
empty());
487 if (PHIUsedList.
empty())
492 "Cannot track PHI-used values past the first iteration!");
500 assert(L->isLoopSimplifyForm() &&
"Must put loop into normal form first.");
501 assert(L->isLCSSAForm(DT) &&
502 "Must have loops in LCSSA form to track live-out values.");
505 <<
"Starting LoopUnroll profitability analysis...\n");
508 L->getHeader()->getParent()->hasMinSize() ?
514 for (
unsigned Iteration = 0; Iteration < TripCount; ++Iteration) {
527 PHI->getNumIncomingValues() == 2 &&
528 "Must have an incoming value only for the preheader and the latch.");
530 Value *V =
PHI->getIncomingValueForBlock(
531 Iteration == 0 ? L->getLoopPreheader() : L->getLoopLatch());
532 if (Iteration != 0 && SimplifiedValues.
count(V))
533 V = SimplifiedValues.
lookup(V);
538 SimplifiedValues.
clear();
539 while (!SimplifiedInputValues.
empty())
545 BBWorklist.
insert(L->getHeader());
547 for (
unsigned Idx = 0; Idx != BBWorklist.
size(); ++Idx) {
561 RolledDynamicCost +=
TTI.getInstructionCost(&
I,
CostKind);
566 bool IsFree = Analyzer.
visit(
I);
567 bool Inserted = InstCostMap.
insert({&
I, (int)Iteration,
571 assert(Inserted &&
"Cannot have a state for an unvisited instruction!");
579 const Function *Callee = CI->getCalledFunction();
580 if (!Callee ||
TTI.isLoweredToCall(Callee)) {
582 <<
"Can't analyze cost of loop with call\n");
589 if (
I.mayHaveSideEffects())
590 AddCostRecursively(
I, Iteration);
593 if (UnrolledCost > MaxUnrolledLoopSize) {
595 dbgs().
indent(4) <<
"Exceeded threshold.. exiting.\n";
597 <<
"UnrolledCost: " << UnrolledCost
598 <<
", MaxUnrolledLoopSize: " << MaxUnrolledLoopSize <<
"\n";
607 if (SimplifiedValues.
count(V))
608 V = SimplifiedValues.
lookup(V);
616 if (BI->isConditional()) {
617 if (
auto *SimpleCond = getSimplifiedConstant(BI->getCondition())) {
620 KnownSucc = BI->getSuccessor(0);
623 KnownSucc = BI->getSuccessor(SimpleCondVal->isZero() ? 1 : 0);
627 if (
auto *SimpleCond = getSimplifiedConstant(
SI->getCondition())) {
630 KnownSucc =
SI->getSuccessor(0);
633 KnownSucc =
SI->findCaseValue(SimpleCondVal)->getCaseSuccessor();
637 if (L->contains(KnownSucc))
638 BBWorklist.
insert(KnownSucc);
640 ExitWorklist.
insert({BB, KnownSucc});
646 if (L->contains(Succ))
649 ExitWorklist.
insert({BB, Succ});
650 AddCostRecursively(*TI, Iteration);
655 if (UnrolledCost == RolledDynamicCost) {
657 dbgs().
indent(4) <<
"No opportunities found.. exiting.\n";
658 dbgs().
indent(4) <<
"UnrolledCost: " << UnrolledCost <<
"\n";
664 while (!ExitWorklist.
empty()) {
666 std::tie(ExitingBB, ExitBB) = ExitWorklist.
pop_back_val();
673 Value *
Op = PN->getIncomingValueForBlock(ExitingBB);
675 if (L->contains(OpI))
676 AddCostRecursively(*OpI, TripCount - 1);
681 "All instructions must have a valid cost, whether the "
682 "loop is rolled or unrolled.");
686 dbgs().
indent(4) <<
"UnrolledCost: " << UnrolledCost
687 <<
", RolledDynamicCost: " << RolledDynamicCost <<
"\n";
698 Metrics.analyzeBasicBlock(BB,
TTI, EphValues,
false,
701 NotDuplicatable =
Metrics.notDuplicatable;
714 if (LoopSize.isValid() && LoopSize < BEInsns + 1)
716 LoopSize = BEInsns + 1;
722 <<
"Not unrolling: contains convergent operations.\n");
725 if (!LoopSize.isValid()) {
727 <<
"Not unrolling: loop size could not be computed.\n");
730 if (NotDuplicatable) {
732 <<
"Not unrolling: contains non-duplicatable instructions.\n");
740 unsigned CountOverwrite)
const {
741 unsigned LS = LoopSize.getValue();
742 assert(LS >= UP.
BEInsns &&
"LoopSize should not be less than BEInsns!");
753 if (
MDNode *LoopID = L->getLoopID())
780 "Unroll count hint metadata should have two operands.");
783 assert(
Count >= 1 &&
"Unroll count must be positive.");
795 unsigned MaxPercentThresholdBoost) {
796 if (Cost.RolledDynamicCost >= std::numeric_limits<unsigned>::max() / 100)
798 else if (Cost.UnrolledCost != 0)
800 return std::min(100 * Cost.RolledDynamicCost / Cost.UnrolledCost,
801 MaxPercentThresholdBoost);
803 return MaxPercentThresholdBoost;
806static std::optional<unsigned>
808 const unsigned TripMultiple,
const unsigned TripCount,
815 if (PInfo.UserUnrollCount) {
822 if (PInfo.PragmaCount > 0) {
823 if ((UP.
AllowRemainder || (TripMultiple % PInfo.PragmaCount == 0)))
824 return PInfo.PragmaCount;
827 if (PInfo.PragmaFullUnroll && TripCount != 0) {
839 if (PInfo.PragmaEnableUnroll && !TripCount && MaxTripCount &&
851 assert(FullUnrollTripCount &&
"should be non-zero!");
859 return FullUnrollTripCount;
865 L, FullUnrollTripCount, DT, SE, EphValues,
TTI,
870 if (Cost->UnrolledCost < UP.
Threshold * Boost / 100)
871 return FullUnrollTripCount;
876static std::optional<unsigned>
886 <<
"-unroll-allow-partial not given\n");
923 <<
"Partially unrolling with count: " <<
count <<
"\n");
940 const unsigned TripCount,
941 const unsigned MaxTripCount,
const bool MaxOrZero,
942 const unsigned TripMultiple,
949 const bool UserUnrollCount =
UnrollCount.getNumOccurrences() > 0;
954 const bool ExplicitUnroll = PragmaCount > 0 || PragmaFullUnroll ||
955 PragmaEnableUnroll || UserUnrollCount;
957 PragmaInfo PInfo(UserUnrollCount, PragmaFullUnroll, PragmaCount,
964 "explicit unroll count");
974 MaxTripCount, UCE, UP)) {
975 UP.
Count = *UnrollFactor;
977 if (UserUnrollCount || (PragmaCount > 0)) {
981 UP.
Runtime |= (PragmaCount > 0);
982 return ExplicitUnroll;
984 if (ExplicitUnroll && TripCount != 0) {
998 UP.
Count = TripCount;
1000 TripCount, UCE, UP)) {
1001 UP.
Count = *UnrollFactor;
1002 return ExplicitUnroll;
1018 if (!TripCount && MaxTripCount && (UP.
UpperBound || MaxOrZero) &&
1020 UP.
Count = MaxTripCount;
1022 MaxTripCount, UCE, UP)) {
1023 UP.
Count = *UnrollFactor;
1024 return ExplicitUnroll;
1033 return ExplicitUnroll;
1044 UP.
Count = *UnrollFactor;
1046 if ((PragmaFullUnroll || PragmaEnableUnroll) && TripCount &&
1047 UP.
Count != TripCount)
1050 "FullUnrollAsDirectedTooLarge",
1051 L->getStartLoc(), L->getHeader())
1052 <<
"unable to fully unroll loop as directed by unroll metadata "
1053 "because unrolled size is too large";
1057 if (UP.
Count == 0) {
1058 if (PragmaEnableUnroll)
1061 "UnrollAsDirectedTooLarge",
1062 L->getStartLoc(), L->getHeader())
1063 <<
"unable to unroll loop as directed by "
1064 "llvm.loop.unroll.enable metadata because unrolled size "
1069 return ExplicitUnroll;
1072 "All cases when TripCount is constant should be covered here.");
1073 if (PragmaFullUnroll)
1076 DEBUG_TYPE,
"CantFullUnrollAsDirectedRuntimeTripCount",
1077 L->getStartLoc(), L->getHeader())
1078 <<
"unable to fully unroll loop as directed by "
1079 "llvm.loop.unroll.full metadata because loop has a runtime "
1097 if (L->getHeader()->getParent()->hasProfileData()) {
1105 UP.
Runtime |= PragmaEnableUnroll || PragmaCount > 0 || UserUnrollCount;
1108 <<
"Will not try to unroll loop with runtime trip count "
1109 <<
"because -unroll-runtime not given\n");
1118 while (UP.
Count != 0 &&
1123 unsigned OrigCount = UP.
Count;
1127 while (UP.
Count != 0 && TripMultiple % UP.
Count != 0)
1130 <<
"Remainder loop is restricted (that could be architecture "
1131 "specific or because the loop contains a convergent "
1132 "instruction), so unroll count must divide the trip "
1134 << TripMultiple <<
". Reducing unroll count from " << OrigCount
1135 <<
" to " << UP.
Count <<
".\n");
1137 using namespace ore;
1142 "DifferentUnrollCountFromDirected",
1143 L->getStartLoc(), L->getHeader())
1144 <<
"Unable to unroll loop the number of times directed by "
1145 "llvm.loop.unroll.count metadata because remainder loop is "
1146 "restricted (that could be architecture specific or because "
1147 "the loop contains a convergent instruction) and so must "
1148 "have an unroll count that divides the loop trip multiple of "
1149 << NV(
"TripMultiple", TripMultiple) <<
". Unrolling instead "
1150 << NV(
"UnrollCount", UP.
Count) <<
" time(s).";
1157 if (MaxTripCount && UP.
Count > MaxTripCount)
1158 UP.
Count = MaxTripCount;
1161 <<
"Runtime unrolling with count: " << UP.
Count <<
"\n");
1164 return ExplicitUnroll;
1172 bool OnlyFullUnroll,
bool OnlyWhenForced,
bool ForgetAllSCEV,
1173 std::optional<unsigned> ProvidedCount,
1174 std::optional<unsigned> ProvidedThreshold,
1175 std::optional<bool> ProvidedAllowPartial,
1176 std::optional<bool> ProvidedRuntime,
1177 std::optional<bool> ProvidedUpperBound,
1178 std::optional<bool> ProvidedAllowPeeling,
1179 std::optional<bool> ProvidedAllowProfileBasedPeeling,
1180 std::optional<unsigned> ProvidedFullUnrollMaxCount,
1184 << L->getHeader()->getParent()->getName() <<
"] Loop %"
1185 << L->getHeader()->getName() <<
"\n");
1194 Loop *ParentL = L->getParentLoop();
1195 if (ParentL !=
nullptr &&
1199 <<
" llvm.loop.unroll_and_jam.\n");
1210 <<
"Not unrolling loop since it has llvm.loop.unroll_and_jam.\n");
1214 if (!L->isLoopSimplifyForm()) {
1216 <<
"Not unrolling loop which is not in loop-simplify form.\n");
1222 if (OnlyWhenForced && !(TM &
TM_Enable))
1225 bool OptForSize = L->getHeader()->getParent()->hasOptSize();
1227 L, SE,
TTI, BFI, PSI, ORE, OptLevel, ProvidedThreshold, ProvidedCount,
1228 ProvidedAllowPartial, ProvidedRuntime, ProvidedUpperBound,
1229 ProvidedFullUnrollMaxCount);
1231 L, SE,
TTI, ProvidedAllowPeeling, ProvidedAllowProfileBasedPeeling,
true);
1256 <<
"Not unrolling loop with inlinable calls.\n");
1265 unsigned TripCount = 0;
1266 unsigned TripMultiple = 1;
1268 L->getExitingBlocks(ExitingBlocks);
1269 for (
BasicBlock *ExitingBlock : ExitingBlocks)
1271 if (!TripCount || TC < TripCount)
1272 TripCount = TripMultiple = TC;
1278 BasicBlock *ExitingBlock = L->getLoopLatch();
1279 if (!ExitingBlock || !L->isLoopExiting(ExitingBlock))
1280 ExitingBlock = L->getExitingBlock();
1296 unsigned MaxTripCount = 0;
1297 bool MaxOrZero =
false;
1305 bool IsCountSetExplicitly =
1307 MaxTripCount, MaxOrZero, TripMultiple, UCE, UP, PP);
1314 assert(UP.
Count == 1 &&
"Cannot perform peel and unroll in the same step");
1315 LLVM_DEBUG(
dbgs() <<
"PEELING loop %" << L->getHeader()->getName()
1316 <<
" with iteration count " << PP.
PeelCount <<
"!\n");
1331 L->setLoopAlreadyUnrolled();
1336 if (OnlyFullUnroll && ((!TripCount && !MaxTripCount) ||
1337 UP.
Count < TripCount || UP.
Count < MaxTripCount)) {
1339 <<
"Not attempting partial/runtime unroll in FullLoopUnroll.\n");
1348 UP.
Runtime &= TripCount == 0 && TripMultiple % UP.
Count != 0;
1351 MDNode *OrigLoopID = L->getLoopID();
1354 Loop *RemainderLoop =
nullptr;
1367 L, ULO, LI, &SE, &DT, &AC, &
TTI, &ORE, PreserveLCSSA, &RemainderLoop,
AA);
1371 if (RemainderLoop) {
1372 std::optional<MDNode *> RemainderLoopID =
1375 if (RemainderLoopID)
1376 RemainderLoop->
setLoopID(*RemainderLoopID);
1380 std::optional<MDNode *> NewLoopID =
1384 L->setLoopID(*NewLoopID);
1388 return UnrollResult;
1395 L->setLoopAlreadyUnrolled();
1397 return UnrollResult;
1402class LoopUnroll :
public LoopPass {
1411 bool OnlyWhenForced;
1418 std::optional<unsigned> ProvidedCount;
1419 std::optional<unsigned> ProvidedThreshold;
1420 std::optional<bool> ProvidedAllowPartial;
1421 std::optional<bool> ProvidedRuntime;
1422 std::optional<bool> ProvidedUpperBound;
1423 std::optional<bool> ProvidedAllowPeeling;
1424 std::optional<bool> ProvidedAllowProfileBasedPeeling;
1425 std::optional<unsigned> ProvidedFullUnrollMaxCount;
1427 LoopUnroll(
int OptLevel = 2,
bool OnlyWhenForced =
false,
1428 bool ForgetAllSCEV =
false,
1429 std::optional<unsigned> Threshold = std::nullopt,
1430 std::optional<unsigned>
Count = std::nullopt,
1431 std::optional<bool> AllowPartial = std::nullopt,
1432 std::optional<bool>
Runtime = std::nullopt,
1433 std::optional<bool> UpperBound = std::nullopt,
1434 std::optional<bool> AllowPeeling = std::nullopt,
1435 std::optional<bool> AllowProfileBasedPeeling = std::nullopt,
1436 std::optional<unsigned> ProvidedFullUnrollMaxCount = std::nullopt)
1437 : LoopPass(
ID), OptLevel(OptLevel), OnlyWhenForced(OnlyWhenForced),
1438 ForgetAllSCEV(ForgetAllSCEV), ProvidedCount(std::
move(
Count)),
1439 ProvidedThreshold(Threshold), ProvidedAllowPartial(AllowPartial),
1440 ProvidedRuntime(
Runtime), ProvidedUpperBound(UpperBound),
1441 ProvidedAllowPeeling(AllowPeeling),
1442 ProvidedAllowProfileBasedPeeling(AllowProfileBasedPeeling),
1443 ProvidedFullUnrollMaxCount(ProvidedFullUnrollMaxCount) {
1447 bool runOnLoop(Loop *L, LPPassManager &LPM)
override {
1453 auto &DT = getAnalysis<DominatorTreeWrapperPass>().getDomTree();
1454 LoopInfo *LI = &getAnalysis<LoopInfoWrapperPass>().getLoopInfo();
1455 ScalarEvolution &SE = getAnalysis<ScalarEvolutionWrapperPass>().getSE();
1456 const TargetTransformInfo &
TTI =
1457 getAnalysis<TargetTransformInfoWrapperPass>().getTTI(
F);
1458 auto &AC = getAnalysis<AssumptionCacheTracker>().getAssumptionCache(
F);
1462 OptimizationRemarkEmitter ORE(&
F);
1463 bool PreserveLCSSA = mustPreserveAnalysisID(
LCSSAID);
1466 L, DT, LI, SE,
TTI, AC, ORE,
nullptr,
nullptr, PreserveLCSSA, OptLevel,
1467 false, OnlyWhenForced, ForgetAllSCEV, ProvidedCount,
1468 ProvidedThreshold, ProvidedAllowPartial, ProvidedRuntime,
1469 ProvidedUpperBound, ProvidedAllowPeeling,
1470 ProvidedAllowProfileBasedPeeling, ProvidedFullUnrollMaxCount);
1472 if (Result == LoopUnrollResult::FullyUnrolled)
1475 return Result != LoopUnrollResult::Unmodified;
1480 void getAnalysisUsage(AnalysisUsage &AU)
const override {
1491char LoopUnroll::ID = 0;
1500 bool ForgetAllSCEV,
int Threshold,
int Count,
1501 int AllowPartial,
int Runtime,
int UpperBound,
1506 return new LoopUnroll(
1507 OptLevel, OnlyWhenForced, ForgetAllSCEV,
1508 Threshold == -1 ? std::nullopt : std::optional<unsigned>(Threshold),
1509 Count == -1 ? std::nullopt : std::optional<unsigned>(
Count),
1510 AllowPartial == -1 ? std::nullopt : std::optional<bool>(AllowPartial),
1512 UpperBound == -1 ? std::nullopt : std::optional<bool>(UpperBound),
1513 AllowPeeling == -1 ? std::nullopt : std::optional<bool>(AllowPeeling));
1526 Loop *ParentL = L.getParentLoop();
1533 std::string LoopName = std::string(L.getName());
1538 true, OptLevel,
true,
1539 OnlyWhenForced, ForgetSCEV, std::nullopt,
1540 std::nullopt,
false,
1571 bool IsCurrentLoopValid =
false;
1578 if (SibLoop == &L) {
1579 IsCurrentLoopValid =
true;
1588 if (!IsCurrentLoopValid) {
1617 if (
auto *LAMProxy = AM.
getCachedResult<LoopAnalysisManagerFunctionProxy>(
F))
1618 LAM = &LAMProxy->getManager();
1623 auto *BFI = (PSI && PSI->hasProfileSummary()) ?
1633 for (
const auto &L : LI) {
1644 while (!Worklist.
empty()) {
1651 Loop *ParentL = L.getParentLoop();
1657 std::optional<bool> LocalAllowPeeling = UnrollOpts.AllowPeeling;
1658 if (PSI && PSI->hasHugeWorkingSetSize())
1659 LocalAllowPeeling =
false;
1660 std::string LoopName = std::string(L.getName());
1664 &L, DT, &LI, SE,
TTI, AC, ORE, BFI, PSI,
1665 true, UnrollOpts.OptLevel,
false,
1666 UnrollOpts.OnlyWhenForced, UnrollOpts.ForgetSCEV,
1668 std::nullopt, UnrollOpts.AllowPartial,
1669 UnrollOpts.AllowRuntime, UnrollOpts.AllowUpperBound, LocalAllowPeeling,
1670 UnrollOpts.AllowProfileBasedPeeling, UnrollOpts.FullUnrollMaxCount,
1682 LAM->clear(L, LoopName);
1694 OS, MapClassName2PassName);
1696 if (UnrollOpts.AllowPartial != std::nullopt)
1697 OS << (*UnrollOpts.AllowPartial ?
"" :
"no-") <<
"partial;";
1698 if (UnrollOpts.AllowPeeling != std::nullopt)
1699 OS << (*UnrollOpts.AllowPeeling ?
"" :
"no-") <<
"peeling;";
1700 if (UnrollOpts.AllowRuntime != std::nullopt)
1701 OS << (*UnrollOpts.AllowRuntime ?
"" :
"no-") <<
"runtime;";
1702 if (UnrollOpts.AllowUpperBound != std::nullopt)
1703 OS << (*UnrollOpts.AllowUpperBound ?
"" :
"no-") <<
"upperbound;";
1704 if (UnrollOpts.AllowProfileBasedPeeling != std::nullopt)
1705 OS << (*UnrollOpts.AllowProfileBasedPeeling ?
"" :
"no-")
1706 <<
"profile-peeling;";
1707 if (UnrollOpts.FullUnrollMaxCount != std::nullopt)
1708 OS <<
"full-unroll-max=" << UnrollOpts.FullUnrollMaxCount <<
';';
1709 OS <<
'O' << UnrollOpts.OptLevel;
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
static cl::opt< OutputCostKind > CostKind("cost-kind", cl::desc("Target cost kind"), cl::init(OutputCostKind::RecipThroughput), cl::values(clEnumValN(OutputCostKind::RecipThroughput, "throughput", "Reciprocal throughput"), clEnumValN(OutputCostKind::Latency, "latency", "Instruction latency"), clEnumValN(OutputCostKind::CodeSize, "code-size", "Code size"), clEnumValN(OutputCostKind::SizeAndLatency, "size-latency", "Code size and latency"), clEnumValN(OutputCostKind::All, "all", "Print all cost kinds")))
This file defines DenseMapInfo traits for DenseMap.
This file defines the DenseMap class.
This file defines the DenseSet and SmallDenseSet classes.
This file provides various utilities for inspecting and working with the control flow graph in LLVM I...
This header defines various interfaces for pass management in LLVM.
This header provides classes for managing per-loop analyses.
This header provides classes for managing a pipeline of passes over loops in LLVM IR.
static MDNode * getUnrollMetadataForLoop(const Loop *L, StringRef Name)
static cl::opt< unsigned > UnrollMaxCount("unroll-max-count", cl::Hidden, cl::desc("Set the max unroll count for partial and runtime unrolling, for" "testing purposes"))
static cl::opt< unsigned > UnrollCount("unroll-count", cl::Hidden, cl::desc("Use this unroll count for all loops including those with " "unroll_count pragma values, for testing purposes"))
static cl::opt< unsigned > UnrollThresholdDefault("unroll-threshold-default", cl::init(150), cl::Hidden, cl::desc("Default threshold (max size of unrolled " "loop), used in all but O3 optimizations"))
static cl::opt< unsigned > FlatLoopTripCountThreshold("flat-loop-tripcount-threshold", cl::init(5), cl::Hidden, cl::desc("If the runtime tripcount for the loop is lower than the " "threshold, the loop is considered as flat and will be less " "aggressively unrolled."))
static cl::opt< unsigned > UnrollOptSizeThreshold("unroll-optsize-threshold", cl::init(0), cl::Hidden, cl::desc("The cost threshold for loop unrolling when optimizing for " "size"))
static bool hasUnrollFullPragma(const Loop *L)
static cl::opt< bool > UnrollUnrollRemainder("unroll-remainder", cl::Hidden, cl::desc("Allow the loop remainder to be unrolled."))
static unsigned unrollCountPragmaValue(const Loop *L)
static bool hasUnrollEnablePragma(const Loop *L)
static cl::opt< unsigned > PragmaUnrollThreshold("pragma-unroll-threshold", cl::init(16 *1024), cl::Hidden, cl::desc("Unrolled size limit for loops with unroll metadata " "(full, enable, or count)."))
static cl::opt< unsigned > UnrollFullMaxCount("unroll-full-max-count", cl::Hidden, cl::desc("Set the max unroll count for full unrolling, for testing purposes"))
static cl::opt< unsigned > UnrollMaxUpperBound("unroll-max-upperbound", cl::init(8), cl::Hidden, cl::desc("The max of trip count upper bound that is considered in unrolling"))
static std::optional< unsigned > shouldFullUnroll(Loop *L, const TargetTransformInfo &TTI, DominatorTree &DT, ScalarEvolution &SE, const SmallPtrSetImpl< const Value * > &EphValues, const unsigned FullUnrollTripCount, const UnrollCostEstimator UCE, const TargetTransformInfo::UnrollingPreferences &UP)
static std::optional< EstimatedUnrollCost > analyzeLoopUnrollCost(const Loop *L, unsigned TripCount, DominatorTree &DT, ScalarEvolution &SE, const SmallPtrSetImpl< const Value * > &EphValues, const TargetTransformInfo &TTI, unsigned MaxUnrolledLoopSize, unsigned MaxIterationsCountToAnalyze)
Figure out if the loop is worth full unrolling.
static cl::opt< unsigned > UnrollPartialThreshold("unroll-partial-threshold", cl::Hidden, cl::desc("The cost threshold for partial loop unrolling"))
static cl::opt< bool > UnrollAllowRemainder("unroll-allow-remainder", cl::Hidden, cl::desc("Allow generation of a loop remainder (extra iterations) " "when unrolling a loop."))
static std::optional< unsigned > shouldPartialUnroll(const unsigned LoopSize, const unsigned TripCount, const UnrollCostEstimator UCE, const TargetTransformInfo::UnrollingPreferences &UP)
static cl::opt< unsigned > PragmaUnrollFullMaxIterations("pragma-unroll-full-max-iterations", cl::init(1 '000 '000), cl::Hidden, cl::desc("Maximum allowed iterations to unroll under pragma unroll full."))
static const unsigned NoThreshold
A magic value for use with the Threshold parameter to indicate that the loop unroll should be perform...
static std::optional< unsigned > shouldPragmaUnroll(Loop *L, const PragmaInfo &PInfo, const unsigned TripMultiple, const unsigned TripCount, unsigned MaxTripCount, const UnrollCostEstimator UCE, const TargetTransformInfo::UnrollingPreferences &UP)
static cl::opt< bool > UnrollRevisitChildLoops("unroll-revisit-child-loops", cl::Hidden, cl::desc("Enqueue and re-visit child loops in the loop PM after unrolling. " "This shouldn't typically be needed as child loops (or their " "clones) were already visited."))
static cl::opt< unsigned > UnrollThreshold("unroll-threshold", cl::Hidden, cl::desc("The cost threshold for loop unrolling"))
static cl::opt< bool > UnrollRuntime("unroll-runtime", cl::Hidden, cl::desc("Unroll loops with run-time trip counts"))
static LoopUnrollResult tryToUnrollLoop(Loop *L, DominatorTree &DT, LoopInfo *LI, ScalarEvolution &SE, const TargetTransformInfo &TTI, AssumptionCache &AC, OptimizationRemarkEmitter &ORE, BlockFrequencyInfo *BFI, ProfileSummaryInfo *PSI, bool PreserveLCSSA, int OptLevel, bool OnlyFullUnroll, bool OnlyWhenForced, bool ForgetAllSCEV, std::optional< unsigned > ProvidedCount, std::optional< unsigned > ProvidedThreshold, std::optional< bool > ProvidedAllowPartial, std::optional< bool > ProvidedRuntime, std::optional< bool > ProvidedUpperBound, std::optional< bool > ProvidedAllowPeeling, std::optional< bool > ProvidedAllowProfileBasedPeeling, std::optional< unsigned > ProvidedFullUnrollMaxCount, AAResults *AA=nullptr)
static bool hasRuntimeUnrollDisablePragma(const Loop *L)
static unsigned getFullUnrollBoostingFactor(const EstimatedUnrollCost &Cost, unsigned MaxPercentThresholdBoost)
static cl::opt< unsigned > UnrollThresholdAggressive("unroll-threshold-aggressive", cl::init(300), cl::Hidden, cl::desc("Threshold (max size of unrolled loop) to use in aggressive (O3) " "optimizations"))
static cl::opt< unsigned > UnrollMaxIterationsCountToAnalyze("unroll-max-iteration-count-to-analyze", cl::init(10), cl::Hidden, cl::desc("Don't allow loop unrolling to simulate more than this number of " "iterations when checking full unroll profitability"))
static cl::opt< unsigned > UnrollMaxPercentThresholdBoost("unroll-max-percent-threshold-boost", cl::init(400), cl::Hidden, cl::desc("The maximum 'boost' (represented as a percentage >= 100) applied " "to the threshold when aggressively unrolling a loop due to the " "dynamic cost savings. If completely unrolling a loop will reduce " "the total runtime from X to Y, we boost the loop unroll " "threshold to DefaultThreshold*std::min(MaxPercentThresholdBoost, " "X/Y). This limit avoids excessive code bloat."))
static cl::opt< bool > UnrollAllowPartial("unroll-allow-partial", cl::Hidden, cl::desc("Allows loops to be partially unrolled until " "-unroll-threshold loop size is reached."))
This file exposes an interface to building/using memory SSA to walk memory instructions using a use/d...
#define INITIALIZE_PASS_DEPENDENCY(depName)
#define INITIALIZE_PASS_END(passName, arg, name, cfg, analysis)
#define INITIALIZE_PASS_BEGIN(passName, arg, name, cfg, analysis)
This file implements a set that has insertion order iteration characteristics.
This file defines the SmallPtrSet class.
This file defines the SmallVector class.
A manager for alias analyses.
PassT::Result * getCachedResult(IRUnitT &IR) const
Get the cached result of an analysis pass for a given IR unit.
PassT::Result & getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs)
Get the result of an analysis pass for a given IR unit.
AnalysisUsage & addRequired()
A function analysis which provides an AssumptionCache.
An immutable pass that tracks lazily created AssumptionCache objects.
A cache of @llvm.assume calls within a function.
LLVM Basic Block Representation.
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...
Analysis pass which computes BlockFrequencyInfo.
BlockFrequencyInfo pass uses BlockFrequencyInfoImpl implementation to estimate IR basic block frequen...
Conditional or Unconditional Branch instruction.
This is the shared class of boolean and integer constants.
This is an important base class in LLVM.
ValueT lookup(const_arg_type_t< KeyT > Val) const
lookup - Return the entry for the specified key, or a default constructed value if no such entry exis...
size_type count(const_arg_type_t< KeyT > Val) const
Return 1 if the specified key is in the map, 0 otherwise.
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
Implements a dense probed hash-table based set.
Analysis pass which computes a DominatorTree.
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
bool hasMinSize() const
Optimize this function for minimum size (-Oz).
CostType getValue() const
This function is intended to be used as sparingly as possible, since the class provides the full rang...
LLVM_ABI const Function * getFunction() const
Return the function this instruction belongs to.
This class provides an interface for updating the loop pass manager based on mutations to the loop ne...
void addChildLoops(ArrayRef< Loop * > NewChildLoops)
Loop passes should use this method to indicate they have added new child loops of the current loop.
void markLoopAsDeleted(Loop &L, llvm::StringRef Name)
Loop passes should use this method to indicate they have deleted a loop from the nest.
void addSiblingLoops(ArrayRef< Loop * > NewSibLoops)
Loop passes should use this method to indicate they have added new sibling loops to the current loop.
void markLoopAsDeleted(Loop &L)
Analysis pass that exposes the LoopInfo for a function.
void verifyLoop() const
Verify loop structure.
PreservedAnalyses run(Loop &L, LoopAnalysisManager &AM, LoopStandardAnalysisResults &AR, LPMUpdater &U)
PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM)
void printPipeline(raw_ostream &OS, function_ref< StringRef(StringRef)> MapClassName2PassName)
Represents a single loop in the control flow graph.
void setLoopID(MDNode *LoopID) const
Set the llvm.loop loop id metadata for this loop.
const MDOperand & getOperand(unsigned I) const
unsigned getNumOperands() const
Return number of MDNode operands.
static LLVM_ABI PassRegistry * getPassRegistry()
getPassRegistry - Access the global registry object, which is automatically initialized at applicatio...
Pass interface - Implemented by all 'passes'.
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.
bool empty() const
Determine if the PriorityWorklist is empty or not.
An analysis pass based on the new PM to deliver ProfileSummaryInfo.
Analysis providing profile information.
Analysis pass that exposes the ScalarEvolution for a function.
The main scalar evolution driver.
LLVM_ABI unsigned getSmallConstantTripMultiple(const Loop *L, const SCEV *ExitCount)
Returns the largest constant divisor of the trip count as a normal unsigned value,...
LLVM_ABI unsigned getSmallConstantMaxTripCount(const Loop *L, SmallVectorImpl< const SCEVPredicate * > *Predicates=nullptr)
Returns the upper bound of the loop trip count as a normal unsigned value.
LLVM_ABI bool isBackedgeTakenCountMaxOrZero(const Loop *L)
Return true if the backedge taken count is either the value returned by getConstantMaxBackedgeTakenCo...
LLVM_ABI unsigned getSmallConstantTripCount(const Loop *L)
Returns the exact trip count of the loop if we can compute it, and the result is a small constant.
size_type size() const
Determine the number of elements in the SetVector.
void clear()
Completely clear the SetVector.
bool empty() const
Determine if the SetVector is empty or not.
bool insert(const value_type &X)
Insert a new element into the SetVector.
value_type pop_back_val()
A version of PriorityWorklist that selects small size optimized data structures for the vector and ma...
A templated base class for SmallPtrSet which provides the typesafe interface that is common across al...
size_type count(ConstPtrType Ptr) const
count - Return 1 if the specified pointer is in the set, 0 otherwise.
void insert_range(Range &&R)
bool contains(ConstPtrType Ptr) const
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
A SetVector that performs no allocations if smaller than a certain size.
void append(ItTy in_start, ItTy in_end)
Add the specified range to the end of the SmallVector.
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
StringRef - Represent a constant reference to a string, i.e.
Analysis pass providing the TargetTransformInfo.
Produce an estimate of the unrolled cost of the specified loop.
ConvergenceKind Convergence
bool ConvergenceAllowsRuntime
LLVM_ABI uint64_t getUnrolledLoopSize(const TargetTransformInfo::UnrollingPreferences &UP, unsigned CountOverwrite=0) const
Returns loop size estimation for unrolled loop, given the unrolling configuration specified by UP.
LLVM_ABI bool canUnroll() const
Whether it is legal to unroll this loop.
unsigned NumInlineCandidates
LLVM_ABI UnrollCostEstimator(const Loop *L, const TargetTransformInfo &TTI, const SmallPtrSetImpl< const Value * > &EphValues, unsigned BEInsns)
uint64_t getRolledLoopSize() const
void visit(Iterator Start, Iterator End)
LLVM Value Representation.
std::pair< iterator, bool > insert(const ValueT &V)
iterator find(const_arg_type_t< ValueT > V)
An efficient, type-erasing, non-owning reference to a callable.
This class implements an extremely fast bulk output stream that can only output to a stream.
raw_ostream & indent(unsigned NumSpaces)
indent - Insert 'NumSpaces' spaces.
Abstract Attribute helper functions.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
initializer< Ty > init(const Ty &Val)
std::enable_if_t< detail::IsValidPointer< X, Y >::value, X * > extract(Y &&MD)
Extract a Value from Metadata.
Add a small namespace to avoid name clashes with the classes used in the streaming interface.
DiagnosticInfoOptimizationBase::Argument NV
This is an optimization pass for GlobalISel generic memory operations.
LLVM_ABI bool simplifyLoop(Loop *L, DominatorTree *DT, LoopInfo *LI, ScalarEvolution *SE, AssumptionCache *AC, MemorySSAUpdater *MSSAU, bool PreserveLCSSA)
Simplify each loop in a loop nest recursively.
LLVM_ABI std::optional< unsigned > getLoopEstimatedTripCount(Loop *L, unsigned *EstimatedLoopInvocationWeight=nullptr)
Return either:
bool isEqual(const GCNRPTracker::LiveRegSet &S1, const GCNRPTracker::LiveRegSet &S2)
LLVM_ABI void simplifyLoopAfterUnroll(Loop *L, bool SimplifyIVs, LoopInfo *LI, ScalarEvolution *SE, DominatorTree *DT, AssumptionCache *AC, const TargetTransformInfo *TTI, AAResults *AA=nullptr)
Perform some cleanup and simplifications on loops after unrolling.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
auto successors(const MachineBasicBlock *BB)
@ Runtime
Detect stack use after return if not disabled runtime with (ASAN_OPTIONS=detect_stack_use_after_retur...
OuterAnalysisManagerProxy< ModuleAnalysisManager, Function > ModuleAnalysisManagerFunctionProxy
Provide the ModuleAnalysisManager to Function proxy.
LLVM_ABI bool computeUnrollCount(Loop *L, const TargetTransformInfo &TTI, DominatorTree &DT, LoopInfo *LI, AssumptionCache *AC, ScalarEvolution &SE, const SmallPtrSetImpl< const Value * > &EphValues, OptimizationRemarkEmitter *ORE, unsigned TripCount, unsigned MaxTripCount, bool MaxOrZero, unsigned TripMultiple, const UnrollCostEstimator &UCE, TargetTransformInfo::UnrollingPreferences &UP, TargetTransformInfo::PeelingPreferences &PP)
LLVM_ABI bool formLCSSARecursively(Loop &L, const DominatorTree &DT, const LoopInfo *LI, ScalarEvolution *SE)
Put a loop nest into LCSSA form.
LLVM_ABI std::optional< MDNode * > makeFollowupLoopID(MDNode *OrigLoopID, ArrayRef< StringRef > FollowupAttrs, const char *InheritOptionsAttrsPrefix="", bool AlwaysNew=false)
Create a new loop identifier for a loop created from a loop transformation.
LLVM_ABI bool shouldOptimizeForSize(const MachineFunction *MF, ProfileSummaryInfo *PSI, const MachineBlockFrequencyInfo *BFI, PGSOQueryType QueryType=PGSOQueryType::Other)
Returns true if machine function MF is suggested to be size-optimized based on the profile.
LLVM_ABI Pass * createLoopUnrollPass(int OptLevel=2, bool OnlyWhenForced=false, bool ForgetAllSCEV=false, int Threshold=-1, int Count=-1, int AllowPartial=-1, int Runtime=-1, int UpperBound=-1, int AllowPeeling=-1)
AnalysisManager< Loop, LoopStandardAnalysisResults & > LoopAnalysisManager
The loop analysis manager.
OutputIt transform(R &&Range, OutputIt d_first, UnaryFunction F)
Wrapper function around std::transform to apply a function to a range and store the result elsewhere.
LLVM_ABI void initializeLoopUnrollPass(PassRegistry &)
TargetTransformInfo::PeelingPreferences gatherPeelingPreferences(Loop *L, ScalarEvolution &SE, const TargetTransformInfo &TTI, std::optional< bool > UserAllowPeeling, std::optional< bool > UserAllowProfileBasedPeeling, bool UnrollingSpecficValues=false)
LLVM_ABI CallBase * getLoopConvergenceHeart(const Loop *TheLoop)
Find the convergence heart of the loop.
LLVM_ABI TransformationMode hasUnrollAndJamTransformation(const Loop *L)
cl::opt< bool > ForgetSCEVInLoopUnroll
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
void computePeelCount(Loop *L, unsigned LoopSize, TargetTransformInfo::PeelingPreferences &PP, unsigned TripCount, DominatorTree &DT, ScalarEvolution &SE, const TargetTransformInfo &TTI, AssumptionCache *AC=nullptr, unsigned Threshold=UINT_MAX)
LLVM_TEMPLATE_ABI void appendLoopsToWorklist(RangeT &&, SmallPriorityWorklist< Loop *, 4 > &)
Utility that implements appending of loops onto a worklist given a range.
LLVM_ABI cl::opt< unsigned > SCEVCheapExpansionBudget
FunctionAddr VTableAddr Count
LLVM_ABI TransformationMode hasUnrollTransformation(const Loop *L)
LoopUnrollResult
Represents the result of a UnrollLoop invocation.
@ PartiallyUnrolled
The loop was partially unrolled – we still have a loop, but with a smaller trip count.
@ Unmodified
The loop was not modified.
@ FullyUnrolled
The loop was fully unrolled into straight-line code.
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...
LLVM_ABI void getLoopAnalysisUsage(AnalysisUsage &AU)
Helper to consistently add the set of standard passes to a loop pass's AnalysisUsage.
void peelLoop(Loop *L, unsigned PeelCount, bool PeelLast, LoopInfo *LI, ScalarEvolution *SE, DominatorTree &DT, AssumptionCache *AC, bool PreserveLCSSA, ValueToValueMapTy &VMap)
VMap is the value-map that maps instructions from the original loop to instructions in the last peele...
const char *const LLVMLoopUnrollFollowupAll
TransformationMode
The mode sets how eager a transformation should be applied.
@ TM_ForcedByUser
The transformation was directed by the user, e.g.
@ TM_Disable
The transformation should not be applied.
@ TM_Enable
The transformation should be applied without considering a cost model.
auto count(R &&Range, const E &Element)
Wrapper function around std::count to count the number of times an element Element occurs in the give...
DWARFExpression::Operation Op
LLVM_ABI TargetTransformInfo::UnrollingPreferences gatherUnrollingPreferences(Loop *L, ScalarEvolution &SE, const TargetTransformInfo &TTI, BlockFrequencyInfo *BFI, ProfileSummaryInfo *PSI, llvm::OptimizationRemarkEmitter &ORE, int OptLevel, std::optional< unsigned > UserThreshold, std::optional< unsigned > UserCount, std::optional< bool > UserAllowPartial, std::optional< bool > UserRuntime, std::optional< bool > UserUpperBound, std::optional< unsigned > UserFullUnrollMaxCount)
Gather the various unrolling parameters based on the defaults, compiler flags, TTI overrides and user...
ValueMap< const Value *, WeakTrackingVH > ValueToValueMapTy
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
const char *const LLVMLoopUnrollFollowupRemainder
LLVM_ABI PreservedAnalyses getLoopPassPreservedAnalyses()
Returns the minimum set of Analyses that all loop passes must preserve.
const char *const LLVMLoopUnrollFollowupUnrolled
void erase_if(Container &C, UnaryPredicate P)
Provide a container algorithm similar to C++ Library Fundamentals v2's erase_if which is equivalent t...
AnalysisManager< Function > FunctionAnalysisManager
Convenience typedef for the Function analysis manager.
LLVM_ABI MDNode * GetUnrollMetadata(MDNode *LoopID, StringRef Name)
Given an llvm.loop loop id metadata node, returns the loop hint metadata node with the given name (fo...
LLVM_ABI LoopUnrollResult UnrollLoop(Loop *L, UnrollLoopOptions ULO, LoopInfo *LI, ScalarEvolution *SE, DominatorTree *DT, AssumptionCache *AC, const llvm::TargetTransformInfo *TTI, OptimizationRemarkEmitter *ORE, bool PreserveLCSSA, Loop **RemainderLoop=nullptr, AAResults *AA=nullptr)
Unroll the given loop by Count.
LLVM_ABI void reportFatalUsageError(Error Err)
Report a fatal error that does not indicate a bug in LLVM.
Utility to calculate the size and a few similar metrics for a set of basic blocks.
static LLVM_ABI void collectEphemeralValues(const Loop *L, AssumptionCache *AC, SmallPtrSetImpl< const Value * > &EphValues)
Collect a loop's ephemeral values (those used only by an assume or similar intrinsics in the loop).
The adaptor from a function pass to a loop pass computes these analyses and makes them available to t...
TargetTransformInfo & TTI
A CRTP mix-in to automatically provide informational APIs needed for passes.
const Instruction * Heart
bool RuntimeUnrollMultiExit
bool AllowExpensiveTripCount
bool AddAdditionalAccumulators
unsigned SCEVExpansionBudget