36#define DEBUG_TYPE "loop-simplifycfg"
42 "Number of terminators folded to unconditional branches");
44 "Number of loop blocks deleted");
46 "Number of loop exiting edges deleted");
54 if (BI->getSuccessor(0) == BI->getSuccessor(1))
55 return BI->getSuccessor(0);
59 return Cond->isZero() ? BI->getSuccessor(1) : BI->getSuccessor(0);
66 for (
auto Case :
SI->cases())
67 if (Case.getCaseValue() == CI)
68 return Case.getCaseSuccessor();
69 return SI->getDefaultDest();
77 Loop *LastLoop =
nullptr) {
79 "First loop is supposed to be inside of last loop!");
80 for (
Loop *Current = FirstLoop; Current != LastLoop;
82 Current->removeBlockFromLoop(BB);
89 Loop *Innermost =
nullptr;
92 while (BBL && !BBL->
contains(L.getHeader()))
107class ConstantTerminatorFoldingImpl {
113 MemorySSAUpdater *MSSAU;
119 bool HasIrreducibleCFG =
false;
128 bool DeleteCurrentLoop =
false;
130 bool HasIndirectEntry =
false;
134 SmallPtrSet<BasicBlock *, 8> LiveLoopBlocks;
137 SmallVector<BasicBlock *, 8> DeadLoopBlocks;
140 SmallPtrSet<BasicBlock *, 8> LiveExitBlocks;
143 SmallVector<BasicBlock *, 8> DeadExitBlocks;
145 SmallPtrSet<BasicBlock *, 8> BlocksInLoopAfterFolding;
149 SmallVector<BasicBlock *, 8> FoldCandidates;
152 dbgs() <<
"Constant terminator folding for loop " << L <<
"\n";
153 dbgs() <<
"After terminator constant-folding, the loop will";
154 if (!DeleteCurrentLoop)
156 dbgs() <<
" be destroyed\n";
157 auto PrintOutVector = [&](
const char *Message,
158 const SmallVectorImpl<BasicBlock *> &S) {
159 dbgs() << Message <<
"\n";
160 for (
const BasicBlock *BB : S)
161 dbgs() <<
"\t" << BB->getName() <<
"\n";
163 auto PrintOutSet = [&](
const char *Message,
164 const SmallPtrSetImpl<BasicBlock *> &S) {
165 dbgs() << Message <<
"\n";
166 for (
const BasicBlock *BB : S)
167 dbgs() <<
"\t" << BB->getName() <<
"\n";
169 PrintOutVector(
"Blocks in which we can constant-fold terminator:",
171 PrintOutSet(
"Live blocks from the original loop:", LiveLoopBlocks);
172 PrintOutVector(
"Dead blocks from the original loop:", DeadLoopBlocks);
173 PrintOutSet(
"Live exit blocks:", LiveExitBlocks);
174 PrintOutVector(
"Dead exit blocks:", DeadExitBlocks);
175 if (!DeleteCurrentLoop)
176 PrintOutSet(
"The following blocks will still be part of the loop:",
177 BlocksInLoopAfterFolding);
181 bool hasIrreducibleCFG(LoopBlocksDFS &DFS) {
182 assert(DFS.isComplete() &&
"DFS is expected to be finished");
184 DenseMap<const BasicBlock *, unsigned> RPO;
185 unsigned Current = 0;
186 for (
auto I = DFS.beginRPO(),
E = DFS.endRPO();
I !=
E; ++
I)
189 for (
auto I = DFS.beginRPO(),
E = DFS.endRPO();
I !=
E; ++
I) {
192 if (L.contains(Succ) && !LI.isLoopHeader(Succ) && RPO[BB] > RPO[Succ])
205 assert(DFS.isComplete() &&
"DFS is expected to be finished");
214 if (hasIrreducibleCFG(DFS)) {
215 HasIrreducibleCFG =
true;
222 if (!L.getLoopPreheader()) {
224 [&](BasicBlock *Pred) {
225 return isa<IndirectBrInst>(Pred->getTerminator());
227 "Loop should have preheader if it is not entered indirectly");
228 HasIndirectEntry =
true;
233 LiveLoopBlocks.insert(L.getHeader());
234 for (
auto I = DFS.beginRPO(),
E = DFS.endRPO();
I !=
E; ++
I) {
238 if (!LiveLoopBlocks.count(BB)) {
239 DeadLoopBlocks.push_back(BB);
249 bool TakeFoldCandidate = TheOnlySucc && LI.getLoopFor(BB) == &L;
250 if (TakeFoldCandidate)
251 FoldCandidates.push_back(BB);
255 if (!TakeFoldCandidate || TheOnlySucc == Succ) {
256 if (L.contains(Succ))
257 LiveLoopBlocks.insert(Succ);
259 LiveExitBlocks.insert(Succ);
265 assert(L.getNumBlocks() == LiveLoopBlocks.size() + DeadLoopBlocks.size() &&
266 "Malformed block sets?");
271 SmallVector<BasicBlock *, 8> ExitBlocks;
272 L.getExitBlocks(ExitBlocks);
273 SmallPtrSet<BasicBlock *, 8> UniqueDeadExits;
274 for (
auto *ExitBlock : ExitBlocks)
275 if (!LiveExitBlocks.count(ExitBlock) &&
276 UniqueDeadExits.
insert(ExitBlock).second &&
278 [
this](BasicBlock *Pred) {
return L.contains(Pred); }))
279 DeadExitBlocks.push_back(ExitBlock);
284 if (!LiveLoopBlocks.count(From))
287 return !TheOnlySucc || TheOnlySucc == To || LI.getLoopFor(From) != &L;
291 DeleteCurrentLoop = !IsEdgeLive(L.getLoopLatch(), L.getHeader());
295 if (DeleteCurrentLoop)
300 BlocksInLoopAfterFolding.insert(L.getLoopLatch());
307 return BlocksInLoopAfterFolding.count(Succ) && IsEdgeLive(BB, Succ);
310 for (
auto I = DFS.beginPostorder(),
E = DFS.endPostorder();
I !=
E; ++
I) {
312 if (BlockIsInLoop(BB))
313 BlocksInLoopAfterFolding.insert(BB);
316 assert(BlocksInLoopAfterFolding.count(L.getHeader()) &&
317 "Header not in loop?");
318 assert(BlocksInLoopAfterFolding.size() <= LiveLoopBlocks.size() &&
319 "All blocks that stay in loop should be live!");
357 void handleDeadExits() {
359 if (DeadExitBlocks.empty())
369 SwitchInst *DummySwitch =
370 Builder.CreateSwitch(Builder.getInt32(0), NewPreheader);
373 unsigned DummyIdx = 1;
374 for (BasicBlock *BB : DeadExitBlocks) {
377 SmallVector<Instruction *, 4> DeadInstructions(
381 DeadInstructions.emplace_back(LandingPad);
383 for (Instruction *
I : DeadInstructions) {
386 I->eraseFromParent();
389 assert(DummyIdx != 0 &&
"Too many dead exits!");
390 DummySwitch->
addCase(Builder.getInt32(DummyIdx++), BB);
391 DTUpdates.push_back({DominatorTree::Insert, Preheader, BB});
392 ++NumLoopExitsDeleted;
399 if (DummySwitch->
getParent()->getParent()->hasProfileData()) {
400 SmallVector<uint32_t> DummyBranchWeights(1 + DummySwitch->
getNumCases());
402 DummyBranchWeights[0] = 1;
406 assert(L.getLoopPreheader() == NewPreheader &&
"Malformed CFG?");
407 if (Loop *OuterLoop = LI.getLoopFor(Preheader)) {
416 if (StillReachable != OuterLoop) {
417 LI.changeLoopFor(NewPreheader, StillReachable);
419 for (
auto *BB : L.blocks())
421 OuterLoop->removeChildLoop(&L);
425 LI.addTopLevelLoop(&L);
430 Loop *FixLCSSALoop = OuterLoop;
433 assert(FixLCSSALoop &&
"Should be a loop!");
436 MSSAU->applyUpdates(DTUpdates, DT,
true);
438 DTU.applyUpdates(DTUpdates);
441 SE.forgetBlockAndLoopDispositions();
447 MSSAU->applyUpdates(DTUpdates, DT,
true);
450 MSSAU->getMemorySSA()->verifyMemorySSA();
456 void deleteDeadLoopBlocks() {
458 SmallSetVector<BasicBlock *, 8> DeadLoopBlocksSet(DeadLoopBlocks.begin(),
459 DeadLoopBlocks.end());
460 MSSAU->removeBlocks(DeadLoopBlocksSet);
469 for (
auto *BB : DeadLoopBlocks)
470 if (LI.isLoopHeader(BB)) {
471 assert(LI.getLoopFor(BB) != &L &&
"Attempt to remove current loop!");
472 Loop *
DL = LI.getLoopFor(BB);
473 if (!
DL->isOutermost()) {
474 for (
auto *PL =
DL->getParentLoop(); PL; PL =
PL->getParentLoop())
475 for (
auto *BB :
DL->getBlocks())
476 PL->removeBlockFromLoop(BB);
477 DL->getParentLoop()->removeChildLoop(
DL);
478 LI.addTopLevelLoop(
DL);
483 for (
auto *BB : DeadLoopBlocks) {
484 assert(BB != L.getHeader() &&
485 "Header of the current loop cannot be dead!");
492 DTU.applyUpdates(DTUpdates);
494 for (
auto *BB : DeadLoopBlocks)
497 NumLoopBlocksDeleted += DeadLoopBlocks.size();
502 void foldTerminators() {
503 for (BasicBlock *BB : FoldCandidates) {
504 assert(LI.getLoopFor(BB) == &L &&
"Should be a loop block!");
506 assert(TheOnlySucc &&
"Should have one live successor!");
509 <<
" with an unconditional branch to the block "
510 << TheOnlySucc->
getName() <<
"\n");
512 SmallPtrSet<BasicBlock *, 2> DeadSuccessors;
514 unsigned TheOnlySuccDuplicates = 0;
516 if (Succ != TheOnlySucc) {
517 DeadSuccessors.
insert(Succ);
520 bool PreserveLCSSAPhi = !L.contains(Succ);
523 MSSAU->removeEdge(BB, Succ);
525 ++TheOnlySuccDuplicates;
527 assert(TheOnlySuccDuplicates > 0 &&
"Should be!");
531 bool PreserveLCSSAPhi = !L.contains(TheOnlySucc);
532 for (
unsigned Dup = 1; Dup < TheOnlySuccDuplicates; ++Dup)
534 if (MSSAU && TheOnlySuccDuplicates > 1)
535 MSSAU->removeDuplicatePhiEdgesBetween(BB, TheOnlySucc);
539 Builder.SetInsertPoint(Term);
540 Builder.CreateBr(TheOnlySucc);
541 Term->eraseFromParent();
543 for (
auto *DeadSucc : DeadSuccessors)
544 DTUpdates.push_back({DominatorTree::Delete, BB, DeadSucc});
546 ++NumTerminatorsFolded;
551 ConstantTerminatorFoldingImpl(Loop &L, LoopInfo &LI, DominatorTree &DT,
553 MemorySSAUpdater *MSSAU)
554 : L(L), LI(LI), DT(DT), SE(SE), MSSAU(MSSAU), DFS(&L),
555 DTU(DT, DomTreeUpdater::UpdateStrategy::Eager) {}
557 assert(L.getLoopLatch() &&
"Should be single latch!");
565 LLVM_DEBUG(
dbgs() <<
"In function " << Header->getParent()->getName()
568 if (HasIrreducibleCFG) {
569 LLVM_DEBUG(
dbgs() <<
"Loops with irreducible CFG are not supported!\n");
573 if (HasIndirectEntry) {
574 LLVM_DEBUG(
dbgs() <<
"Loops which can be entered indirectly are not"
580 if (FoldCandidates.empty()) {
582 dbgs() <<
"No constant terminator folding candidates found in loop "
583 << Header->getName() <<
"\n");
588 if (DeleteCurrentLoop) {
591 <<
"Give up constant terminator folding in loop " << Header->getName()
592 <<
": we don't currently support deletion of the current loop.\n");
598 if (BlocksInLoopAfterFolding.size() + DeadLoopBlocks.size() !=
601 dbgs() <<
"Give up constant terminator folding in loop "
602 << Header->getName() <<
": we don't currently"
603 " support blocks that are not dead, but will stop "
604 "being a part of the loop after constant-folding.\n");
611 if (!DeadExitBlocks.empty() && !L.isLCSSAForm(DT,
false)) {
612 assert(L.isLCSSAForm(DT,
true) &&
613 "LCSSA broken not by tokens?");
614 LLVM_DEBUG(
dbgs() <<
"Give up constant terminator folding in loop "
616 <<
": tokens uses potentially break LCSSA form.\n");
620 SE.forgetTopmostLoop(&L);
625 <<
" terminators in loop " << Header->getName() <<
"\n");
627 if (!DeadLoopBlocks.empty())
628 SE.forgetBlockAndLoopDispositions();
634 if (!DeadLoopBlocks.empty()) {
636 <<
" dead blocks in loop " << Header->getName() <<
"\n");
637 deleteDeadLoopBlocks();
640 DTU.applyUpdates(DTUpdates);
645 MSSAU->getMemorySSA()->verifyMemorySSA();
649#if defined(EXPENSIVE_CHECKS)
650 assert(DT.verify(DominatorTree::VerificationLevel::Full) &&
651 "DT broken after transform!");
653 assert(DT.verify(DominatorTree::VerificationLevel::Fast) &&
654 "DT broken after transform!");
656 assert(DT.isReachableFromEntry(Header));
663 bool foldingBreaksCurrentLoop()
const {
664 return DeleteCurrentLoop;
674 bool &IsLoopDeleted) {
680 if (!L.getLoopLatch())
683 ConstantTerminatorFoldingImpl
BranchFolder(L, LI, DT, SE, MSSAU);
698 for (
auto &
Block : Blocks) {
706 if (!Pred || !Pred->getSingleSuccessor() || LI.
getLoopFor(Pred) != &L)
726 bool &IsLoopDeleted) {
747 std::optional<MemorySSAUpdater> MSSAU;
750 bool DeleteCurrentLoop =
false;
755 if (DeleteCurrentLoop)
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
This header provides classes for managing a pipeline of passes over loops in LLVM IR.
static BasicBlock * getOnlyLiveSuccessor(BasicBlock *BB)
If BB is a switch or a conditional branch, but only one of its successors can be reached from this bl...
static bool constantFoldTerminators(Loop &L, DominatorTree &DT, LoopInfo &LI, ScalarEvolution &SE, MemorySSAUpdater *MSSAU, bool &IsLoopDeleted)
Turn branches and switches with known constant conditions into unconditional branches.
static Loop * getInnermostLoopFor(SmallPtrSetImpl< BasicBlock * > &BBs, Loop &L, LoopInfo &LI)
Find innermost loop that contains at least one block from BBs and contains the header of loop L.
static bool mergeBlocksIntoPredecessors(Loop &L, DominatorTree &DT, LoopInfo &LI, MemorySSAUpdater *MSSAU, ScalarEvolution &SE)
static bool simplifyLoopCFG(Loop &L, DominatorTree &DT, LoopInfo &LI, ScalarEvolution &SE, MemorySSAUpdater *MSSAU, bool &IsLoopDeleted)
static cl::opt< bool > EnableTermFolding("enable-loop-simplifycfg-term-folding", cl::init(true))
static void removeBlockFromLoops(BasicBlock *BB, Loop *FirstLoop, Loop *LastLoop=nullptr)
Removes BB from all loops from [FirstLoop, LastLoop) in parent chain.
This file exposes an interface to building/using memory SSA to walk memory instructions using a use/d...
This file contains the declarations for profiling metadata utility functions.
const SmallVectorImpl< MachineOperand > & Cond
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)
LLVM Basic Block Representation.
iterator_range< const_phi_iterator > phis() const
Returns a range that iterates over the phis in the basic block.
LLVM_ABI InstListType::const_iterator getFirstNonPHIIt() const
Returns an iterator to the first instruction in this block that is not a PHINode instruction.
LLVM_ABI const BasicBlock * getSinglePredecessor() const
Return the predecessor of this block if it has a single predecessor block.
LLVM_ABI LLVMContext & getContext() const
Get the context in which this basic block 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.
Conditional Branch instruction.
This is the shared class of boolean and integer constants.
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
LLVM_ABI InstListType::iterator eraseFromParent()
This method unlinks 'this' from the containing basic block and deletes it.
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.
BlockT * getHeader() const
unsigned getLoopDepth() const
Return the nesting level of this loop.
void addChildLoop(LoopT *NewChild)
Add the specified loop to be a child of this loop.
LoopT * getParentLoop() const
Return the parent loop if it exists or nullptr for top level loops.
LoopT * getLoopFor(const BlockT *BB) const
Return the inner most loop that BB lives in.
LLVM_ABI PreservedAnalyses run(Loop &L, LoopAnalysisManager &AM, LoopStandardAnalysisResults &AR, LPMUpdater &U)
Represents a single loop in the control flow graph.
LLVM_ABI instr_iterator erase(instr_iterator I)
Remove an instruction from the instruction list and delete it.
An analysis that produces MemorySSA for a function.
MemorySSA * getMemorySSA() const
Get handle on MemorySSA.
LLVM_ABI void verifyMemorySSA(VerificationLevel=VerificationLevel::Fast) const
Verify that MemorySSA is self consistent (IE definitions dominate all uses, uses appear in the right ...
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.
The main scalar evolution driver.
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.
A templated base class for SmallPtrSet which provides the typesafe interface that is common across al...
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
LLVM_ABI void addCase(ConstantInt *OnVal, BasicBlock *Dest)
Add an entry to the switch instruction.
unsigned getNumCases() const
Return the number of 'cases' in this switch instruction, excluding the default case.
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
const ParentTy * getParent() const
@ BasicBlock
Various leaf nodes.
initializer< Ty > init(const Ty &Val)
DXILDebugInfoMap run(Module &M)
friend class Instruction
Iterator for Instructions in a `BasicBlock.
This is an optimization pass for GlobalISel generic memory operations.
void dump(const SparseBitVector< ElementSize > &LHS, raw_ostream &out)
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
LLVM_ABI void detachDeadBlocks(ArrayRef< BasicBlock * > BBs, SmallVectorImpl< DominatorTree::UpdateType > *Updates, bool KeepOneInputPHIs=false)
Replace contents of every block in BBs with single unreachable instruction.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
auto successors(const MachineBasicBlock *BB)
LLVM_ABI bool formLCSSARecursively(Loop &L, const DominatorTree &DT, const LoopInfo *LI, ScalarEvolution *SE)
Put a loop nest into LCSSA form.
auto cast_or_null(const Y &Val)
LLVM_ABI void setBranchWeights(Instruction &I, ArrayRef< uint32_t > Weights, bool IsExpected, bool ElideAllZero=false)
Create a new branch_weights metadata node and add or overwrite a prof metadata reference to instructi...
AnalysisManager< Loop, LoopStandardAnalysisResults & > LoopAnalysisManager
The loop analysis manager.
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
IRBuilder(LLVMContext &, FolderTy, InserterTy, MDNode *, ArrayRef< OperandBundleDef >) -> IRBuilder< FolderTy, InserterTy >
LLVM_ABI bool VerifyMemorySSA
Enables verification of MemorySSA.
LLVM_ABI bool MergeBlockIntoPredecessor(BasicBlock *BB, DomTreeUpdater *DTU=nullptr, LoopInfo *LI=nullptr, MemorySSAUpdater *MSSAU=nullptr, MemoryDependenceResults *MemDep=nullptr, bool PredecessorWithTwoSuccessors=false, DominatorTree *DT=nullptr)
Attempts to merge a block into its predecessor, if possible.
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 PreservedAnalyses getLoopPassPreservedAnalyses()
Returns the minimum set of Analyses that all loop passes must preserve.
auto predecessors(const MachineBasicBlock *BB)
iterator_range< pointer_iterator< WrappedIteratorT > > make_pointer_range(RangeT &&Range)
The adaptor from a function pass to a loop pass computes these analyses and makes them available to t...