69#define DEBUG_TYPE "simple-loop-unswitch"
74STATISTIC(NumBranches,
"Number of branches unswitched");
75STATISTIC(NumSwitches,
"Number of switches unswitched");
76STATISTIC(NumSelects,
"Number of selects turned into branches for unswitching");
77STATISTIC(NumGuards,
"Number of guards turned into branches for unswitching");
78STATISTIC(NumTrivial,
"Number of unswitches that are trivial");
80 NumCostMultiplierSkipped,
81 "Number of unswitch candidates that had their cost multiplier skipped");
83 "Number of invariant conditions injected and unswitched");
88 cl::desc(
"Forcibly enables non-trivial loop unswitching rather than "
89 "following the configuration passed into the pass."));
93 cl::desc(
"The cost threshold for unswitching a loop."));
97 cl::desc(
"Enable unswitch cost multiplier that prohibits exponential "
98 "explosion in nontrivial unswitch."));
101 cl::desc(
"Toplevel siblings divisor for cost multiplier."));
104 cl::desc(
"Outer loop size divisor for cost multiplier."));
107 cl::desc(
"Number of unswitch candidates that are ignored when calculating "
108 "cost multiplier."));
111 cl::desc(
"If enabled, simple loop unswitching will also consider "
112 "llvm.experimental.guard intrinsics as unswitch candidates."));
114 "simple-loop-unswitch-drop-non-trivial-implicit-null-checks",
116 cl::desc(
"If enabled, drop make.implicit metadata in unswitched implicit "
117 "null checks to save time analyzing if we can keep it."));
120 cl::desc(
"Max number of memory uses to explore during "
121 "partial unswitching analysis"),
125 cl::desc(
"If enabled, the freeze instruction will be added to condition "
126 "of loop unswitch to prevent miscompilation."));
129 "simple-loop-unswitch-inject-invariant-conditions",
cl::Hidden,
130 cl::desc(
"Whether we should inject new invariants and unswitch them to "
131 "eliminate some existing (non-invariant) conditions."),
135 "simple-loop-unswitch-inject-invariant-condition-hotness-threshold",
137 cl::desc(
"Only try to inject loop invariant conditions and "
138 "unswitch on them to eliminate branches that are "
139 "not-taken 1/<this option> times or less."),
155 : Term(Term), Invariant(Invariant), InLoopSucc(InLoopSucc) {}
158struct InjectedInvariant {
159 ICmpInst::Predicate Pred;
164 InjectedInvariant(ICmpInst::Predicate Pred,
Value *LHS,
Value *RHS,
165 BasicBlock *InLoopSucc)
166 : Pred(Pred), LHS(LHS), RHS(RHS), InLoopSucc(InLoopSucc) {}
169struct NonTrivialUnswitchCandidate {
171 TinyPtrVector<Value *> Invariants;
172 std::optional<InstructionCost> Cost;
173 std::optional<InjectedInvariant> PendingInjection;
174 NonTrivialUnswitchCandidate(
176 std::optional<InstructionCost> Cost = std::nullopt,
177 std::optional<InjectedInvariant> PendingInjection = std::nullopt)
178 : TI(TI), Invariants(Invariants), Cost(Cost),
179 PendingInjection(PendingInjection) {};
181 bool hasPendingInjection()
const {
return PendingInjection.has_value(); }
205 assert(!L.isLoopInvariant(&Root) &&
206 "Only need to walk the graph if root itself is not invariant.");
219 for (
Value *OpV :
I.operand_values()) {
225 if (L.isLoopInvariant(OpV)) {
236 if (Visited.
insert(OpI).second)
240 }
while (!Worklist.
empty());
255 if (UserI && L.contains(UserI))
273 if (!L.isLoopInvariant(PN->getIncomingValueForBlock(&ExitingBB)))
309 if (HasBranchWeights &&
310 static_cast<double>(BranchWeights[
Direction ? 0 : 1]) /
311 static_cast<double>(
sum_of(BranchWeights)) >
313 HasBranchWeights =
false;
319 for (
Value *Inv : Invariants) {
329 Direction ? &NormalSucc : &UnswitchedSucc,
330 HasBranchWeights ? ComputeProfFrom.getMetadata(LLVMContext::MD_prof)
332 if (!HasBranchWeights)
342 for (
auto *Val :
reverse(ToDuplicate)) {
360 auto *DefiningAccess = MemUse->getDefiningAccess();
362 while (L.contains(DefiningAccess->getBlock())) {
367 MemPhi->getIncomingValueForBlock(L.getLoopPreheader());
385 ? OriginalBranch.getMetadata(LLVMContext::MD_prof)
389 Direction ? &NormalSucc : &UnswitchedSucc, ProfData);
408 for (
auto i :
seq<int>(0, PN.getNumOperands())) {
409 assert(PN.getIncomingBlock(i) == &OldExitingBB &&
410 "Found incoming block different from unique predecessor!");
411 PN.setIncomingBlock(i, &OldPH);
428 assert(&ExitBB != &UnswitchedBB &&
429 "Must have different loop exit and unswitched blocks!");
433 PN.getName() +
".split");
434 NewPN->insertBefore(InsertPt);
445 for (
int i = PN.getNumIncomingValues() - 1; i >= 0; --i) {
446 if (PN.getIncomingBlock(i) != &OldExitingBB)
449 Value *Incoming = PN.getIncomingValue(i);
452 PN.removeIncomingValue(i);
454 NewPN->addIncoming(Incoming, &OldPH);
459 PN.replaceAllUsesWith(NewPN);
460 NewPN->addIncoming(&PN, &ExitBB);
473 Loop *OldParentL = L.getParentLoop();
478 L.getExitBlocks(Exits);
479 Loop *NewParentL =
nullptr;
480 for (
auto *ExitBB : Exits)
482 if (!NewParentL || NewParentL->
contains(ExitL))
485 if (NewParentL == OldParentL)
491 "Can only hoist this loop up the nest!");
495 "Parent loop of this loop should contain this loop's preheader!");
510 for (
Loop *OldContainingL = OldParentL; OldContainingL != NewParentL;
513 return BB == &Preheader || L.contains(BB);
537 Loop *Current = TopMost;
567 LLVM_DEBUG(
dbgs() <<
" Trying to unswitch branch: " << BI <<
"\n");
574 bool FullUnswitch =
false;
577 if (L.isLoopInvariant(
Cond)) {
583 if (Invariants.
empty()) {
589 std::optional<int> LatchIdx = std::nullopt;
590 auto *LoopLatch = L.getLoopLatch();
592 if (SE && FullUnswitch && ULExit) {
599 bool ModifiedBranch =
false;
606 if (CB->isConvergent())
608 return I.mayHaveSideEffects();
621 LoopLatch->removePredecessor(BI.getParent());
623 for (
PHINode &PN : ULExit->phis()) {
624 Value *V = PN.getIncomingValueForBlock(LoopLatch);
625 PN.addIncoming(V, BI.getParent());
632 ModifiedBranch =
true;
637 bool ExitDirection =
true;
638 int LoopExitSuccIdx = 0;
640 if (L.contains(LoopExitBB)) {
641 ExitDirection =
false;
644 if (L.contains(LoopExitBB)) {
646 assert(!ModifiedBranch &&
"Modified the branch but didn't unswitch");
650 auto *ContinueBB = BI.
getSuccessor(1 - LoopExitSuccIdx);
651 auto *ParentBB = BI.getParent();
652 if (!ModifiedBranch &&
654 LLVM_DEBUG(
dbgs() <<
" Loop exit PHI's aren't loop-invariant!\n");
667 "non-full unswitch!\n");
668 assert(!ModifiedBranch &&
"Modified the branch but didn't unswitch");
674 dbgs() <<
" unswitching trivial invariant conditions for: " << BI
676 for (
Value *Invariant : Invariants) {
677 dbgs() <<
" " << *Invariant <<
" == true";
678 if (Invariant != Invariants.back())
710 if (FullUnswitch && LoopExitBB->getUniquePredecessor()) {
711 assert(LoopExitBB->getUniquePredecessor() == BI.getParent() &&
712 "A branch's parent isn't a predecessor!");
713 UnswitchedBB = LoopExitBB;
716 SplitBlock(LoopExitBB, LoopExitBB->begin(), &DT, &LI, MSSAU,
"");
730 BI.moveBefore(*OldPH, OldPH->
end());
735 BI.clone()->insertInto(ParentBB, ParentBB->end());
749 "Must have an `or` of `i1`s or `select i1 X, true, Y`s for the "
753 "Must have an `and` of `i1`s or `select i1 X, Y, false`s for the"
756 *OldPH, Invariants, ExitDirection, *UnswitchedBB, *NewPH,
779 Term->eraseFromParent();
789 if (UnswitchedBB == LoopExitBB)
793 *ParentBB, *OldPH, FullUnswitch);
804 for (
Value *Invariant : Invariants)
851 Value *LoopCond =
SI.getCondition();
854 if (!L.isLoopInvariant(LoopCond))
857 auto *ParentBB =
SI.getParent();
864 auto IsTriviallyUnswitchableExitBlock = [&](
BasicBlock &BBToCheck) {
866 if (L.contains(&BBToCheck))
875 auto *TI = BBToCheck.getTerminator();
877 return !isUnreachable || &*BBToCheck.getFirstNonPHIOrDbg() != TI;
881 for (
auto Case :
SI.cases())
882 if (IsTriviallyUnswitchableExitBlock(*Case.getCaseSuccessor()))
883 ExitCaseIndices.
push_back(Case.getCaseIndex());
887 if (IsTriviallyUnswitchableExitBlock(*
SI.getDefaultDest())) {
888 DefaultExitBB =
SI.getDefaultDest();
889 }
else if (ExitCaseIndices.
empty())
904 if (!ExitL || ExitL->
contains(OuterL))
907 for (
unsigned Index : ExitCaseIndices) {
908 auto CaseI =
SI.case_begin() + Index;
911 if (!ExitL || ExitL->
contains(OuterL))
925 SI.setDefaultDest(
nullptr);
933 ExitCases.reserve(ExitCaseIndices.
size());
937 for (
unsigned Index :
reverse(ExitCaseIndices)) {
938 auto CaseI =
SI.case_begin() + Index;
941 ExitCases.emplace_back(CaseI->getCaseValue(), CaseI->getCaseSuccessor(), W);
949 if (
SI.getNumCases() > 0 &&
951 return Case.getCaseSuccessor() == SI.case_begin()->getCaseSuccessor();
953 CommonSuccBB =
SI.case_begin()->getCaseSuccessor();
954 if (!DefaultExitBB) {
958 if (
SI.getNumCases() == 0)
959 CommonSuccBB =
SI.getDefaultDest();
960 else if (
SI.getDefaultDest() != CommonSuccBB)
961 CommonSuccBB =
nullptr;
990 UnswitchedExitBBs.
insert(DefaultExitBB);
998 DefaultExitBB = SplitExitBBMap[DefaultExitBB] = SplitBB;
1003 for (
auto &ExitCase :
reverse(ExitCases)) {
1011 if (UnswitchedExitBBs.
insert(ExitBB).second)
1018 BasicBlock *&SplitExitBB = SplitExitBBMap[ExitBB];
1027 std::get<1>(ExitCase) = SplitExitBB;
1032 for (
auto &ExitCase :
reverse(ExitCases)) {
1034 BasicBlock *UnswitchedBB = std::get<1>(ExitCase);
1036 NewSIW.
addCase(CaseVal, UnswitchedBB, std::get<2>(ExitCase));
1041 if (DefaultExitBB) {
1047 for (
const auto &Case :
SI.cases())
1050 }
else if (DefaultCaseWeight) {
1053 for (
const auto &Case :
SI.cases()) {
1056 "case weight must be defined as default case weight is defined");
1071 bool SkippedFirst = DefaultExitBB ==
nullptr;
1072 for (
auto Case :
SI.cases()) {
1074 "Non-common successor!");
1076 if (!SkippedFirst) {
1077 SkippedFirst =
true;
1087 }
else if (DefaultExitBB) {
1089 "If we had no cases we'd have a common successor!");
1094 auto LastCaseI = std::prev(
SI.case_end());
1096 SI.setDefaultDest(LastCaseI->getCaseSuccessor());
1107 for (
auto *UnswitchedExitBB : UnswitchedExitBBs) {
1111 for (
auto SplitUnswitchedPair : SplitExitBBMap) {
1112 DTUpdates.
push_back({DT.
Delete, ParentBB, SplitUnswitchedPair.first});
1124 assert(DT.
verify(DominatorTree::VerificationLevel::Fast));
1169 Visited.
insert(CurrentBB);
1176 if (!
isa<MemoryPhi>(*Defs->begin()) || (++Defs->begin() != Defs->end()))
1180 if (CB->isConvergent())
1182 return I.mayHaveSideEffects();
1210 CurrentBB = BI->getSuccessor();
1244 }
while (L.contains(CurrentBB) && Visited.
insert(CurrentBB).second);
1282 NewBlocks.
reserve(L.getNumBlocks() + ExitBlocks.
size());
1293 VMap[OldBB] = NewBB;
1301 auto It = DominatingSucc.
find(BB);
1302 return It != DominatingSucc.
end() && It->second != UnswitchedSuccBB;
1306 auto *ClonedPH = CloneBlock(LoopPH);
1309 for (
auto *LoopBB : L.blocks())
1310 if (!SkipBlock(LoopBB))
1316 for (
auto *ExitBB : ExitBlocks) {
1317 if (SkipBlock(ExitBB))
1325 auto *MergeBB =
SplitBlock(ExitBB, ExitBB->begin(), &DT, &LI, MSSAU);
1330 MergeBB->takeName(ExitBB);
1331 ExitBB->setName(
Twine(MergeBB->getName()) +
".split");
1334 auto *ClonedExitBB = CloneBlock(ExitBB);
1335 assert(ClonedExitBB->getTerminator()->getNumSuccessors() == 1 &&
1336 "Exit block should have been split to have one successor!");
1337 assert(ClonedExitBB->getTerminator()->getSuccessor(0) == MergeBB &&
1338 "Cloned exit block has the wrong successor!");
1344 std::prev(ClonedExitBB->end())))) {
1352 "Bad instruction in exit block!");
1354 assert(VMap.
lookup(&
I) == &ClonedI &&
"Mismatch in the value map!");
1365 MergePN->insertBefore(InsertPt);
1366 MergePN->setDebugLoc(InsertPt->getDebugLoc());
1367 I.replaceAllUsesWith(MergePN);
1368 MergePN->addIncoming(&
I, ExitBB);
1369 MergePN->addIncoming(&ClonedI, ClonedExitBB);
1378 Module *M = ClonedPH->getParent()->getParent();
1379 for (
auto *ClonedBB : NewBlocks)
1391 for (
auto *LoopBB : L.blocks())
1392 if (SkipBlock(LoopBB))
1395 for (
PHINode &PN : ClonedSuccBB->phis())
1396 PN.removeIncomingValue(LoopBB,
false);
1402 if (SuccBB == UnswitchedSuccBB)
1409 ClonedSuccBB->removePredecessor(ClonedParentBB,
1416 Instruction *ClonedTerminator = ClonedParentBB->getTerminator();
1419 Value *ClonedConditionToErase =
nullptr;
1421 ClonedConditionToErase = BI->getCondition();
1423 ClonedConditionToErase =
SI->getCondition();
1429 if (ClonedConditionToErase)
1436 for (
PHINode &PN : ClonedSuccBB->phis()) {
1440 for (
int i = PN.getNumOperands() - 1; i >= 0; --i) {
1441 if (PN.getIncomingBlock(i) != ClonedParentBB)
1447 PN.removeIncomingValue(i,
false);
1453 for (
auto *ClonedBB : NewBlocks) {
1455 if (SuccSet.
insert(SuccBB).second)
1471 auto AddClonedBlocksToLoop = [&](
Loop &OrigL,
Loop &ClonedL) {
1472 assert(ClonedL.getBlocks().empty() &&
"Must start with an empty loop!");
1474 for (
auto *BB : OrigL.
blocks()) {
1476 ClonedL.addBlockEntry(ClonedBB);
1489 AddClonedBlocksToLoop(OrigRootL, *ClonedRootL);
1501 LoopsToClone.
push_back({ClonedRootL, ChildL});
1503 Loop *ClonedParentL, *L;
1504 std::tie(ClonedParentL, L) = LoopsToClone.
pop_back_val();
1507 AddClonedBlocksToLoop(*L, *ClonedL);
1509 LoopsToClone.
push_back({ClonedL, ChildL});
1510 }
while (!LoopsToClone.
empty());
1531 Loop *ClonedL =
nullptr;
1543 Loop *ParentL =
nullptr;
1547 for (
auto *ExitBB : ExitBlocks)
1550 ExitLoopMap[ClonedExitBB] = ExitL;
1551 ClonedExitsInLoops.
push_back(ClonedExitBB);
1552 if (!ParentL || (ParentL != ExitL && ParentL->
contains(ExitL)))
1557 "The computed parent loop should always contain (or be) the parent of "
1558 "the original loop.");
1565 for (
auto *BB : OrigL.
blocks())
1567 ClonedLoopBlocks.
insert(ClonedBB);
1578 if (Pred == ClonedPH)
1583 assert(ClonedLoopBlocks.
count(Pred) &&
"Found a predecessor of the loop "
1584 "header other than the preheader "
1585 "that is not part of the loop!");
1590 if (BlocksInClonedLoop.
insert(Pred).second && Pred != ClonedHeader)
1597 if (!BlocksInClonedLoop.
empty()) {
1598 BlocksInClonedLoop.
insert(ClonedHeader);
1600 while (!Worklist.
empty()) {
1603 "Didn't put block into the loop set!");
1611 if (ClonedLoopBlocks.
count(Pred) &&
1612 BlocksInClonedLoop.
insert(Pred).second)
1631 for (
auto *BB : OrigL.
blocks()) {
1633 if (!ClonedBB || !BlocksInClonedLoop.
count(ClonedBB))
1645 for (
Loop *PL = ClonedL; PL; PL = PL->getParentLoop())
1646 PL->addBlockEntry(ClonedBB);
1653 for (
Loop *ChildL : OrigL) {
1654 auto *ClonedChildHeader =
1656 if (!ClonedChildHeader || !BlocksInClonedLoop.
count(ClonedChildHeader))
1662 for (
auto *ChildLoopBB : ChildL->blocks())
1665 "Child cloned loop has a header within the cloned outer "
1666 "loop but not all of its blocks!");
1681 if (BlocksInClonedLoop.
empty())
1682 UnloopedBlockSet.
insert(ClonedPH);
1683 for (
auto *ClonedBB : ClonedLoopBlocks)
1684 if (!BlocksInClonedLoop.
count(ClonedBB))
1685 UnloopedBlockSet.
insert(ClonedBB);
1691 auto OrderedClonedExitsInLoops = ClonedExitsInLoops;
1693 return ExitLoopMap.
lookup(
LHS)->getLoopDepth() <
1694 ExitLoopMap.
lookup(
RHS)->getLoopDepth();
1699 while (!UnloopedBlockSet.
empty() && !OrderedClonedExitsInLoops.empty()) {
1700 assert(Worklist.
empty() &&
"Didn't clear worklist!");
1702 BasicBlock *ExitBB = OrderedClonedExitsInLoops.pop_back_val();
1717 if (!UnloopedBlockSet.
erase(PredBB)) {
1719 (BlocksInClonedLoop.
count(PredBB) || ExitLoopMap.
count(PredBB)) &&
1720 "Predecessor not mapped to a loop!");
1727 bool Inserted = ExitLoopMap.
insert({PredBB, ExitL}).second;
1729 assert(Inserted &&
"Should only visit an unlooped block once!");
1734 }
while (!Worklist.
empty());
1744 ArrayRef(ClonedPH), ClonedLoopBlocks, ClonedExitsInLoops))
1746 OuterL->addBasicBlockToLoop(BB, LI);
1749 for (
auto &BBAndL : ExitLoopMap) {
1750 auto *BB = BBAndL.first;
1751 auto *OuterL = BBAndL.second;
1753 "Failed to put all blocks into outer loops!");
1760 for (
Loop *ChildL : OrigL) {
1761 auto *ClonedChildHeader =
1763 if (!ClonedChildHeader || BlocksInClonedLoop.
count(ClonedChildHeader))
1767 for (
auto *ChildLoopBB : ChildL->blocks())
1769 "Cloned a child loop header but not all of that loops blocks!");
1773 *ChildL, ExitLoopMap.
lookup(ClonedChildHeader), VMap, LI));
1779 ArrayRef<std::unique_ptr<ValueToValueMapTy>> VMaps,
1784 for (
const auto &VMap : VMaps)
1788 SuccBB->removePredecessor(ClonedBB);
1801 BB->dropAllReferences();
1804 BB->eraseFromParent();
1821 DeathCandidates.
append(L.blocks().begin(), L.blocks().end());
1822 while (!DeathCandidates.
empty()) {
1826 SuccBB->removePredecessor(BB);
1850 for (
Loop *ChildL : L) {
1851 if (!DeadBlockSet.
count(ChildL->getHeader()))
1856 return DeadBlockSet.count(ChildBB);
1858 "If the child loop header is dead all blocks in the child loop must "
1859 "be dead as well!");
1865 return DeadBlockSet.count(ChildL->getHeader());
1872 for (
auto *BB : DeadBlockSet) {
1874 assert(!DT.
getNode(BB) &&
"Should already have cleared domtree!");
1881 BB->dropAllReferences();
1886 for (
auto *BB : DeadBlockSet)
1905 auto *PH = L.getLoopPreheader();
1906 auto *Header = L.getHeader();
1920 assert(L.contains(Pred) &&
"Found a predecessor of the loop header other "
1921 "than the preheader that is not part of the "
1927 if (LoopBlockSet.
insert(Pred).second && Pred != Header)
1932 if (LoopBlockSet.
empty())
1933 return LoopBlockSet;
1936 while (!Worklist.
empty()) {
1938 assert(LoopBlockSet.
count(BB) &&
"Didn't put block into the loop set!");
1950 assert(L.contains(InnerL) &&
1951 "Should not reach a loop *outside* this loop!");
1954 auto *InnerPH = InnerL->getLoopPreheader();
1955 assert(L.contains(InnerPH) &&
"Cannot contain an inner loop block "
1956 "but not contain the inner loop "
1958 if (!LoopBlockSet.
insert(InnerPH).second)
1968 for (
auto *InnerBB : InnerL->blocks()) {
1969 if (InnerBB == BB) {
1971 "Block should already be in the set!");
1975 LoopBlockSet.
insert(InnerBB);
1987 if (L.contains(Pred) && LoopBlockSet.
insert(Pred).second)
1991 assert(LoopBlockSet.
count(Header) &&
"Cannot fail to add the header!");
1995 return LoopBlockSet;
2016 auto *PH = L.getLoopPreheader();
2020 Loop *ParentL =
nullptr;
2024 for (
auto *ExitBB : ExitBlocks)
2028 if (!ParentL || (ParentL != ExitL && ParentL->
contains(ExitL)))
2040 if (!LoopBlockSet.empty() && L.getParentLoop() != ParentL) {
2043 L.getParentLoop(), ParentL,
2044 [&](
BasicBlock *BB) { return BB == PH || L.contains(BB); });
2047 L.getParentLoop()->removeChildLoop(&L);
2058 if (LoopBlockSet.count(BB))
2060 UnloopedBlocks.
insert(BB);
2063 if (LoopBlockSet.empty())
2064 UnloopedBlocks.
insert(PH);
2074 Loop *PrevExitL = L.getParentLoop();
2076 auto InUnlooped = [&](
BasicBlock *BB) {
return UnloopedBlocks.
count(BB); };
2079 while (!UnloopedBlocks.
empty() && !ExitsInLoops.
empty()) {
2080 assert(Worklist.
empty() &&
"Didn't clear worklist!");
2081 assert(NewExitLoopBlocks.empty() &&
"Didn't clear loop set!");
2086 assert(ExitL.
contains(&L) &&
"Exit loop must contain the inner loop!");
2107 if (!UnloopedBlocks.
erase(PredBB)) {
2108 assert((NewExitLoopBlocks.count(PredBB) ||
2110 "Predecessor not in a nested loop (or already visited)!");
2117 bool Inserted = NewExitLoopBlocks.insert(PredBB).second;
2119 assert(Inserted &&
"Should only visit an unlooped block once!");
2124 }
while (!Worklist.
empty());
2129 for (
auto *BB : NewExitLoopBlocks)
2131 if (BBL == &L || !L.contains(BBL))
2136 NewExitLoopBlocks.clear();
2142 for (
auto *BB : UnloopedBlocks)
2144 if (BBL == &L || !L.contains(BBL))
2150 return !LoopBlockSet.count(SubL->getHeader());
2162 if (
auto *NewParentL = LI.
getLoopFor(HoistedL->getLoopPreheader()))
2163 NewParentL->addChildLoop(HoistedL);
2169 if (L.getBlocks().empty()) {
2170 assert(L.getSubLoops().empty() &&
2171 "Failed to remove all subloops from the original loop!");
2172 if (
Loop *ParentL = L.getParentLoop())
2190template <
typename CallableT>
2202 if (!Callable(
N->getBlock()))
2208 "Cannot visit a node twice when walking a tree!");
2211 }
while (!DomWorklist.
empty());
2215 bool CurrentLoopValid,
bool PartiallyInvariant,
2218 if (!NewLoops.
empty())
2219 U.addSiblingLoops(NewLoops);
2223 if (CurrentLoopValid) {
2224 if (PartiallyInvariant) {
2227 L.addStringLoopAttribute(
"llvm.loop.unswitch.partial.disable",
2228 {
"llvm.loop.unswitch.partial"});
2229 }
else if (InjectedCondition) {
2231 L.addStringLoopAttribute(
"llvm.loop.unswitch.injection.disable",
2232 {
"llvm.loop.unswitch.injection"});
2234 U.revisitCurrentLoop();
2236 U.markLoopAsDeleted(L, LoopName);
2243 LPMUpdater &LoopUpdater,
bool InsertFreeze,
bool InjectedCondition) {
2250 std::string LoopName(L.getName());
2255 assert((
SI || BI) &&
"Can only unswitch switches and conditional branch!");
2259 !PartiallyInvariant);
2262 "Cannot have other invariants with full unswitching!");
2265 "Partial unswitching requires an instruction as the condition!");
2278 if (!FullUnswitch) {
2282 PartiallyInvariant) &&
2283 "Only `or`, `and`, an `select`, partially invariant instructions "
2284 "can combine invariants being unswitched.");
2300 for (
auto Case :
SI->cases())
2301 if (Case.getCaseSuccessor() != RetainedSuccBB)
2302 UnswitchedSuccBBs.
insert(Case.getCaseSuccessor());
2304 assert(!UnswitchedSuccBBs.
count(RetainedSuccBB) &&
2305 "Should not unswitch the same successor we are retaining!");
2314 Loop *ParentL = L.getParentLoop();
2323 Loop *OuterExitL = &L;
2325 L.getUniqueExitBlocks(ExitBlocks);
2326 for (
auto *ExitBB : ExitBlocks) {
2330 if (!NewOuterExitL) {
2332 OuterExitL =
nullptr;
2335 if (NewOuterExitL != OuterExitL && NewOuterExitL->
contains(OuterExitL))
2336 OuterExitL = NewOuterExitL;
2358 if (SuccBB->getUniquePredecessor() ||
2360 return PredBB == ParentBB || DT.
dominates(SuccBB, PredBB);
2363 DominatingSucc[BB] = SuccBB;
2382 for (
auto *SuccBB : UnswitchedSuccBBs) {
2385 L, LoopPH, SplitBB, ExitBlocks, ParentBB, SuccBB, RetainedSuccBB,
2386 DominatingSucc, *VMaps.
back(), DTUpdates, AC, DT, LI, MSSAU, SE);
2391 if (TI.
getMetadata(LLVMContext::MD_make_implicit)) {
2395 TI.
setMetadata(LLVMContext::MD_make_implicit,
nullptr);
2402 TI.
setMetadata(LLVMContext::MD_make_implicit,
nullptr);
2413 NewTI->
insertInto(ParentBB, ParentBB->end());
2436 assert(
SI &&
"Must either be a branch or switch!");
2439 assert(
SI->getDefaultDest() == RetainedSuccBB &&
2440 "Not retaining default successor!");
2441 SI->setDefaultDest(LoopPH);
2442 for (
const auto &Case :
SI->cases())
2443 if (Case.getCaseSuccessor() == RetainedSuccBB)
2444 Case.setSuccessor(LoopPH);
2446 Case.setSuccessor(ClonedPHs.
find(Case.getCaseSuccessor())->second);
2450 SI->getCondition()->getName() +
".fr",
2451 SI->getIterator()));
2472 for (
auto &VMap : VMaps)
2488 "Only one possible unswitched block for a branch!");
2502 "Not retaining default successor!");
2503 for (
const auto &Case : NewSI->
cases())
2504 Case.getCaseSuccessor()->removePredecessor(
2523 assert(BI &&
"Only branches have partial unswitching.");
2525 "Only one possible unswitched block for a branch!");
2529 if (PartiallyInvariant)
2531 *SplitBB, Invariants,
Direction, *ClonedPH, *LoopPH, L, MSSAU, *BI);
2534 *SplitBB, Invariants,
Direction, *ClonedPH, *LoopPH,
2544 for (
auto &VMap : VMaps)
2564 for (std::unique_ptr<ValueToValueMapTy> &VMap : VMaps)
2582#ifdef EXPENSIVE_CHECKS
2588 assert(DT.
verify(DominatorTree::VerificationLevel::Fast));
2591 if (BI && !PartiallyInvariant) {
2597 "Only one possible unswitched block for a branch!");
2609 bool ReplaceUnswitched =
2610 FullUnswitch || (Invariants.
size() == 1) || PartiallyInvariant;
2618 for (
Value *Invariant : Invariants) {
2620 "Should not be replacing constant values!");
2630 U.set(ContinueReplacement);
2631 else if (ReplaceUnswitched &&
2633 U.set(UnswitchedReplacement);
2650 auto UpdateLoop = [&](
Loop &UpdateL) {
2652 UpdateL.verifyLoop();
2653 for (
Loop *ChildL : UpdateL) {
2654 ChildL->verifyLoop();
2655 assert(ChildL->isRecursivelyLCSSAForm(DT, LI) &&
2656 "Perturbed a child loop's LCSSA form!");
2676 for (
Loop *UpdatedL :
2678 UpdateLoop(*UpdatedL);
2679 if (UpdatedL->isOutermost())
2680 OuterExitL =
nullptr;
2684 if (L.isOutermost())
2685 OuterExitL =
nullptr;
2690 if (OuterExitL != &L)
2691 for (
Loop *OuterL = ParentL; OuterL != OuterExitL;
2693 UpdateLoop(*OuterL);
2695#ifdef EXPENSIVE_CHECKS
2706 if (UpdatedL->getParentLoop() == ParentL)
2708 postUnswitch(L, LoopUpdater, LoopName, IsStillLoop, PartiallyInvariant,
2709 InjectedCondition, SibLoops);
2732 auto BBCostIt = BBCostMap.
find(
N.getBlock());
2733 if (BBCostIt == BBCostMap.
end())
2737 auto DTCostIt = DTCostMap.
find(&
N);
2738 if (DTCostIt != DTCostMap.
end())
2739 return DTCostIt->second;
2744 N.begin(),
N.end(), BBCostIt->second,
2746 return Sum + computeDomSubtreeCost(*ChildN, BBCostMap, DTCostMap);
2748 bool Inserted = DTCostMap.
insert({&
N, Cost}).second;
2750 assert(Inserted &&
"Should not insert a node while visiting children!");
2785 SI->getMetadata(LLVMContext::MD_prof), &DTU, &LI);
2787 BasicBlock *ThenBB = CondBr->getSuccessor(0),
2788 *TailBB = CondBr->getSuccessor(1);
2794 Phi->addIncoming(
SI->getTrueValue(), ThenBB);
2795 Phi->addIncoming(
SI->getFalseValue(), HeadBB);
2796 Phi->setDebugLoc(
SI->getDebugLoc());
2797 SI->replaceAllUsesWith(Phi);
2798 SI->eraseFromParent();
2852 GuardedBlock->
setName(
"guarded");
2903 return L.contains(SuccBB);
2905 NumCostMultiplierSkipped++;
2916 auto *ParentL = L.getParentLoop();
2917 int ParentLoopSizeMultiplier = 1;
2919 ParentLoopSizeMultiplier =
2927 int UnswitchedClones = 0;
2928 for (
const auto &Candidate : UnswitchCandidates) {
2931 bool SkipExitingSuccessors = DT.
dominates(CondBlock, Latch);
2937 if (!SkipExitingSuccessors)
2941 int NonExitingSuccessors =
2943 [SkipExitingSuccessors, &L](
const BasicBlock *SuccBB) {
2944 return !SkipExitingSuccessors || L.contains(SuccBB);
2946 UnswitchedClones +=
Log2_32(NonExitingSuccessors);
2954 unsigned ClonesPower =
2958 int SiblingsMultiplier =
2959 std::max((ParentL ? SiblingsCount
2970 CostMultiplier = std::min(SiblingsMultiplier * (1 << ClonesPower),
2974 <<
" (siblings " << SiblingsMultiplier <<
" * parent size "
2975 << ParentLoopSizeMultiplier <<
" * clones "
2976 << (1 << ClonesPower) <<
")"
2977 <<
" for unswitch candidate: " << TI <<
"\n");
2978 return CostMultiplier;
2986 assert(UnswitchCandidates.
empty() &&
"Should be!");
2992 if (L.isLoopInvariant(
Cond)) {
3000 if (!Invariants.
empty())
3001 UnswitchCandidates.
push_back({
I, std::move(Invariants)});
3006 bool CollectGuards =
false;
3009 L.getHeader()->getParent()->getParent(), Intrinsic::experimental_guard);
3010 if (GuardDecl && !GuardDecl->use_empty())
3011 CollectGuards =
true;
3014 for (
auto *BB : L.blocks()) {
3018 for (
auto &
I : *BB) {
3020 auto *
Cond =
SI->getCondition();
3022 if (
Cond->getType()->isIntegerTy(1) && !
SI->getType()->isIntegerTy(1))
3023 AddUnswitchCandidatesForInst(
SI,
Cond);
3024 }
else if (CollectGuards &&
isGuard(&
I)) {
3037 L.isLoopInvariant(
SI->getCondition()) && !BB->getUniqueSuccessor())
3043 if (!BI || BI->getSuccessor(0) == BI->getSuccessor(1))
3046 AddUnswitchCandidatesForInst(BI, BI->getCondition());
3050 !
any_of(UnswitchCandidates, [&L](
auto &TerminatorAndInvariants) {
3051 return TerminatorAndInvariants.TI == L.getHeader()->getTerminator();
3056 dbgs() <<
"simple-loop-unswitch: Found partially invariant condition "
3057 << *Info->InstToDuplicate[0] <<
"\n");
3058 PartialIVInfo = *Info;
3059 PartialIVCondBranch = L.getHeader()->getTerminator();
3063 {L.getHeader()->getTerminator(), std::move(ValsToDuplicate)});
3066 return !UnswitchCandidates.
empty();
3081 if (!L.contains(IfTrue)) {
3087 if (L.isLoopInvariant(
LHS)) {
3095 RHS = ConstantInt::get(
3107 if (L.isLoopInvariant(
LHS) || !L.isLoopInvariant(
RHS))
3113 if (!L.contains(IfTrue) || L.contains(IfFalse))
3117 if (L.getHeader() == IfTrue)
3134 assert(Weights.
size() == 2 &&
"Unexpected profile data!");
3136 auto Num = Weights[Idx];
3137 auto Denom = Weights[0] + Weights[1];
3139 if (Denom == 0 || Num > Denom)
3142 if (LikelyTaken > ActualTaken)
3165static NonTrivialUnswitchCandidate
3169 assert(Candidate.hasPendingInjection() &&
"Nothing to inject!");
3170 BasicBlock *Preheader = L.getLoopPreheader();
3171 assert(Preheader &&
"Loop is not in simplified form?");
3173 "Unswitching branch of inner loop!");
3175 auto Pred = Candidate.PendingInjection->Pred;
3176 auto *
LHS = Candidate.PendingInjection->LHS;
3177 auto *
RHS = Candidate.PendingInjection->RHS;
3178 auto *InLoopSucc = Candidate.PendingInjection->InLoopSucc;
3181 auto *OutOfLoopSucc = InLoopSucc == TI->getSuccessor(0) ? TI->getSuccessor(1)
3182 : TI->getSuccessor(0);
3184 assert(L.contains(InLoopSucc) &&
"Not supported yet!");
3185 assert(!L.contains(OutOfLoopSucc) &&
"Not supported yet!");
3186 auto &Ctx = BB->getContext();
3190 if (
LHS->getType() !=
RHS->getType()) {
3191 if (
LHS->getType()->getIntegerBitWidth() <
3192 RHS->getType()->getIntegerBitWidth())
3193 LHS = Builder.CreateZExt(
LHS,
RHS->getType(),
LHS->getName() +
".wide");
3195 RHS = Builder.CreateZExt(
RHS,
LHS->getType(),
RHS->getName() +
".wide");
3199 auto *InjectedCond =
3204 BB->getParent(), InLoopSucc);
3205 Builder.SetInsertPoint(TI);
3207 Builder.CreateCondBr(InjectedCond, InLoopSucc, CheckBlock);
3211 Builder.SetInsertPoint(CheckBlock);
3212 Builder.CreateCondBr(
3213 TI->getCondition(), TI->getSuccessor(0), TI->getSuccessor(1),
3216 TI->eraseFromParent();
3219 for (
auto &
I : *InLoopSucc) {
3223 auto *Inc = PN->getIncomingValueForBlock(BB);
3224 PN->addIncoming(Inc, CheckBlock);
3226 OutOfLoopSucc->replacePhiUsesWith(BB, CheckBlock);
3238 L.addBasicBlockToLoop(CheckBlock, LI);
3250 LLVM_DEBUG(
dbgs() <<
"Injected a new loop-invariant branch " << *InvariantBr
3251 <<
" and considering it for unswitching.");
3252 ++NumInvariantConditionsInjected;
3253 return NonTrivialUnswitchCandidate(InvariantBr, { InjectedCond },
3275 if (Compares.
size() < 2)
3283 InjectedInvariant ToInject(NonStrictPred,
LHS,
RHS, InLoopSucc);
3284 NonTrivialUnswitchCandidate Candidate(Prev->Term, { LHS, RHS },
3285 std::nullopt, std::move(ToInject));
3286 UnswitchCandidates.
push_back(std::move(Candidate));
3316 auto *Latch = L.getLoopLatch();
3320 assert(L.getLoopPreheader() &&
"Must have a preheader!");
3325 for (
auto *DTN = DT.
getNode(Latch); L.contains(DTN->getBlock());
3326 DTN = DTN->getIDom()) {
3329 BasicBlock *IfTrue =
nullptr, *IfFalse =
nullptr;
3330 auto *BB = DTN->getBlock();
3334 auto *Term = BB->getTerminator();
3338 if (!
LHS->getType()->isIntegerTy())
3350 LHS = Zext->getOperand(0);
3351 CandidatesULT[
LHS].push_back(
Desc);
3355 for (
auto &It : CandidatesULT)
3362 if (!L.isSafeToClone())
3364 for (
auto *BB : L.blocks())
3365 for (
auto &
I : *BB) {
3366 if (
I.getType()->isTokenTy() &&
I.isUsedOutsideOfBlock(BB))
3369 assert(!CB->cannotDuplicate() &&
"Checked by L.isSafeToClone().");
3370 if (CB->isConvergent())
3387 L.getUniqueExitBlocks(ExitBlocks);
3392 for (
auto *ExitBB : ExitBlocks) {
3393 auto It = ExitBB->getFirstNonPHIIt();
3395 LLVM_DEBUG(
dbgs() <<
"Cannot unswitch because of cleanuppad/catchswitch "
3423 L.getHeader()->getParent()->hasMinSize()
3427 for (
auto *BB : L.blocks()) {
3429 for (
auto &
I : *BB) {
3434 assert(Cost >= 0 &&
"Must not have negative costs!");
3436 assert(LoopCost >= 0 &&
"Must not have negative loop costs!");
3437 BBCostMap[BB] = Cost;
3470 if (!Visited.
insert(SuccBB).second)
3478 if (!FullUnswitch) {
3482 if (SuccBB == BI.getSuccessor(1))
3485 if (SuccBB == BI.getSuccessor(0))
3488 SuccBB == BI.getSuccessor(0)) ||
3490 SuccBB == BI.getSuccessor(1)))
3498 if (SuccBB->getUniquePredecessor() ||
3500 return PredBB == &BB || DT.
dominates(SuccBB, PredBB);
3503 assert(Cost <= LoopCost &&
3504 "Non-duplicated cost should never exceed total loop cost!");
3513 int SuccessorsCount =
isGuard(&TI) ? 2 : Visited.
size();
3514 assert(SuccessorsCount > 1 &&
3515 "Cannot unswitch a condition without multiple distinct successors!");
3516 return (LoopCost - Cost) * (SuccessorsCount - 1);
3519 std::optional<NonTrivialUnswitchCandidate> Best;
3520 for (
auto &Candidate : UnswitchCandidates) {
3525 !BI || Candidate.hasPendingInjection() ||
3526 (Invariants.
size() == 1 &&
3528 InstructionCost CandidateCost = ComputeUnswitchedCost(TI, FullUnswitch);
3532 int CostMultiplier =
3536 "cost multiplier needs to be in the range of 1..UnswitchThreshold");
3537 CandidateCost *= CostMultiplier;
3539 <<
" (multiplier: " << CostMultiplier <<
")"
3540 <<
" for unswitch candidate: " << TI <<
"\n");
3543 <<
" for unswitch candidate: " << TI <<
"\n");
3546 if (!Best || CandidateCost < Best->Cost) {
3548 Best->Cost = CandidateCost;
3551 assert(Best &&
"Must be!");
3578 Cond, &AC, L.getLoopPreheader()->getTerminator(), &DT);
3592 PartialIVCondBranch, L, LI,
AA, MSSAU);
3595 PartialIVCondBranch, L, DT, LI,
AA,
3598 if (UnswitchCandidates.
empty())
3602 dbgs() <<
"Considering " << UnswitchCandidates.
size()
3603 <<
" non-trivial loop invariant conditions for unswitching.\n");
3606 UnswitchCandidates, L, DT, LI, AC,
TTI, PartialIVInfo);
3608 assert(Best.TI &&
"Failed to find loop unswitch candidate");
3609 assert(Best.Cost &&
"Failed to compute cost");
3612 LLVM_DEBUG(
dbgs() <<
"Cannot unswitch, lowest cost found: " << *Best.Cost
3617 bool InjectedCondition =
false;
3618 if (Best.hasPendingInjection()) {
3620 InjectedCondition =
true;
3622 assert(!Best.hasPendingInjection() &&
3623 "All injections should have been done by now!");
3625 if (Best.TI != PartialIVCondBranch)
3635 SI->getCondition(), &AC, L.getLoopPreheader()->getTerminator(), &DT);
3645 LLVM_DEBUG(
dbgs() <<
" Unswitching non-trivial (cost = " << Best.Cost
3646 <<
") terminator: " << *Best.TI <<
"\n");
3648 LI, AC, SE, MSSAU, LoopUpdater, InsertFreeze,
3679 assert(L.isRecursivelyLCSSAForm(DT, LI) &&
3680 "Loops must be in LCSSA form before unswitching.");
3683 if (!L.isLoopSimplifyForm())
3696 const Function *
F = L.getHeader()->getParent();
3709 bool ContinueWithNonTrivial =
3711 if (!ContinueWithNonTrivial)
3715 if (
F->hasOptSize())
3740 Function &
F = *L.getHeader()->getParent();
3742 LLVM_DEBUG(
dbgs() <<
"Unswitching loop in " <<
F.getName() <<
": " << L
3745 std::optional<MemorySSAUpdater> MSSAU;
3752 &AR.
SE, MSSAU ? &*MSSAU :
nullptr, U))
3758#ifdef EXPENSIVE_CHECKS
3773 OS, MapClassName2PassName);
3776 OS << (NonTrivial ?
"" :
"no-") <<
"nontrivial;";
3777 OS << (Trivial ?
"" :
"no-") <<
"trivial";
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
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 the DenseMap class.
This file defines a set of templates that efficiently compute a dominator tree over a generic graph.
static Value * getCondition(Instruction *I)
Module.h This file contains the declarations for the Module class.
This defines the Use class.
This file defines an InstructionCost class that is used when calculating the cost of an instruction,...
This header provides classes for managing per-loop analyses.
Loop::LoopBounds::Direction Direction
This header provides classes for managing a pipeline of passes over loops in LLVM IR.
This file exposes an interface to building/using memory SSA to walk memory instructions using a use/d...
Contains a collection of routines for determining if a given instruction is guaranteed to execute if ...
uint64_t IntrinsicInst * II
This file contains the declarations for profiling metadata utility functions.
const SmallVectorImpl< MachineOperand > & Cond
Provides some synthesis utilities to produce sequences of values.
This file implements a set that has insertion order iteration characteristics.
static void rewritePHINodesForUnswitchedExitBlock(BasicBlock &UnswitchedBB, BasicBlock &OldExitingBB, BasicBlock &OldPH)
Rewrite the PHI nodes in an unswitched loop exit basic block.
static bool unswitchAllTrivialConditions(Loop &L, DominatorTree &DT, LoopInfo &LI, ScalarEvolution *SE, MemorySSAUpdater *MSSAU)
This routine scans the loop to find a branch or switch which occurs before any side effects occur.
static SmallPtrSet< const BasicBlock *, 16 > recomputeLoopBlockSet(Loop &L, LoopInfo &LI)
Recompute the set of blocks in a loop after unswitching.
static int CalculateUnswitchCostMultiplier(const Instruction &TI, const Loop &L, const LoopInfo &LI, const DominatorTree &DT, ArrayRef< NonTrivialUnswitchCandidate > UnswitchCandidates)
Cost multiplier is a way to limit potentially exponential behavior of loop-unswitch.
static TinyPtrVector< Value * > collectHomogenousInstGraphLoopInvariants(const Loop &L, Instruction &Root, const LoopInfo &LI)
Collect all of the loop invariant input values transitively used by the homogeneous instruction graph...
static void deleteDeadClonedBlocks(Loop &L, ArrayRef< BasicBlock * > ExitBlocks, ArrayRef< std::unique_ptr< ValueToValueMapTy > > VMaps, DominatorTree &DT, MemorySSAUpdater *MSSAU)
void visitDomSubTree(DominatorTree &DT, BasicBlock *BB, CallableT Callable)
Helper to visit a dominator subtree, invoking a callable on each node.
static bool isSafeForNoNTrivialUnswitching(Loop &L, LoopInfo &LI)
void postUnswitch(Loop &L, LPMUpdater &U, StringRef LoopName, bool CurrentLoopValid, bool PartiallyInvariant, bool InjectedCondition, ArrayRef< Loop * > NewLoops)
static bool shouldTryInjectInvariantCondition(const ICmpInst::Predicate Pred, const Value *LHS, const Value *RHS, const BasicBlock *IfTrue, const BasicBlock *IfFalse, const Loop &L)
Returns true, if predicate described by ( Pred, LHS, RHS ) succeeding into blocks ( IfTrue,...
static NonTrivialUnswitchCandidate findBestNonTrivialUnswitchCandidate(ArrayRef< NonTrivialUnswitchCandidate > UnswitchCandidates, const Loop &L, const DominatorTree &DT, const LoopInfo &LI, AssumptionCache &AC, const TargetTransformInfo &TTI, const IVConditionInfo &PartialIVInfo)
static void buildPartialInvariantUnswitchConditionalBranch(BasicBlock &BB, ArrayRef< Value * > ToDuplicate, bool Direction, BasicBlock &UnswitchedSucc, BasicBlock &NormalSucc, Loop &L, MemorySSAUpdater *MSSAU, const CondBrInst &OriginalBranch)
Copy a set of loop invariant values, and conditionally branch on them.
static Value * skipTrivialSelect(Value *Cond)
static Loop * getTopMostExitingLoop(const BasicBlock *ExitBB, const LoopInfo &LI)
static bool collectUnswitchCandidatesWithInjections(SmallVectorImpl< NonTrivialUnswitchCandidate > &UnswitchCandidates, IVConditionInfo &PartialIVInfo, Instruction *&PartialIVCondBranch, Loop &L, const DominatorTree &DT, const LoopInfo &LI, AAResults &AA, const MemorySSAUpdater *MSSAU)
Collect unswitch candidates by invariant conditions that are not immediately present in the loop.
static void replaceLoopInvariantUses(const Loop &L, Value *Invariant, Constant &Replacement)
static CondBrInst * turnGuardIntoBranch(IntrinsicInst *GI, Loop &L, DominatorTree &DT, LoopInfo &LI, MemorySSAUpdater *MSSAU)
Turns a llvm.experimental.guard intrinsic into implicit control flow branch, making the following rep...
static bool collectUnswitchCandidates(SmallVectorImpl< NonTrivialUnswitchCandidate > &UnswitchCandidates, IVConditionInfo &PartialIVInfo, Instruction *&PartialIVCondBranch, const Loop &L, const LoopInfo &LI, AAResults &AA, const MemorySSAUpdater *MSSAU)
static InstructionCost computeDomSubtreeCost(DomTreeNode &N, const SmallDenseMap< BasicBlock *, InstructionCost, 4 > &BBCostMap, SmallDenseMap< DomTreeNode *, InstructionCost, 4 > &DTCostMap)
Recursively compute the cost of a dominator subtree based on the per-block cost map provided.
static bool shouldInsertFreeze(Loop &L, Instruction &TI, DominatorTree &DT, AssumptionCache &AC)
bool shouldTryInjectBasingOnMetadata(const CondBrInst *BI, const BasicBlock *TakenSucc)
Returns true, if metadata on BI allows us to optimize branching into TakenSucc via injection of invar...
static void canonicalizeForInvariantConditionInjection(CmpPredicate &Pred, Value *&LHS, Value *&RHS, BasicBlock *&IfTrue, BasicBlock *&IfFalse, const Loop &L)
Tries to canonicalize condition described by:
static bool areLoopExitPHIsLoopInvariant(const Loop &L, const BasicBlock &ExitingBB, const BasicBlock &ExitBB)
Check that all the LCSSA PHI nodes in the loop exit block have trivial incoming values along this edg...
static void rewritePHINodesForExitAndUnswitchedBlocks(BasicBlock &ExitBB, BasicBlock &UnswitchedBB, BasicBlock &OldExitingBB, BasicBlock &OldPH, bool FullUnswitch)
Rewrite the PHI nodes in the loop exit basic block and the split off unswitched block.
static bool insertCandidatesWithPendingInjections(SmallVectorImpl< NonTrivialUnswitchCandidate > &UnswitchCandidates, Loop &L, ICmpInst::Predicate Pred, ArrayRef< CompareDesc > Compares, const DominatorTree &DT)
Given chain of loop branch conditions looking like: br (Variant < Invariant1) br (Variant < Invariant...
static NonTrivialUnswitchCandidate injectPendingInvariantConditions(NonTrivialUnswitchCandidate Candidate, Loop &L, DominatorTree &DT, LoopInfo &LI, AssumptionCache &AC, MemorySSAUpdater *MSSAU)
Materialize pending invariant condition of the given candidate into IR.
static bool unswitchTrivialSwitch(Loop &L, SwitchInst &SI, DominatorTree &DT, LoopInfo &LI, ScalarEvolution *SE, MemorySSAUpdater *MSSAU)
Unswitch a trivial switch if the condition is loop invariant.
static void unswitchNontrivialInvariants(Loop &L, Instruction &TI, ArrayRef< Value * > Invariants, IVConditionInfo &PartialIVInfo, DominatorTree &DT, LoopInfo &LI, AssumptionCache &AC, ScalarEvolution *SE, MemorySSAUpdater *MSSAU, LPMUpdater &LoopUpdater, bool InsertFreeze, bool InjectedCondition)
static bool rebuildLoopAfterUnswitch(Loop &L, ArrayRef< BasicBlock * > ExitBlocks, LoopInfo &LI, SmallVectorImpl< Loop * > &HoistedLoops, ScalarEvolution *SE)
Rebuild a loop after unswitching removes some subset of blocks and edges.
static CondBrInst * turnSelectIntoBranch(SelectInst *SI, DominatorTree &DT, LoopInfo &LI, MemorySSAUpdater *MSSAU, AssumptionCache *AC)
Turns a select instruction into implicit control flow branch, making the following replacement:
static bool unswitchBestCondition(Loop &L, DominatorTree &DT, LoopInfo &LI, AssumptionCache &AC, AAResults &AA, TargetTransformInfo &TTI, ScalarEvolution *SE, MemorySSAUpdater *MSSAU, LPMUpdater &LoopUpdater)
static bool unswitchLoop(Loop &L, DominatorTree &DT, LoopInfo &LI, AssumptionCache &AC, AAResults &AA, TargetTransformInfo &TTI, bool Trivial, bool NonTrivial, ScalarEvolution *SE, MemorySSAUpdater *MSSAU, LPMUpdater &LoopUpdater)
Unswitch control flow predicated on loop invariant conditions.
static bool unswitchTrivialBranch(Loop &L, CondBrInst &BI, DominatorTree &DT, LoopInfo &LI, ScalarEvolution *SE, MemorySSAUpdater *MSSAU)
Unswitch a trivial branch if the condition is loop invariant.
static BasicBlock * buildClonedLoopBlocks(Loop &L, BasicBlock *LoopPH, BasicBlock *SplitBB, ArrayRef< BasicBlock * > ExitBlocks, BasicBlock *ParentBB, BasicBlock *UnswitchedSuccBB, BasicBlock *ContinueSuccBB, const SmallDenseMap< BasicBlock *, BasicBlock *, 16 > &DominatingSucc, ValueToValueMapTy &VMap, SmallVectorImpl< DominatorTree::UpdateType > &DTUpdates, AssumptionCache &AC, DominatorTree &DT, LoopInfo &LI, MemorySSAUpdater *MSSAU, ScalarEvolution *SE)
Build the cloned blocks for an unswitched copy of the given loop.
static void deleteDeadBlocksFromLoop(Loop &L, SmallVectorImpl< BasicBlock * > &ExitBlocks, DominatorTree &DT, LoopInfo &LI, MemorySSAUpdater *MSSAU, ScalarEvolution *SE, LPMUpdater &LoopUpdater)
static void buildPartialUnswitchConditionalBranch(BasicBlock &BB, ArrayRef< Value * > Invariants, bool Direction, BasicBlock &UnswitchedSucc, BasicBlock &NormalSucc, bool InsertFreeze, const Instruction *I, AssumptionCache *AC, const DominatorTree &DT, const CondBrInst &ComputeProfFrom)
Copy a set of loop invariant values Invariants and insert them at the end of BB and conditionally bra...
static Loop * cloneLoopNest(Loop &OrigRootL, Loop *RootParentL, const ValueToValueMapTy &VMap, LoopInfo &LI)
Recursively clone the specified loop and all of its children.
static void hoistLoopToNewParent(Loop &L, BasicBlock &Preheader, DominatorTree &DT, LoopInfo &LI, MemorySSAUpdater *MSSAU, ScalarEvolution *SE)
Hoist the current loop up to the innermost loop containing a remaining exit.
static void buildClonedLoops(Loop &OrigL, ArrayRef< BasicBlock * > ExitBlocks, const ValueToValueMapTy &VMap, LoopInfo &LI, SmallVectorImpl< Loop * > &NonChildClonedLoops)
Build the cloned loops of an original loop from unswitching.
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)
static APInt getSignedMinValue(unsigned numBits)
Gets minimum signed value of APInt for a specific bit width.
Represent a constant reference to an array (0 or more elements consecutively in memory),...
size_t size() const
Get the array size.
bool empty() const
Check if the array is empty.
A cache of @llvm.assume calls within a function.
LLVM_ABI void registerAssumption(AssumeInst *CI)
Add an @llvm.assume intrinsic to this function's cache.
LLVM Basic Block Representation.
iterator begin()
Instruction iterator methods.
iterator_range< const_phi_iterator > phis() const
Returns a range that iterates over the phis in the basic block.
static BasicBlock * Create(LLVMContext &Context, const Twine &Name="", Function *Parent=nullptr, BasicBlock *InsertBefore=nullptr)
Creates a new BasicBlock.
const Instruction * getTerminatorOrNull() const LLVM_READONLY
Returns the terminator instruction if the block is well formed or null if the block is not well forme...
LLVM_ABI SymbolTableList< BasicBlock >::iterator eraseFromParent()
Unlink 'this' from the containing function and delete it.
InstListType::iterator iterator
Instruction iterators...
void moveBefore(BasicBlock *MovePos)
Unlink this basic block from its current function and insert it into the function that MovePos lives ...
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction; assumes that the block is well-formed.
LLVM_ABI void removePredecessor(BasicBlock *Pred, bool KeepOneInputPHIs=false)
Update PHI nodes in this BasicBlock before removal of predecessor Pred.
Value * getArgOperand(unsigned i) const
void setArgOperand(unsigned i, Value *v)
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
@ ICMP_ULT
unsigned less than
@ ICMP_SGE
signed greater or equal
Predicate getSwappedPredicate() const
For example, EQ->EQ, SLE->SGE, ULT->UGT, OEQ->OEQ, ULE->UGE, OLT->OGT, etc.
static LLVM_ABI CmpInst * Create(OtherOps Op, Predicate Pred, Value *S1, Value *S2, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Construct a compare instruction, given the opcode, the predicate and the two operands.
Predicate getNonStrictPredicate() const
For example, SGT -> SGE, SLT -> SLE, ULT -> ULE, UGT -> UGE.
static LLVM_ABI bool isStrictPredicate(Predicate predicate)
This is a static version that you can use without an instruction available.
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...
Conditional Branch instruction.
LLVM_ABI void swapSuccessors()
Swap the successors of this branch instruction.
void setSuccessor(unsigned idx, BasicBlock *NewSucc)
void setCondition(Value *V)
Value * getCondition() const
BasicBlock * getSuccessor(unsigned i) const
This is the shared class of boolean and integer constants.
static LLVM_ABI ConstantInt * getTrue(LLVMContext &Context)
static LLVM_ABI ConstantInt * getFalse(LLVMContext &Context)
This is an important base class in LLVM.
LLVM_ABI bool isOneValue() const
Returns true if the value is one.
static DebugLoc getCompilerGenerated()
static DebugLoc getDropped()
ValueT lookup(const_arg_type_t< KeyT > Val) const
Return the entry for the specified key, or a default constructed value if no such entry exists.
iterator find(const_arg_type_t< KeyT > Val)
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)
bool verify(VerificationLevel VL=VerificationLevel::Full) const
verify - checks if the tree is correct.
void applyUpdates(ArrayRef< UpdateType > Updates)
Inform the dominator tree about a sequence of CFG edge insertions and deletions and perform a batch u...
void insertEdge(NodeT *From, NodeT *To)
Inform the dominator tree about a CFG edge insertion and update the tree.
static constexpr UpdateKind Delete
static constexpr UpdateKind Insert
void deleteEdge(NodeT *From, NodeT *To)
Inform the dominator tree about a CFG edge deletion and update the tree.
DomTreeNodeBase< NodeT > * getNode(const NodeT *BB) const
getNode - return the (Post)DominatorTree node for the specified basic block.
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
LLVM_ABI bool isReachableFromEntry(const Use &U) const
Provide an overload for a Use.
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 class represents a freeze function that returns random concrete value if an operand is either a ...
This implementation of LoopSafetyInfo use ImplicitControlFlowTracking to give precise answers on "may...
bool isGuaranteedToExecute(const Instruction &Inst, const DominatorTree *DT, const Loop *CurLoop) const override
Returns true if the instruction in a loop is guaranteed to execute at least once (under the assumptio...
void computeLoopSafetyInfo(const Loop *CurLoop) override
Computes safety information for a loop checks loop body & header for the possibility of may throw exc...
bool isRelational() const
Return true if the predicate is relational (not EQ or NE).
CondBrInst * CreateCondBr(Value *Cond, BasicBlock *True, BasicBlock *False, MDNode *BranchWeights=nullptr, MDNode *Unpredictable=nullptr)
Create a conditional 'br Cond, TrueDest, FalseDest' instruction.
Value * CreateFreeze(Value *V, const Twine &Name="")
void SetCurrentDebugLocation(const DebugLoc &L)
Set location information used by debugging information.
Value * CreateAnd(Value *LHS, Value *RHS, const Twine &Name="")
Value * CreateOr(Value *LHS, Value *RHS, const Twine &Name="", bool IsDisjoint=false)
This provides a uniform API for creating instructions and inserting them into a basic block: either a...
LLVM_ABI Instruction * clone() const
Create a copy of 'this' instruction that is identical in all ways except the following:
LLVM_ABI void dropLocation()
Drop the instruction's debug location.
const DebugLoc & getDebugLoc() const
Return the debug location for this node as a DebugLoc.
LLVM_ABI void moveBefore(InstListType::iterator InsertPos)
Unlink this instruction from its current basic block and insert it into the basic block that MovePos ...
LLVM_ABI InstListType::iterator eraseFromParent()
This method unlinks 'this' from the containing basic block and deletes it.
MDNode * getMetadata(unsigned KindID) const
Get the metadata of given kind attached to this Instruction.
bool isTerminator() const
LLVM_ABI void setMetadata(unsigned KindID, MDNode *Node)
Set the metadata of the specified kind to the specified node.
void setDebugLoc(DebugLoc Loc)
Set the debug location information for this instruction.
LLVM_ABI InstListType::iterator insertInto(BasicBlock *ParentBB, InstListType::iterator It)
Inserts an unlinked instruction into ParentBB at position It and returns the iterator of the inserted...
A wrapper class for inspecting calls to intrinsic functions.
This class provides an interface for updating the loop pass manager based on mutations to the loop ne...
void markLoopAsDeleted(Loop &L, llvm::StringRef Name)
Loop passes should use this method to indicate they have deleted a loop from the nest.
bool contains(const LoopT *L) const
Return true if the specified loop is contained within this loop.
void reserveBlocks(unsigned Size)
interface to do reserve() for Blocks
bool isInnermost() const
Return true if the loop does not contain any (natural) loops.
unsigned getNumBlocks() const
Get the number of blocks in this loop in constant time.
BlockT * getHeader() const
void addBasicBlockToLoop(BlockT *NewBB, LoopInfoBase< BlockT, LoopT > &LI)
This method is used by other analyses to update loop information.
iterator_range< block_iterator > blocks() const
void addChildLoop(LoopT *NewChild)
Add the specified loop to be a child of this loop.
BlockT * getLoopPreheader() const
If there is a preheader for this loop, return it.
LoopT * getParentLoop() const
Return the parent loop if it exists or nullptr for top level loops.
bool isLoopExiting(const BlockT *BB) const
True if terminator in the block can branch to another block that is outside of the current loop.
LoopT * removeChildLoop(iterator I)
This removes the specified child from being a subloop of this loop.
Wrapper class to LoopBlocksDFS that provides a standard begin()/end() interface for the DFS reverse p...
void perform(const LoopInfo *LI)
Traverse the loop blocks and store the DFS result.
void verify(const DominatorTreeBase< BlockT, false > &DomTree) const
void addTopLevelLoop(LoopT *New)
This adds the specified loop to the collection of top-level loops.
void removeBlocksFromLoopAndAncestors(LoopT *Start, LoopT *Stop, PredicateT Pred)
Remove every block satisfying Pred from Start and each of its ancestors up to but not including Stop,...
LoopT * removeLoop(iterator I)
This removes the specified top-level loop from this loop info object.
unsigned getLoopDepth(const BlockT *BB) const
Return the loop nesting level of the specified block.
SmallVector< LoopT *, 4 > takeChildrenIf(LoopT *Parent, PredicateT Pred)
Detach and return the children of Parent (the top-level loops if Parent is null) that satisfy Pred,...
BlockT * getUniqueLatchExitBlock(const LoopT &L) const
Return the unique exit block for the latch of L, or null if there are multiple different exit blocks ...
void removeBlocksIf(LoopT &L, PredicateT Pred)
Remove every block satisfying Pred from L's block list, preserving the order of the remaining blocks.
LoopT * getLoopFor(const BlockT *BB) const
Return the inner most loop that BB lives in.
void destroy(LoopT *L)
Destroy a loop that has been removed from the LoopInfo nest.
void changeLoopFor(const BlockT *BB, LoopT *L)
Change the top-level loop that contains BB to the specified loop.
Represents a single loop in the control flow graph.
LLVM_ABI MDNode * createUnlikelyBranchWeights()
Return metadata containing two branch weights, with significant bias towards false destination.
Represents a read-write access to memory, whether it is a must-alias, or a may-alias.
An analysis that produces MemorySSA for a function.
MemorySSA * getMemorySSA() const
Get handle on MemorySSA.
LLVM_ABI void removeEdge(BasicBlock *From, BasicBlock *To)
Update the MemoryPhi in To following an edge deletion between From and To.
LLVM_ABI void updateForClonedLoop(const LoopBlocksRPO &LoopBlocks, ArrayRef< BasicBlock * > ExitBlocks, const ValueToValueMapTy &VM, bool IgnoreIncomingWithNoClones=false)
Update MemorySSA after a loop was cloned, given the blocks in RPO order, the exit blocks and a 1:1 ma...
LLVM_ABI void removeDuplicatePhiEdgesBetween(const BasicBlock *From, const BasicBlock *To)
Update the MemoryPhi in To to have a single incoming edge from From, following a CFG change that repl...
LLVM_ABI void removeBlocks(const SmallSetVector< BasicBlock *, 8 > &DeadBlocks)
Remove all MemoryAcceses in a set of BasicBlocks about to be deleted.
LLVM_ABI void moveAllAfterSpliceBlocks(BasicBlock *From, BasicBlock *To, Instruction *Start)
From block was spliced into From and To.
LLVM_ABI MemoryAccess * createMemoryAccessInBB(Instruction *I, MemoryAccess *Definition, const BasicBlock *BB, MemorySSA::InsertionPlace Point, bool CreationMustSucceed=true)
Create a MemoryAccess in MemorySSA at a specified point in a block.
LLVM_ABI void applyInsertUpdates(ArrayRef< CFGUpdate > Updates, DominatorTree &DT)
Apply CFG insert updates, analogous with the DT edge updates.
LLVM_ABI void applyUpdates(ArrayRef< CFGUpdate > Updates, DominatorTree &DT, bool UpdateDTFirst=false)
Apply CFG updates, analogous with the DT edge updates.
LLVM_ABI void moveToPlace(MemoryUseOrDef *What, BasicBlock *BB, MemorySSA::InsertionPlace Where)
LLVM_ABI void updateExitBlocksForClonedLoop(ArrayRef< BasicBlock * > ExitBlocks, const ValueToValueMapTy &VMap, DominatorTree &DT)
Update phi nodes in exit block successors following cloning.
Encapsulates MemorySSA, including all data associated with memory accesses.
DefsList * getBlockDefs(const BasicBlock *BB) const
Return the list of MemoryDef's and MemoryPhi's for a given basic block.
LLVM_ABI void verifyMemorySSA(VerificationLevel=VerificationLevel::Fast) const
Verify that MemorySSA is self consistent (IE definitions dominate all uses, uses appear in the right ...
MemoryUseOrDef * getMemoryAccess(const Instruction *I) const
Given a memory Mod/Ref'ing instruction, get the MemorySSA access associated with it.
A Module instance is used to store all the information related to an LLVM module.
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 class represents an analyzed expression in the program.
The main scalar evolution driver.
const SCEV * getConstantMaxBackedgeTakenCount(const Loop *L)
When successful, this returns a SCEVConstant that is greater than or equal to (i.e.
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 void forgetTopmostLoop(const Loop *L)
LLVM_ABI void forgetBlockAndLoopDispositions(Value *V=nullptr)
Called when the client has changed the disposition of values in a loop or block.
LLVM_ABI void forgetLcssaPhiWithNewPredecessor(Loop *L, PHINode *V)
Forget LCSSA phi node V of loop L to which a new predecessor was added, such that it may no longer be...
This class represents the LLVM 'select' instruction.
size_type size() const
Determine the number of elements in the SetVector.
size_type count(const_arg_type key) const
Count the number of elements of a given key in the SetVector.
iterator begin()
Get an iterator to the beginning of the SetVector.
bool insert(const value_type &X)
Insert a new element into the SetVector.
LLVM_ABI void printPipeline(raw_ostream &OS, function_ref< StringRef(StringRef)> MapClassName2PassName)
LLVM_ABI PreservedAnalyses run(Loop &L, LoopAnalysisManager &AM, LoopStandardAnalysisResults &AR, LPMUpdater &U)
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.
A SetVector that performs no allocations if smaller than a certain size.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
reference emplace_back(ArgTypes &&... Args)
void reserve(size_type N)
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.
Represent a constant reference to a string, i.e.
A wrapper class to simplify modification of SwitchInst cases along with their prof branch_weights met...
LLVM_ABI void setSuccessorWeight(unsigned idx, CaseWeightOpt W)
LLVM_ABI Instruction::InstListType::iterator eraseFromParent()
Delegate the call to the underlying SwitchInst::eraseFromParent() and mark this object to not touch t...
LLVM_ABI void addCase(ConstantInt *OnVal, BasicBlock *Dest, CaseWeightOpt W)
Delegate the call to the underlying SwitchInst::addCase() and set the specified branch weight for the...
LLVM_ABI CaseWeightOpt getSuccessorWeight(unsigned idx)
std::optional< uint32_t > CaseWeightOpt
LLVM_ABI SwitchInst::CaseIt removeCase(SwitchInst::CaseIt I)
Delegate the call to the underlying SwitchInst::removeCase() and remove correspondent branch weight.
unsigned getSuccessorIndex() const
Returns successor index for current case successor.
BasicBlockT * getCaseSuccessor() const
Resolves successor for current case.
ConstantIntT * getCaseValue() const
Resolves case value for current case.
BasicBlock * getDefaultDest() const
static SwitchInst * Create(Value *Value, BasicBlock *Default, unsigned NumCases, InsertPosition InsertBefore=nullptr)
void setDefaultDest(BasicBlock *DefaultCase)
iterator_range< CaseIt > cases()
Iteration adapter for range-for loops.
TinyPtrVector - This class is specialized for cases where there are normally 0 or 1 element in a vect...
void push_back(EltTy NewVal)
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
static UncondBrInst * Create(BasicBlock *Target, InsertPosition InsertBefore=nullptr)
A Use represents the edge between a Value definition and its users.
ValueT lookup(const 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 KeyT &Val) const
Return 1 if the specified key is in the map, 0 otherwise.
LLVM Value Representation.
LLVM_ABI void setName(const Twine &Name)
Change the name of the value.
LLVMContext & getContext() const
All values hold a context through their type.
iterator_range< use_iterator > uses()
An efficient, type-erasing, non-owning reference to a callable.
const ParentTy * getParent() const
self_iterator getIterator()
This class implements an extremely fast bulk output stream that can only output to a stream.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
Abstract Attribute helper functions.
@ 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.
match_combine_or< Ty... > m_CombineOr(const Ty &...Ps)
Combine pattern matchers matching any of Ps patterns.
LogicalOp_match< LHS, RHS, Instruction::And > m_LogicalAnd(const LHS &L, const RHS &R)
Matches L && R either in the form of L & R or L ?
bool match(Val *V, const Pattern &P)
cst_pred_ty< is_one > m_One()
Match an integer 1 or a vector with all elements equal to 1.
ThreeOps_match< Cond, LHS, RHS, Instruction::Select > m_Select(const Cond &C, const LHS &L, const RHS &R)
Matches SelectInst.
auto m_BasicBlock()
Match an arbitrary basic block value and ignore it.
auto m_Value()
Match an arbitrary value and ignore it.
auto m_LogicalOr()
Matches L || R where L and R are arbitrary values.
CmpClass_match< LHS, RHS, ICmpInst > m_ICmp(CmpPredicate &Pred, const LHS &L, const RHS &R)
auto m_LogicalAnd()
Matches L && R where L and R are arbitrary values.
brc_match< Cond_t, match_bind< BasicBlock >, match_bind< BasicBlock > > m_Br(const Cond_t &C, BasicBlock *&T, BasicBlock *&F)
LogicalOp_match< LHS, RHS, Instruction::Or > m_LogicalOr(const LHS &L, const RHS &R)
Matches L || R either in the form of L | R or L ?
is_zero m_Zero()
Match any null constant or a vector with all elements equal to 0.
initializer< Ty > init(const Ty &Val)
friend class Instruction
Iterator for Instructions in a `BasicBlock.
This is an optimization pass for GlobalISel generic memory operations.
auto drop_begin(T &&RangeOrContainer, size_t N=1)
Return a range covering RangeOrContainer with the first N elements excluded.
void stable_sort(R &&Range)
auto find(R &&Range, const T &Val)
Provide wrappers to std::find which take ranges instead of having to pass begin/end explicitly.
LLVM_ABI cl::opt< bool > ProfcheckDisableMetadataFixes
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
auto size(R &&Range, std::enable_if_t< std::is_base_of< std::random_access_iterator_tag, typename std::iterator_traits< decltype(Range.begin())>::iterator_category >::value, void > *=nullptr)
Get the size of a range.
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.
LLVM_ABI BasicBlock * CloneBasicBlock(const BasicBlock *BB, ValueToValueMapTy &VMap, const Twine &NameSuffix="", Function *F=nullptr, ClonedCodeInfo *CodeInfo=nullptr, bool MapAtoms=true)
Return a copy of the specified basic block, but without embedding the block into a particular functio...
LLVM_ABI void setExplicitlyUnknownBranchWeightsIfProfiled(Instruction &I, StringRef PassName, const Function *F=nullptr)
Like setExplicitlyUnknownBranchWeights(...), but only sets unknown branch weights in the new instruct...
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
static cl::opt< int > UnswitchThreshold("unswitch-threshold", cl::init(50), cl::Hidden, cl::desc("The cost threshold for unswitching a loop."))
auto successors(const MachineBasicBlock *BB)
static cl::opt< bool > EnableNonTrivialUnswitch("enable-nontrivial-unswitch", cl::init(false), cl::Hidden, cl::desc("Forcibly enables non-trivial loop unswitching rather than " "following the configuration passed into the pass."))
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
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...
auto cast_or_null(const Y &Val)
LLVM_ABI MDNode * findOptionMDForLoop(const Loop *TheLoop, StringRef Name)
Find string metadata for a loop.
detail::concat_range< ValueT, RangeTs... > concat(RangeTs &&...Ranges)
Returns a concatenated range across two or more ranges.
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
DomTreeNodeBase< BasicBlock > DomTreeNode
AnalysisManager< Loop, LoopStandardAnalysisResults & > LoopAnalysisManager
The loop analysis manager.
static cl::opt< bool > EnableUnswitchCostMultiplier("enable-unswitch-cost-multiplier", cl::init(true), cl::Hidden, cl::desc("Enable unswitch cost multiplier that prohibits exponential " "explosion in nontrivial unswitch."))
auto dyn_cast_or_null(const Y &Val)
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
unsigned Log2_32(uint32_t Value)
Return the floor log base 2 of the specified value, -1 if the value is zero.
LLVM_ABI bool isGuard(const User *U)
Returns true iff U has semantics of a guard expressed in a form of call of llvm.experimental....
void RemapDbgRecordRange(Module *M, iterator_range< DbgRecordIterator > Range, ValueToValueMapTy &VM, RemapFlags Flags=RF_None, ValueMapTypeRemapper *TypeMapper=nullptr, ValueMaterializer *Materializer=nullptr, const MetadataPredicate *IdentityMD=nullptr)
Remap the Values used in the DbgRecords Range using the value map VM.
auto reverse(ContainerTy &&C)
static cl::opt< bool > DropNonTrivialImplicitNullChecks("simple-loop-unswitch-drop-non-trivial-implicit-null-checks", cl::init(false), cl::Hidden, cl::desc("If enabled, drop make.implicit metadata in unswitched implicit " "null checks to save time analyzing if we can keep it."))
bool containsIrreducibleCFG(RPOTraversalT &RPOTraversal, const LoopInfoT &LI)
Return true if the control flow in RPOTraversal is irreducible.
static cl::opt< unsigned > InjectInvariantConditionHotnesThreshold("simple-loop-unswitch-inject-invariant-condition-hotness-threshold", cl::Hidden, cl::desc("Only try to inject loop invariant conditions and " "unswitch on them to eliminate branches that are " "not-taken 1/<this option> times or less."), cl::init(16))
static cl::opt< int > UnswitchSiblingsToplevelDiv("unswitch-siblings-toplevel-div", cl::init(2), cl::Hidden, cl::desc("Toplevel siblings divisor for cost multiplier."))
detail::zippy< detail::zip_first, T, U, Args... > zip_first(T &&t, U &&u, Args &&...args)
zip iterator that, for the sake of efficiency, assumes the first iteratee to be the shortest.
void sort(IteratorTy Start, IteratorTy End)
@ RF_IgnoreMissingLocals
If this flag is set, the remapper ignores missing function-local entries (Argument,...
@ RF_NoModuleLevelChanges
If this flag is set, the remapper knows that only local values within a function (such as an instruct...
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
static cl::opt< bool > InjectInvariantConditions("simple-loop-unswitch-inject-invariant-conditions", cl::Hidden, cl::desc("Whether we should inject new invariants and unswitch them to " "eliminate some existing (non-invariant) conditions."), cl::init(true))
LLVM_ABI bool VerifyLoopInfo
Enable verification of loop info.
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 bool VerifyMemorySSA
Enables verification of MemorySSA.
LLVM_ABI BasicBlock * SplitBlock(BasicBlock *Old, BasicBlock::iterator SplitPt, DominatorTree *DT, LoopInfo *LI=nullptr, MemorySSAUpdater *MSSAU=nullptr, const Twine &BBName="")
Split the specified block at the specified instruction.
LLVM_ABI bool formDedicatedExitBlocks(Loop *L, DominatorTree *DT, LoopInfo *LI, MemorySSAUpdater *MSSAU, bool PreserveLCSSA)
Ensure that all exit blocks of the loop are dedicated exits.
void RemapInstruction(Instruction *I, ValueToValueMapTy &VM, RemapFlags Flags=RF_None, ValueMapTypeRemapper *TypeMapper=nullptr, ValueMaterializer *Materializer=nullptr, const MetadataPredicate *IdentityMD=nullptr)
Convert the instruction operands from referencing the current values into those specified by VM.
LLVM_ABI bool isGuaranteedNotToBeUndefOrPoison(const Value *V, AssumptionCache *AC=nullptr, const Instruction *CtxI=nullptr, const DominatorTree *DT=nullptr, unsigned Depth=0)
Return true if this function can prove that V does not have undef bits and is never poison.
ArrayRef(const T &OneElt) -> ArrayRef< T >
auto sum_of(R &&Range, E Init=E{0})
Returns the sum of all values in Range with Init initial value.
ValueMap< const Value *, WeakTrackingVH > ValueToValueMapTy
static cl::opt< int > UnswitchNumInitialUnscaledCandidates("unswitch-num-initial-unscaled-candidates", cl::init(8), cl::Hidden, cl::desc("Number of unswitch candidates that are ignored when calculating " "cost multiplier."))
LLVM_ABI bool extractBranchWeights(const MDNode *ProfileData, SmallVectorImpl< uint32_t > &Weights)
Extract branch weights from MD_prof metadata.
auto count_if(R &&Range, UnaryPredicate P)
Wrapper function around std::count_if to count the number of times an element satisfying a given pred...
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.
static cl::opt< bool > EstimateProfile("simple-loop-unswitch-estimate-profile", cl::Hidden, cl::init(true))
constexpr auto seq(T Begin, T End)
Iterate over an integral type from Begin up to - but not including - End.
static cl::opt< unsigned > MSSAThreshold("simple-loop-unswitch-memoryssa-threshold", cl::desc("Max number of memory uses to explore during " "partial unswitching analysis"), cl::init(100), cl::Hidden)
void erase_if(Container &C, UnaryPredicate P)
Provide a container algorithm similar to C++ Library Fundamentals v2's erase_if which is equivalent t...
auto predecessors(const MachineBasicBlock *BB)
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Next
bool pred_empty(const BasicBlock *BB)
LLVM_ABI Instruction * SplitBlockAndInsertIfThen(Value *Cond, BasicBlock::iterator SplitBefore, bool Unreachable, MDNode *BranchWeights=nullptr, DomTreeUpdater *DTU=nullptr, LoopInfo *LI=nullptr, BasicBlock *ThenBlock=nullptr)
Split the containing block at the specified instruction - everything before SplitBefore stays in the ...
LLVM_ABI BasicBlock * SplitEdge(BasicBlock *From, BasicBlock *To, DominatorTree *DT=nullptr, LoopInfo *LI=nullptr, MemorySSAUpdater *MSSAU=nullptr, const Twine &BBName="")
Split the edge connecting the specified blocks, and return the newly created basic block between From...
static cl::opt< bool > FreezeLoopUnswitchCond("freeze-loop-unswitch-cond", cl::init(true), cl::Hidden, cl::desc("If enabled, the freeze instruction will be added to condition " "of loop unswitch to prevent miscompilation."))
LLVM_ABI std::optional< IVConditionInfo > hasPartialIVCondition(const Loop &L, unsigned MSSAThreshold, const MemorySSA &MSSA, AAResults &AA)
Check if the loop header has a conditional branch that is not loop-invariant, because it involves loa...
LLVM_ABI bool formLCSSA(Loop &L, const DominatorTree &DT, const LoopInfo *LI, ScalarEvolution *SE)
Put loop into LCSSA form.
static cl::opt< bool > UnswitchGuards("simple-loop-unswitch-guards", cl::init(true), cl::Hidden, cl::desc("If enabled, simple loop unswitching will also consider " "llvm.experimental.guard intrinsics as unswitch candidates."))
LLVM_ABI void mapAtomInstance(const DebugLoc &DL, ValueToValueMapTy &VMap)
Mark a cloned instruction as a new instance so that its source loc can be updated when remapped.
static cl::opt< int > UnswitchParentBlocksDiv("unswitch-parent-blocks-div", cl::init(8), cl::Hidden, cl::desc("Outer loop size divisor for cost multiplier."))
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
A special type used by analysis passes to provide an address that identifies that particular analysis...
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).
Struct to hold information about a partially invariant condition.
SmallVector< Instruction * > InstToDuplicate
Instructions that need to be duplicated and checked for the unswitching condition.
Constant * KnownValue
Constant to indicate for which value the condition is invariant.
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.