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");
93 : Term(Term), Invariant(Invariant), InLoopSucc(InLoopSucc) {}
96struct InjectedInvariant {
97 ICmpInst::Predicate Pred;
102 InjectedInvariant(ICmpInst::Predicate Pred,
Value *LHS,
Value *RHS,
103 BasicBlock *InLoopSucc)
104 : Pred(Pred), LHS(LHS), RHS(RHS), InLoopSucc(InLoopSucc) {}
107struct NonTrivialUnswitchCandidate {
109 TinyPtrVector<Value *> Invariants;
110 std::optional<InstructionCost> Cost;
111 std::optional<InjectedInvariant> PendingInjection;
112 NonTrivialUnswitchCandidate(
114 std::optional<InstructionCost> Cost = std::nullopt,
115 std::optional<InjectedInvariant> PendingInjection = std::nullopt)
116 : TI(TI), Invariants(Invariants), Cost(Cost),
117 PendingInjection(PendingInjection) {};
119 bool hasPendingInjection()
const {
return PendingInjection.has_value(); }
143 assert(!L.isLoopInvariant(&Root) &&
144 "Only need to walk the graph if root itself is not invariant.");
157 for (
Value *OpV :
I.operand_values()) {
163 if (L.isLoopInvariant(OpV)) {
174 if (Visited.
insert(OpI).second)
178 }
while (!Worklist.
empty());
193 if (UserI && L.contains(UserI))
201 return PN && PN->getParent() == L.getHeader();
209 return cast<PHINode>(V)->getIncomingValueForBlock(L.getLoopPreheader());
220 bool AllowHeaderPHIs =
false) {
227 const Value *Incoming = PN->getIncomingValueForBlock(&ExitingBB);
228 if (!L.isLoopInvariant(Incoming) &&
252 bool HasBranchWeights = Opts.simple_loop_unswitch_estimate_profile &&
265 if (HasBranchWeights &&
266 static_cast<double>(BranchWeights[
Direction ? 0 : 1]) /
267 static_cast<double>(
sum_of(BranchWeights)) >
269 HasBranchWeights =
false;
275 for (
Value *Inv : Invariants) {
276 if (Opts.freeze_loop_unswitch_cond &&
286 Direction ? &NormalSucc : &UnswitchedSucc,
287 HasBranchWeights ? ComputeProfFrom.
getMetadata(LLVMContext::MD_prof)
289 if (!HasBranchWeights)
299 for (
auto *Val :
reverse(ToDuplicate)) {
317 auto *DefiningAccess = MemUse->getDefiningAccess();
319 while (L.contains(DefiningAccess->getBlock())) {
324 MemPhi->getIncomingValueForBlock(L.getLoopPreheader());
345 Direction ? &NormalSucc : &UnswitchedSucc, ProfData);
365 for (
auto i :
seq<int>(0, PN.getNumOperands())) {
366 assert(PN.getIncomingBlock(i) == &OldExitingBB &&
367 "Found incoming block different from unique predecessor!");
368 PN.setIncomingBlock(i, &OldPH);
384 assert(&ExitBB != &UnswitchedBB &&
385 "Must have different loop exit and unswitched blocks!");
389 PN.getName() +
".split");
390 NewPN->insertBefore(InsertPt);
401 for (
int i = PN.getNumIncomingValues() - 1; i >= 0; --i) {
402 if (PN.getIncomingBlock(i) != &OldExitingBB)
405 Value *Incoming = PN.getIncomingValue(i);
408 PN.removeIncomingValue(i);
415 PN.replaceAllUsesWith(NewPN);
416 NewPN->addIncoming(&PN, &ExitBB);
429 Loop *OldParentL = L.getParentLoop();
434 L.getExitBlocks(Exits);
435 Loop *NewParentL =
nullptr;
436 for (
auto *ExitBB : Exits)
438 if (!NewParentL || NewParentL->
contains(ExitL))
441 if (NewParentL == OldParentL)
447 "Can only hoist this loop up the nest!");
451 "Parent loop of this loop should contain this loop's preheader!");
466 for (
Loop *OldContainingL = OldParentL; OldContainingL != NewParentL;
469 return BB == &Preheader || L.contains(BB);
493 Loop *Current = TopMost;
524 LLVM_DEBUG(
dbgs() <<
" Trying to unswitch branch: " << BI <<
"\n");
531 bool FullUnswitch =
false;
534 if (L.isLoopInvariant(
Cond)) {
540 if (Invariants.
empty()) {
546 std::optional<int> LatchIdx = std::nullopt;
547 auto *LoopLatch = L.getLoopLatch();
549 if (SE && FullUnswitch && ULExit) {
556 bool ModifiedBranch =
false;
563 if (CB->isConvergent())
565 return I.mayHaveSideEffects();
578 LoopLatch->removePredecessor(BI.
getParent());
580 for (
PHINode &PN : ULExit->phis()) {
581 Value *V = PN.getIncomingValueForBlock(LoopLatch);
589 ModifiedBranch =
true;
594 bool ExitDirection =
true;
595 int LoopExitSuccIdx = 0;
597 if (L.contains(LoopExitBB)) {
598 ExitDirection =
false;
601 if (L.contains(LoopExitBB)) {
603 assert(!ModifiedBranch &&
"Modified the branch but didn't unswitch");
607 auto *ContinueBB = BI.
getSuccessor(1 - LoopExitSuccIdx);
615 LLVM_DEBUG(
dbgs() <<
" Loop exit PHI's aren't loop-invariant!\n");
628 "non-full unswitch!\n");
629 assert(!ModifiedBranch &&
"Modified the branch but didn't unswitch");
635 dbgs() <<
" unswitching trivial invariant conditions for: " << BI
637 for (
Value *Invariant : Invariants) {
638 dbgs() <<
" " << *Invariant <<
" == true";
639 if (Invariant != Invariants.back())
671 if (FullUnswitch && LoopExitBB->getUniquePredecessor()) {
673 "A branch's parent isn't a predecessor!");
674 UnswitchedBB = LoopExitBB;
677 SplitBlock(LoopExitBB, LoopExitBB->begin(), &DT, &LI, MSSAU,
"");
710 "Must have an `or` of `i1`s or `select i1 X, true, Y`s for the "
714 "Must have an `and` of `i1`s or `select i1 X, Y, false`s for the"
717 Opts, *OldPH, Invariants, ExitDirection, *UnswitchedBB, *NewPH,
740 Term->eraseFromParent();
750 if (UnswitchedBB == LoopExitBB)
754 *ParentBB, *OldPH, FullUnswitch);
765 for (
Value *Invariant : Invariants)
777 ParentL && !ParentL->
contains(UnswitchedBB);
778 ParentL = ParentL->getParentLoop())
820 Value *LoopCond =
SI.getCondition();
823 if (!L.isLoopInvariant(LoopCond))
826 auto *ParentBB =
SI.getParent();
833 auto IsTriviallyUnswitchableExitBlock = [&](
BasicBlock &BBToCheck) {
835 if (L.contains(&BBToCheck))
844 auto *TI = BBToCheck.getTerminator();
846 return !isUnreachable || &*BBToCheck.getFirstNonPHIIt() != TI;
850 for (
auto Case :
SI.cases())
851 if (IsTriviallyUnswitchableExitBlock(*Case.getCaseSuccessor()))
852 ExitCaseIndices.
push_back(Case.getCaseIndex());
856 if (IsTriviallyUnswitchableExitBlock(*
SI.getDefaultDest())) {
857 DefaultExitBB =
SI.getDefaultDest();
858 }
else if (ExitCaseIndices.
empty())
873 if (!ExitL || ExitL->
contains(OuterL))
876 for (
unsigned Index : ExitCaseIndices) {
877 auto CaseI =
SI.case_begin() + Index;
880 if (!ExitL || ExitL->
contains(OuterL))
894 SI.setDefaultDest(
nullptr);
902 ExitCases.reserve(ExitCaseIndices.
size());
906 for (
unsigned Index :
reverse(ExitCaseIndices)) {
907 auto CaseI =
SI.case_begin() + Index;
910 ExitCases.emplace_back(CaseI->getCaseValue(), CaseI->getCaseSuccessor(), W);
918 if (
SI.getNumCases() > 0 &&
920 return Case.getCaseSuccessor() == SI.case_begin()->getCaseSuccessor();
922 CommonSuccBB =
SI.case_begin()->getCaseSuccessor();
923 if (!DefaultExitBB) {
927 if (
SI.getNumCases() == 0)
928 CommonSuccBB =
SI.getDefaultDest();
929 else if (
SI.getDefaultDest() != CommonSuccBB)
930 CommonSuccBB =
nullptr;
959 UnswitchedExitBBs.
insert(DefaultExitBB);
968 DefaultExitBB = SplitExitBBMap[DefaultExitBB] = SplitBB;
973 for (
auto &ExitCase :
reverse(ExitCases)) {
981 if (UnswitchedExitBBs.
insert(ExitBB).second)
988 BasicBlock *&SplitExitBB = SplitExitBBMap[ExitBB];
997 std::get<1>(ExitCase) = SplitExitBB;
1002 for (
auto &ExitCase :
reverse(ExitCases)) {
1004 BasicBlock *UnswitchedBB = std::get<1>(ExitCase);
1006 NewSIW.
addCase(CaseVal, UnswitchedBB, std::get<2>(ExitCase));
1011 if (DefaultExitBB) {
1017 for (
const auto &Case :
SI.cases())
1020 }
else if (DefaultCaseWeight) {
1023 for (
const auto &Case :
SI.cases()) {
1026 "case weight must be defined as default case weight is defined");
1041 bool SkippedFirst = DefaultExitBB ==
nullptr;
1042 for (
auto Case :
SI.cases()) {
1044 "Non-common successor!");
1046 if (!SkippedFirst) {
1047 SkippedFirst =
true;
1057 }
else if (DefaultExitBB) {
1059 "If we had no cases we'd have a common successor!");
1064 auto LastCaseI = std::prev(
SI.case_end());
1066 SI.setDefaultDest(LastCaseI->getCaseSuccessor());
1077 for (
auto *UnswitchedExitBB : UnswitchedExitBBs) {
1081 for (
auto SplitUnswitchedPair : SplitExitBBMap) {
1082 DTUpdates.
push_back({DT.
Delete, ParentBB, SplitUnswitchedPair.first});
1094 assert(DT.
verify(DominatorTree::VerificationLevel::Fast));
1140 Visited.
insert(CurrentBB);
1147 if (!
isa<MemoryPhi>(*Defs->begin()) || (++Defs->begin() != Defs->end()))
1151 if (CB->isConvergent())
1153 return I.mayHaveSideEffects();
1181 CurrentBB = BI->getSuccessor();
1215 }
while (L.contains(CurrentBB) && Visited.
insert(CurrentBB).second);
1253 NewBlocks.
reserve(L.getNumBlocks() + ExitBlocks.
size());
1264 VMap[OldBB] = NewBB;
1272 auto It = DominatingSucc.
find(BB);
1273 return It != DominatingSucc.
end() && It->second != UnswitchedSuccBB;
1277 auto *ClonedPH = CloneBlock(LoopPH);
1280 for (
auto *LoopBB : L.blocks())
1281 if (!SkipBlock(LoopBB))
1287 for (
auto *ExitBB : ExitBlocks) {
1288 if (SkipBlock(ExitBB))
1296 auto *MergeBB =
SplitBlock(ExitBB, ExitBB->begin(), &DT, &LI, MSSAU);
1301 MergeBB->takeName(ExitBB);
1302 ExitBB->setName(
Twine(MergeBB->getName()) +
".split");
1305 auto *ClonedExitBB = CloneBlock(ExitBB);
1306 assert(ClonedExitBB->getTerminator()->getNumSuccessors() == 1 &&
1307 "Exit block should have been split to have one successor!");
1308 assert(ClonedExitBB->getTerminator()->getSuccessor(0) == MergeBB &&
1309 "Cloned exit block has the wrong successor!");
1315 std::prev(ClonedExitBB->end())))) {
1323 "Bad instruction in exit block!");
1325 assert(VMap.
lookup(&
I) == &ClonedI &&
"Mismatch in the value map!");
1336 MergePN->insertBefore(InsertPt);
1337 MergePN->setDebugLoc(InsertPt->getDebugLoc());
1338 I.replaceAllUsesWith(MergePN);
1339 MergePN->addIncoming(&
I, ExitBB);
1340 MergePN->addIncoming(&ClonedI, ClonedExitBB);
1349 Module *M = ClonedPH->getParent()->getParent();
1350 for (
auto *ClonedBB : NewBlocks)
1362 for (
auto *LoopBB : L.blocks())
1363 if (SkipBlock(LoopBB))
1366 for (
PHINode &PN : ClonedSuccBB->phis())
1367 PN.removeIncomingValue(LoopBB,
false);
1373 if (SuccBB == UnswitchedSuccBB)
1380 ClonedSuccBB->removePredecessor(ClonedParentBB,
1387 Instruction *ClonedTerminator = ClonedParentBB->getTerminator();
1390 Value *ClonedConditionToErase =
nullptr;
1392 ClonedConditionToErase = BI->getCondition();
1394 ClonedConditionToErase =
SI->getCondition();
1400 if (ClonedConditionToErase)
1407 for (
PHINode &PN : ClonedSuccBB->phis()) {
1411 for (
int i = PN.getNumOperands() - 1; i >= 0; --i) {
1412 if (PN.getIncomingBlock(i) != ClonedParentBB)
1418 PN.removeIncomingValue(i,
false);
1424 for (
auto *ClonedBB : NewBlocks) {
1426 if (SuccSet.
insert(SuccBB).second)
1442 auto AddClonedBlocksToLoop = [&](
Loop &OrigL,
Loop &ClonedL) {
1443 assert(ClonedL.getBlocks().empty() &&
"Must start with an empty loop!");
1445 for (
auto *BB : OrigL.
blocks()) {
1447 ClonedL.addBlockEntry(ClonedBB);
1460 AddClonedBlocksToLoop(OrigRootL, *ClonedRootL);
1472 LoopsToClone.
push_back({ClonedRootL, ChildL});
1474 Loop *ClonedParentL, *L;
1475 std::tie(ClonedParentL, L) = LoopsToClone.
pop_back_val();
1478 AddClonedBlocksToLoop(*L, *ClonedL);
1480 LoopsToClone.
push_back({ClonedL, ChildL});
1481 }
while (!LoopsToClone.
empty());
1502 Loop *ClonedL =
nullptr;
1514 Loop *ParentL =
nullptr;
1518 for (
auto *ExitBB : ExitBlocks)
1521 ExitLoopMap[ClonedExitBB] = ExitL;
1522 ClonedExitsInLoops.
push_back(ClonedExitBB);
1523 if (!ParentL || (ParentL != ExitL && ParentL->
contains(ExitL)))
1528 "The computed parent loop should always contain (or be) the parent of "
1529 "the original loop.");
1536 for (
auto *BB : OrigL.
blocks())
1538 ClonedLoopBlocks.
insert(ClonedBB);
1549 if (Pred == ClonedPH)
1554 assert(ClonedLoopBlocks.
count(Pred) &&
"Found a predecessor of the loop "
1555 "header other than the preheader "
1556 "that is not part of the loop!");
1561 if (BlocksInClonedLoop.
insert(Pred).second && Pred != ClonedHeader)
1568 if (!BlocksInClonedLoop.
empty()) {
1569 BlocksInClonedLoop.
insert(ClonedHeader);
1571 while (!Worklist.
empty()) {
1574 "Didn't put block into the loop set!");
1582 if (ClonedLoopBlocks.
count(Pred) &&
1583 BlocksInClonedLoop.
insert(Pred).second)
1602 for (
auto *BB : OrigL.
blocks()) {
1604 if (!ClonedBB || !BlocksInClonedLoop.
count(ClonedBB))
1616 for (
Loop *PL = ClonedL; PL; PL = PL->getParentLoop())
1617 PL->addBlockEntry(ClonedBB);
1624 for (
Loop *ChildL : OrigL) {
1625 auto *ClonedChildHeader =
1627 if (!ClonedChildHeader || !BlocksInClonedLoop.
count(ClonedChildHeader))
1633 for (
auto *ChildLoopBB : ChildL->blocks())
1636 "Child cloned loop has a header within the cloned outer "
1637 "loop but not all of its blocks!");
1652 if (BlocksInClonedLoop.
empty())
1653 UnloopedBlockSet.
insert(ClonedPH);
1654 for (
auto *ClonedBB : ClonedLoopBlocks)
1655 if (!BlocksInClonedLoop.
count(ClonedBB))
1656 UnloopedBlockSet.
insert(ClonedBB);
1662 auto OrderedClonedExitsInLoops = ClonedExitsInLoops;
1664 return ExitLoopMap.
lookup(
LHS)->getLoopDepth() <
1665 ExitLoopMap.
lookup(
RHS)->getLoopDepth();
1670 while (!UnloopedBlockSet.
empty() && !OrderedClonedExitsInLoops.empty()) {
1671 assert(Worklist.
empty() &&
"Didn't clear worklist!");
1673 BasicBlock *ExitBB = OrderedClonedExitsInLoops.pop_back_val();
1688 if (!UnloopedBlockSet.
erase(PredBB)) {
1690 (BlocksInClonedLoop.
count(PredBB) || ExitLoopMap.
count(PredBB)) &&
1691 "Predecessor not mapped to a loop!");
1698 bool Inserted = ExitLoopMap.
insert({PredBB, ExitL}).second;
1700 assert(Inserted &&
"Should only visit an unlooped block once!");
1705 }
while (!Worklist.
empty());
1715 ArrayRef(ClonedPH), ClonedLoopBlocks, ClonedExitsInLoops))
1717 OuterL->addBasicBlockToLoop(BB, LI);
1720 for (
auto &BBAndL : ExitLoopMap) {
1721 auto *BB = BBAndL.first;
1722 auto *OuterL = BBAndL.second;
1724 "Failed to put all blocks into outer loops!");
1731 for (
Loop *ChildL : OrigL) {
1732 auto *ClonedChildHeader =
1734 if (!ClonedChildHeader || BlocksInClonedLoop.
count(ClonedChildHeader))
1738 for (
auto *ChildLoopBB : ChildL->blocks())
1740 "Cloned a child loop header but not all of that loops blocks!");
1744 *ChildL, ExitLoopMap.
lookup(ClonedChildHeader), VMap, LI));
1750 ArrayRef<std::unique_ptr<ValueToValueMapTy>> VMaps,
1755 for (
const auto &VMap : VMaps)
1759 SuccBB->removePredecessor(ClonedBB);
1772 BB->dropAllReferences();
1775 BB->eraseFromParent();
1792 DeathCandidates.
append(L.blocks().begin(), L.blocks().end());
1793 while (!DeathCandidates.
empty()) {
1797 SuccBB->removePredecessor(BB);
1814 for (
Loop *Cur = &L; Cur; Cur = Cur->getParentLoop())
1820 for (
Loop *ChildL : L) {
1821 if (!DeadBlockSet.
count(ChildL->getHeader()))
1826 return DeadBlockSet.count(ChildBB);
1828 "If the child loop header is dead all blocks in the child loop must "
1829 "be dead as well!");
1835 return DeadBlockSet.count(ChildL->getHeader());
1842 for (
auto *BB : DeadBlockSet) {
1844 assert(!DT.
getNode(BB) &&
"Should already have cleared domtree!");
1851 BB->dropAllReferences();
1856 for (
auto *BB : DeadBlockSet)
1878 RemovedSet.
insert(RemovedL);
1880 for (
Loop *ChildL : Children)
1881 if (!RemovedSet.
contains(ChildL) && ChildL->getParentLoop() != &L)
1884 if (SE && !Removed.
empty())
1887 for (
auto [RemovedL, Header] : Removed) {
1889 "Unswitching can only remove loops from the current nest!");
1903template <
typename CallableT>
1915 if (!Callable(
N->getBlock()))
1921 "Cannot visit a node twice when walking a tree!");
1924 }
while (!DomWorklist.
empty());
1928 bool CurrentLoopValid,
bool PartiallyInvariant,
1931 if (!NewLoops.
empty())
1932 U.addSiblingLoops(NewLoops);
1936 if (CurrentLoopValid) {
1937 if (PartiallyInvariant) {
1940 L.addStringLoopAttribute(
"llvm.loop.unswitch.partial.disable",
1941 {
"llvm.loop.unswitch.partial"});
1942 }
else if (InjectedCondition) {
1944 L.addStringLoopAttribute(
"llvm.loop.unswitch.injection.disable",
1945 {
"llvm.loop.unswitch.injection"});
1947 U.revisitCurrentLoop();
1949 U.markLoopAsDeleted(L, LoopName);
1957 bool InjectedCondition) {
1964 std::string LoopName(L.getName());
1969 assert((
SI || BI) &&
"Can only unswitch switches and conditional branch!");
1973 !PartiallyInvariant);
1976 "Cannot have other invariants with full unswitching!");
1979 "Partial unswitching requires an instruction as the condition!");
1992 if (!FullUnswitch) {
1996 PartiallyInvariant) &&
1997 "Only `or`, `and`, an `select`, partially invariant instructions "
1998 "can combine invariants being unswitched.");
2014 for (
auto Case :
SI->cases())
2015 if (Case.getCaseSuccessor() != RetainedSuccBB)
2016 UnswitchedSuccBBs.
insert(Case.getCaseSuccessor());
2018 assert(!UnswitchedSuccBBs.
count(RetainedSuccBB) &&
2019 "Should not unswitch the same successor we are retaining!");
2028 Loop *ParentL = L.getParentLoop();
2037 Loop *OuterExitL = &L;
2039 L.getUniqueExitBlocks(ExitBlocks);
2040 for (
auto *ExitBB : ExitBlocks) {
2044 if (!NewOuterExitL) {
2046 OuterExitL =
nullptr;
2049 if (NewOuterExitL != OuterExitL && NewOuterExitL->
contains(OuterExitL))
2050 OuterExitL = NewOuterExitL;
2072 if (SuccBB->getUniquePredecessor() ||
2074 return PredBB == ParentBB || DT.
dominates(SuccBB, PredBB);
2077 DominatingSucc[BB] = SuccBB;
2096 for (
auto *SuccBB : UnswitchedSuccBBs) {
2099 L, LoopPH, SplitBB, ExitBlocks, ParentBB, SuccBB, RetainedSuccBB,
2100 DominatingSucc, *VMaps.
back(), DTUpdates, AC, DT, LI, MSSAU, SE);
2105 if (TI.
getMetadata(LLVMContext::MD_make_implicit)) {
2106 if (Opts.simple_loop_unswitch_drop_non_trivial_implicit_null_checks)
2109 TI.
setMetadata(LLVMContext::MD_make_implicit,
nullptr);
2115 TI.
setMetadata(LLVMContext::MD_make_implicit,
nullptr);
2126 NewTI->
insertInto(ParentBB, ParentBB->end());
2149 assert(
SI &&
"Must either be a branch or switch!");
2152 assert(
SI->getDefaultDest() == RetainedSuccBB &&
2153 "Not retaining default successor!");
2154 SI->setDefaultDest(LoopPH);
2155 for (
const auto &Case :
SI->cases())
2156 if (Case.getCaseSuccessor() == RetainedSuccBB)
2157 Case.setSuccessor(LoopPH);
2159 Case.setSuccessor(ClonedPHs.
find(Case.getCaseSuccessor())->second);
2163 SI->getCondition()->getName() +
".fr",
2164 SI->getIterator()));
2185 for (
auto &VMap : VMaps)
2201 "Only one possible unswitched block for a branch!");
2215 "Not retaining default successor!");
2216 for (
const auto &Case : NewSI->
cases())
2217 Case.getCaseSuccessor()->removePredecessor(
2236 assert(BI &&
"Only branches have partial unswitching.");
2238 "Only one possible unswitched block for a branch!");
2242 if (PartiallyInvariant)
2244 *SplitBB, Invariants,
Direction, *ClonedPH, *LoopPH, L, MSSAU, *BI);
2257 for (
auto &VMap : VMaps)
2277 for (std::unique_ptr<ValueToValueMapTy> &VMap : VMaps)
2295#ifdef EXPENSIVE_CHECKS
2301 assert(DT.
verify(DominatorTree::VerificationLevel::Fast));
2304 if (BI && !PartiallyInvariant) {
2310 "Only one possible unswitched block for a branch!");
2322 bool ReplaceUnswitched =
2323 FullUnswitch || (Invariants.
size() == 1) || PartiallyInvariant;
2331 for (
Value *Invariant : Invariants) {
2333 "Should not be replacing constant values!");
2343 U.set(ContinueReplacement);
2344 else if (ReplaceUnswitched &&
2346 U.set(UnswitchedReplacement);
2363 auto UpdateLoop = [&](
Loop &UpdateL) {
2365 UpdateL.verifyLoop();
2366 for (
Loop *ChildL : UpdateL) {
2367 ChildL->verifyLoop();
2368 assert(ChildL->isRecursivelyLCSSAForm(DT, LI) &&
2369 "Perturbed a child loop's LCSSA form!");
2389 for (
Loop *UpdatedL :
2391 UpdateLoop(*UpdatedL);
2392 if (UpdatedL->isOutermost())
2393 OuterExitL =
nullptr;
2397 if (L.isOutermost())
2398 OuterExitL =
nullptr;
2403 if (OuterExitL != &L)
2404 for (
Loop *OuterL = ParentL; OuterL != OuterExitL;
2406 UpdateLoop(*OuterL);
2408#ifdef EXPENSIVE_CHECKS
2419 if (UpdatedL->getParentLoop() == ParentL)
2421 postUnswitch(L, LoopUpdater, LoopName, IsStillLoop, PartiallyInvariant,
2422 InjectedCondition, SibLoops);
2445 auto BBCostIt = BBCostMap.
find(
N.getBlock());
2446 if (BBCostIt == BBCostMap.
end())
2450 auto DTCostIt = DTCostMap.
find(&
N);
2451 if (DTCostIt != DTCostMap.
end())
2452 return DTCostIt->second;
2457 N.begin(),
N.end(), BBCostIt->second,
2459 return Sum + computeDomSubtreeCost(*ChildN, BBCostMap, DTCostMap);
2461 bool Inserted = DTCostMap.
insert({&
N, Cost}).second;
2463 assert(Inserted &&
"Should not insert a node while visiting children!");
2498 SI->getMetadata(LLVMContext::MD_prof), &DTU, &LI);
2500 BasicBlock *ThenBB = CondBr->getSuccessor(0),
2501 *TailBB = CondBr->getSuccessor(1);
2507 Phi->addIncoming(
SI->getTrueValue(), ThenBB);
2508 Phi->addIncoming(
SI->getFalseValue(), HeadBB);
2509 Phi->setDebugLoc(
SI->getDebugLoc());
2510 SI->replaceAllUsesWith(Phi);
2511 SI->eraseFromParent();
2556 Opts.simple_loop_unswitch_estimate_profile
2566 GuardedBlock->
setName(
"guarded");
2617 return L.contains(SuccBB);
2619 NumCostMultiplierSkipped++;
2630 auto *ParentL = L.getParentLoop();
2631 int ParentLoopSizeMultiplier = 1;
2633 ParentLoopSizeMultiplier = std::max<int>(
2634 ParentL->getNumBlocks() / Opts.unswitch_parent_blocks_div, 1);
2641 int UnswitchedClones = 0;
2642 for (
const auto &Candidate : UnswitchCandidates) {
2645 bool SkipExitingSuccessors = DT.
dominates(CondBlock, Latch);
2651 if (!SkipExitingSuccessors)
2655 int NonExitingSuccessors =
2657 [SkipExitingSuccessors, &L](
const BasicBlock *SuccBB) {
2658 return !SkipExitingSuccessors || L.contains(SuccBB);
2660 UnswitchedClones +=
Log2_32(NonExitingSuccessors);
2668 unsigned ClonesPower = std::max(
2669 UnswitchedClones - Opts.unswitch_num_initial_unscaled_candidates, 0);
2672 int SiblingsMultiplier =
2673 std::max((ParentL ? SiblingsCount
2674 : SiblingsCount / Opts.unswitch_siblings_toplevel_div),
2679 if (ClonesPower >
Log2_32(Opts.unswitch_threshold) ||
2680 SiblingsMultiplier > Opts.unswitch_threshold ||
2681 ParentLoopSizeMultiplier > Opts.unswitch_threshold)
2682 CostMultiplier = Opts.unswitch_threshold;
2684 CostMultiplier = std::min(SiblingsMultiplier * (1 << ClonesPower),
2685 Opts.unswitch_threshold);
2688 <<
" (siblings " << SiblingsMultiplier <<
" * parent size "
2689 << ParentLoopSizeMultiplier <<
" * clones "
2690 << (1 << ClonesPower) <<
")"
2691 <<
" for unswitch candidate: " << TI <<
"\n");
2692 return CostMultiplier;
2696 const ScalarOptions &Opts,
2701 assert(UnswitchCandidates.
empty() &&
"Should be!");
2707 if (L.isLoopInvariant(
Cond)) {
2715 if (!Invariants.
empty())
2716 UnswitchCandidates.
push_back({
I, std::move(Invariants)});
2721 bool CollectGuards =
false;
2722 if (Opts.simple_loop_unswitch_guards) {
2724 L.getHeader()->getParent()->getParent(), Intrinsic::experimental_guard);
2725 if (GuardDecl && !GuardDecl->use_empty())
2726 CollectGuards =
true;
2729 for (
auto *BB : L.blocks()) {
2733 for (
auto &
I : *BB) {
2735 auto *
Cond =
SI->getCondition();
2737 if (
Cond->getType()->isIntegerTy(1) && !
SI->getType()->isIntegerTy(1))
2738 AddUnswitchCandidatesForInst(
SI,
Cond);
2739 }
else if (CollectGuards &&
isGuard(&
I)) {
2752 L.isLoopInvariant(
SI->getCondition()) && !BB->getUniqueSuccessor())
2758 if (!BI || BI->getSuccessor(0) == BI->getSuccessor(1))
2761 AddUnswitchCandidatesForInst(BI, BI->getCondition());
2766 bool HeaderCondGuaranteedToExecute =
2768 Header->begin(), Header->getTerminator()->getIterator());
2769 if (MSSAU && HeaderCondGuaranteedToExecute &&
2771 !
any_of(UnswitchCandidates, [&L](
auto &TerminatorAndInvariants) {
2772 return TerminatorAndInvariants.TI == L.getHeader()->getTerminator();
2776 L, Opts.simple_loop_unswitch_memoryssa_threshold, *MSSA,
AA)) {
2778 dbgs() <<
"simple-loop-unswitch: Found partially invariant condition "
2779 << *Info->InstToDuplicate[0] <<
"\n");
2780 PartialIVInfo = *Info;
2781 PartialIVCondBranch = Header->getTerminator();
2785 {Header->getTerminator(), std::move(ValsToDuplicate)});
2788 return !UnswitchCandidates.
empty();
2803 if (!L.contains(IfTrue)) {
2809 if (L.isLoopInvariant(
LHS)) {
2817 RHS = ConstantInt::get(
2829 if (L.isLoopInvariant(
LHS) || !L.isLoopInvariant(
RHS))
2835 if (!L.contains(IfTrue) || L.contains(IfFalse))
2839 if (L.getHeader() == IfTrue)
2855 Opts.simple_loop_unswitch_inject_invariant_condition_hotness_threshold;
2858 assert(Weights.
size() == 2 &&
"Unexpected profile data!");
2860 auto Num = Weights[Idx];
2861 auto Denom = Weights[0] + Weights[1];
2863 if (Denom == 0 || Num > Denom)
2866 if (LikelyTaken > ActualTaken)
2889static NonTrivialUnswitchCandidate
2893 assert(Candidate.hasPendingInjection() &&
"Nothing to inject!");
2894 BasicBlock *Preheader = L.getLoopPreheader();
2895 assert(Preheader &&
"Loop is not in simplified form?");
2897 "Unswitching branch of inner loop!");
2899 auto Pred = Candidate.PendingInjection->Pred;
2900 auto *
LHS = Candidate.PendingInjection->LHS;
2901 auto *
RHS = Candidate.PendingInjection->RHS;
2902 auto *InLoopSucc = Candidate.PendingInjection->InLoopSucc;
2905 auto *OutOfLoopSucc = InLoopSucc == TI->getSuccessor(0) ? TI->getSuccessor(1)
2906 : TI->getSuccessor(0);
2908 assert(L.contains(InLoopSucc) &&
"Not supported yet!");
2909 assert(!L.contains(OutOfLoopSucc) &&
"Not supported yet!");
2910 auto &Ctx = BB->getContext();
2914 if (
LHS->getType() !=
RHS->getType()) {
2915 if (
LHS->getType()->getIntegerBitWidth() <
2916 RHS->getType()->getIntegerBitWidth())
2917 LHS = Builder.CreateZExt(
LHS,
RHS->getType(),
LHS->getName() +
".wide");
2919 RHS = Builder.CreateZExt(
RHS,
LHS->getType(),
RHS->getName() +
".wide");
2923 auto *InjectedCond =
2928 BB->getParent(), InLoopSucc);
2929 Builder.SetInsertPoint(TI);
2931 Builder.CreateCondBr(InjectedCond, InLoopSucc, CheckBlock);
2935 Builder.SetInsertPoint(CheckBlock);
2936 Builder.CreateCondBr(TI->getCondition(), TI->getSuccessor(0),
2937 TI->getSuccessor(1),
2938 TI->getMetadata(LLVMContext::MD_prof));
2939 TI->eraseFromParent();
2942 for (
auto &
I : *InLoopSucc) {
2946 auto *Inc = PN->getIncomingValueForBlock(BB);
2947 PN->addIncoming(Inc, CheckBlock);
2949 OutOfLoopSucc->replacePhiUsesWith(BB, CheckBlock);
2961 L.addBasicBlockToLoop(CheckBlock, LI);
2973 LLVM_DEBUG(
dbgs() <<
"Injected a new loop-invariant branch " << *InvariantBr
2974 <<
" and considering it for unswitching.");
2975 ++NumInvariantConditionsInjected;
2976 return NonTrivialUnswitchCandidate(InvariantBr, { InjectedCond },
2998 if (Compares.
size() < 2)
3006 InjectedInvariant ToInject(NonStrictPred,
LHS,
RHS, InLoopSucc);
3007 NonTrivialUnswitchCandidate Candidate(Prev->Term, { LHS, RHS },
3008 std::nullopt, std::move(ToInject));
3009 UnswitchCandidates.
push_back(std::move(Candidate));
3030 const ScalarOptions &Opts,
3035 if (!Opts.simple_loop_unswitch_inject_invariant_conditions)
3040 auto *Latch = L.getLoopLatch();
3044 assert(L.getLoopPreheader() &&
"Must have a preheader!");
3049 for (
auto *DTN = DT.
getNode(Latch); L.contains(DTN->getBlock());
3050 DTN = DTN->getIDom()) {
3053 BasicBlock *IfTrue =
nullptr, *IfFalse =
nullptr;
3054 auto *BB = DTN->getBlock();
3058 auto *Term = BB->getTerminator();
3062 if (!
LHS->getType()->isIntegerTy())
3074 LHS = Zext->getOperand(0);
3075 CandidatesULT[
LHS].push_back(
Desc);
3079 for (
auto &It : CandidatesULT)
3087 if (!L.isSafeToCloneConditionally(DT))
3102 L.getUniqueExitBlocks(ExitBlocks);
3107 for (
auto *ExitBB : ExitBlocks) {
3108 auto It = ExitBB->getFirstNonPHIIt();
3110 LLVM_DEBUG(
dbgs() <<
"Cannot unswitch because of cleanuppad/catchswitch "
3120 const ScalarOptions &Opts,
3139 L.getHeader()->getParent()->hasMinSize()
3143 for (
auto *BB : L.blocks()) {
3145 for (
auto &
I : *BB) {
3150 assert(Cost >= 0 &&
"Must not have negative costs!");
3152 assert(LoopCost >= 0 &&
"Must not have negative loop costs!");
3153 BBCostMap[BB] = Cost;
3186 if (!Visited.
insert(SuccBB).second)
3194 if (!FullUnswitch) {
3198 if (SuccBB == BI.getSuccessor(1))
3201 if (SuccBB == BI.getSuccessor(0))
3204 SuccBB == BI.getSuccessor(0)) ||
3206 SuccBB == BI.getSuccessor(1)))
3214 if (SuccBB->getUniquePredecessor() ||
3216 return PredBB == &BB || DT.
dominates(SuccBB, PredBB);
3219 assert(Cost <= LoopCost &&
3220 "Non-duplicated cost should never exceed total loop cost!");
3229 int SuccessorsCount =
isGuard(&TI) ? 2 : Visited.
size();
3230 assert(SuccessorsCount > 1 &&
3231 "Cannot unswitch a condition without multiple distinct successors!");
3232 return (LoopCost - Cost) * (SuccessorsCount - 1);
3235 std::optional<NonTrivialUnswitchCandidate> Best;
3236 for (
auto &Candidate : UnswitchCandidates) {
3241 !BI || Candidate.hasPendingInjection() ||
3242 (Invariants.
size() == 1 &&
3244 InstructionCost CandidateCost = ComputeUnswitchedCost(TI, FullUnswitch);
3247 if (Opts.enable_unswitch_cost_multiplier) {
3249 UnswitchCandidates);
3251 (CostMultiplier > 0 && CostMultiplier <= Opts.unswitch_threshold) &&
3252 "cost multiplier needs to be in the range of 1..UnswitchThreshold");
3253 CandidateCost *= CostMultiplier;
3255 <<
" (multiplier: " << CostMultiplier <<
")"
3256 <<
" for unswitch candidate: " << TI <<
"\n");
3259 <<
" for unswitch candidate: " << TI <<
"\n");
3262 if (!Best || CandidateCost < Best->Cost) {
3264 Best->Cost = CandidateCost;
3267 assert(Best &&
"Must be!");
3281 if (!Opts.freeze_loop_unswitch_cond)
3294 Cond, &AC, L.getLoopPreheader()->getTerminator(), &DT);
3309 PartialIVCondBranch, L, LI,
AA, MSSAU);
3312 PartialIVInfo, PartialIVCondBranch,
3313 L, DT, LI,
AA, MSSAU);
3315 if (UnswitchCandidates.
empty())
3319 dbgs() <<
"Considering " << UnswitchCandidates.
size()
3320 <<
" non-trivial loop invariant conditions for unswitching.\n");
3323 Opts, UnswitchCandidates, L, DT, LI, AC,
TTI, PartialIVInfo);
3325 assert(Best.TI &&
"Failed to find loop unswitch candidate");
3326 assert(Best.Cost &&
"Failed to compute cost");
3328 if (*Best.Cost >= Opts.unswitch_threshold) {
3329 LLVM_DEBUG(
dbgs() <<
"Cannot unswitch, lowest cost found: " << *Best.Cost
3334 bool InjectedCondition =
false;
3335 if (Best.hasPendingInjection()) {
3337 InjectedCondition =
true;
3339 assert(!Best.hasPendingInjection() &&
3340 "All injections should have been done by now!");
3342 if (Best.TI != PartialIVCondBranch)
3352 SI->getCondition(), &AC, L.getLoopPreheader()->getTerminator(), &DT);
3362 LLVM_DEBUG(
dbgs() <<
" Unswitching non-trivial (cost = " << Best.Cost
3363 <<
") terminator: " << *Best.TI <<
"\n");
3365 PartialIVInfo, DT, LI, AC, SE, MSSAU,
3366 LoopUpdater, InsertFreeze, InjectedCondition);
3396 const ScalarOptions &Opts =
3397 L.getHeader()->getContext().getLibraryOptions().get<ScalarOptions>();
3398 assert(L.isRecursivelyLCSSAForm(DT, LI) &&
3399 "Loops must be in LCSSA form before unswitching.");
3402 if (!L.isLoopSimplifyForm())
3415 const Function *
F = L.getHeader()->getParent();
3428 bool ContinueWithNonTrivial = Opts.enable_nontrivial_unswitch ||
3429 (NonTrivial && !
TTI.hasBranchDivergence(
F));
3430 if (!ContinueWithNonTrivial)
3434 if (
F->hasOptSize())
3460 Function &
F = *L.getHeader()->getParent();
3462 LLVM_DEBUG(
dbgs() <<
"Unswitching loop in " <<
F.getName() <<
": " << L
3465 std::optional<MemorySSAUpdater> MSSAU;
3472 &AR.
SE, MSSAU ? &*MSSAU :
nullptr, U))
3478#ifdef EXPENSIVE_CHECKS
3492 static_cast<PassInfoMixin<SimpleLoopUnswitchPass> *
>(
this)->
printPipeline(
3493 OS, MapClassName2PassName);
3496 OS << (NonTrivial ?
"" :
"no-") <<
"nontrivial;";
3497 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 buildPartialUnswitchConditionalBranch(const ScalarOptions &Opts, BasicBlock &BB, ArrayRef< Value * > Invariants, bool Direction, BasicBlock &UnswitchedSucc, BasicBlock &NormalSucc, 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 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 rebuildLoopAfterUnswitch(Loop &L, DominatorTree &DT, LoopInfo &LI, SmallVectorImpl< Loop * > &HoistedLoops, ScalarEvolution *SE, LPMUpdater &LoopUpdater)
Rebuild the loop forest after unswitching removes some subset of blocks and edges.
static CondBrInst * turnGuardIntoBranch(const ScalarOptions &Opts, 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 void rewritePHINodesForUnswitchedExitBlock(const Loop &L, BasicBlock &UnswitchedBB, BasicBlock &OldExitingBB, BasicBlock &OldPH)
Rewrite the PHI nodes in an unswitched loop exit basic block.
static bool isSafeForNoNTrivialUnswitching(const DominatorTree &DT, Loop &L, LoopInfo &LI)
void postUnswitch(Loop &L, LPMUpdater &U, StringRef LoopName, bool CurrentLoopValid, bool PartiallyInvariant, bool InjectedCondition, ArrayRef< Loop * > NewLoops)
static bool unswitchAllTrivialConditions(const ScalarOptions &Opts, 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 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 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 void replaceLoopInvariantUses(const Loop &L, Value *Invariant, Constant &Replacement)
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 NonTrivialUnswitchCandidate findBestNonTrivialUnswitchCandidate(const ScalarOptions &Opts, ArrayRef< NonTrivialUnswitchCandidate > UnswitchCandidates, const Loop &L, const DominatorTree &DT, const LoopInfo &LI, AssumptionCache &AC, const TargetTransformInfo &TTI, const IVConditionInfo &PartialIVInfo)
static int calculateUnswitchCostMultiplier(const ScalarOptions &Opts, 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 bool isLoopHeaderPHI(const Loop &L, const Value *V)
Return true if V is a PHI node in the header of L.
static void canonicalizeForInvariantConditionInjection(CmpPredicate &Pred, Value *&LHS, Value *&RHS, BasicBlock *&IfTrue, BasicBlock *&IfFalse, const Loop &L)
Tries to canonicalize condition described by:
static bool areLoopExitPHIsTrivial(const Loop &L, const BasicBlock &ExitingBB, const BasicBlock &ExitBB, bool AllowHeaderPHIs=false)
Check that all the LCSSA PHI nodes in ExitBB have trivial incoming values along the edge from Exiting...
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...
bool shouldTryInjectBasingOnMetadata(const ScalarOptions &Opts, const CondBrInst *BI, const BasicBlock *TakenSucc)
Returns true, if metadata on BI allows us to optimize branching into TakenSucc via injection of invar...
static bool unswitchTrivialBranch(const ScalarOptions &Opts, Loop &L, CondBrInst &BI, DominatorTree &DT, LoopInfo &LI, ScalarEvolution *SE, MemorySSAUpdater *MSSAU)
Unswitch a trivial branch if the condition is loop 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 collectUnswitchCandidatesWithInjections(const ScalarOptions &Opts, 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 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 rewritePHINodesForExitAndUnswitchedBlocks(const Loop &L, 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 void unswitchNontrivialInvariants(const ScalarOptions &Opts, 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 unswitchBestCondition(const ScalarOptions &Opts, Loop &L, DominatorTree &DT, LoopInfo &LI, AssumptionCache &AC, AAResults &AA, TargetTransformInfo &TTI, ScalarEvolution *SE, MemorySSAUpdater *MSSAU, LPMUpdater &LoopUpdater)
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 Value * getLoopEntryValue(const Loop &L, Value *V)
Return the value V holds on entry to L.
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 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 bool collectUnswitchCandidates(const ScalarOptions &Opts, SmallVectorImpl< NonTrivialUnswitchCandidate > &UnswitchCandidates, IVConditionInfo &PartialIVInfo, Instruction *&PartialIVCondBranch, const Loop &L, const LoopInfo &LI, AAResults &AA, const MemorySSAUpdater *MSSAU)
static bool shouldInsertFreeze(const ScalarOptions &Opts, Loop &L, Instruction &TI, DominatorTree &DT, AssumptionCache &AC)
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()
size_type count(const_arg_type_t< KeyT > Val) const
Return 1 if the specified key is in the map, 0 otherwise.
iterator find(const_arg_type_t< KeyT > Val)
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.
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 override
Returns true if the instruction in a loop is guaranteed to execute at least once (under the assumptio...
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.
SmallVector< std::pair< LoopT *, BlockT * >, 4 > recompute(const DominatorTreeBase< BlockT, false > &DomTree)
Rebuild the loop forest from the CFG, refilling the existing loop object of every block that still he...
void addTopLevelLoop(LoopT *New)
This adds the specified loop to the collection of top-level loops.
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.
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.
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.
is_zero< true > m_Zero()
Match any null constant or a vector with all elements equal to 0.
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 ?
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.
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.
auto successors(const MachineBasicBlock *BB)
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.
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)
bool containsIrreducibleCFG(RPOTraversalT &RPOTraversal, const LoopInfoT &LI)
Return true if the control flow in RPOTraversal is irreducible.
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.
auto make_first_range(ContainerTy &&c)
Given a container of pairs, return a range over the first elements.
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
LLVM_ABI bool isGuaranteedToTransferExecutionToSuccessor(const Instruction *I)
Return true if this function can prove that the instruction I will always transfer execution to one o...
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.
constexpr auto seq(T Begin, T End)
Iterate over an integral type from Begin up to - but not including - End.
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)
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
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...
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.
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.
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