LLVM 24.0.0git
GenericLoopInfoImpl.h
Go to the documentation of this file.
1//===- GenericLoopInfoImp.h - Generic Loop Info Implementation --*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This fle contains the implementation of GenericLoopInfo. It should only be
10// included in files that explicitly instantiate a GenericLoopInfo.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_SUPPORT_GENERICLOOPINFOIMPL_H
15#define LLVM_SUPPORT_GENERICLOOPINFOIMPL_H
16
17#include "llvm/ADT/DenseSet.h"
20#include "llvm/ADT/STLExtras.h"
22
23namespace llvm {
24
25//===----------------------------------------------------------------------===//
26// APIs for simple analysis of the loop. See header notes.
27
28/// getExitingBlocks - Return all blocks inside the loop that have successors
29/// outside of the loop. These are the blocks _inside of the current loop_
30/// which branch out. The returned list is always unique.
31///
32template <class BlockT, class LoopT>
34 SmallVectorImpl<BlockT *> &ExitingBlocks) const {
35 assert(!isInvalid() && "Loop not in a valid state!");
36 for (const auto BB : blocks())
37 for (auto *Succ : children<BlockT *>(BB))
38 if (!contains(Succ)) {
39 // Not in current loop? It must be an exit block.
40 ExitingBlocks.push_back(BB);
41 break;
42 }
43}
44
45/// getExitingBlock - If getExitingBlocks would return exactly one block,
46/// return that block. Otherwise return null.
47template <class BlockT, class LoopT>
49 assert(!isInvalid() && "Loop not in a valid state!");
50 auto notInLoop = [&](BlockT *BB) { return !contains(BB); };
51 auto isExitBlock = [&](BlockT *BB, bool AllowRepeats) -> BlockT * {
52 assert(!AllowRepeats && "Unexpected parameter value.");
53 // Child not in current loop? It must be an exit block.
54 return any_of(children<BlockT *>(BB), notInLoop) ? BB : nullptr;
55 };
56
58}
59
60/// getExitBlocks - Return all of the successor blocks of this loop. These
61/// are the blocks _outside of the current loop_ which are branched to.
62///
63template <class BlockT, class LoopT>
65 SmallVectorImpl<BlockT *> &ExitBlocks) const {
66 assert(!isInvalid() && "Loop not in a valid state!");
67 for (const auto BB : blocks())
68 for (auto *Succ : children<BlockT *>(BB))
69 if (!contains(Succ))
70 // Not in current loop? It must be an exit block.
71 ExitBlocks.push_back(Succ);
72}
73
74/// getExitBlock - If getExitBlocks would return exactly one block,
75/// return that block. Otherwise return null.
76template <class BlockT, class LoopT>
77std::pair<BlockT *, bool> getExitBlockHelper(const LoopBase<BlockT, LoopT> *L,
78 bool Unique) {
79 assert(!L->isInvalid() && "Loop not in a valid state!");
80 auto notInLoop = [&](BlockT *BB,
81 bool AllowRepeats) -> std::pair<BlockT *, bool> {
82 assert(AllowRepeats == Unique && "Unexpected parameter value.");
83 return {!L->contains(BB) ? BB : nullptr, false};
84 };
85 auto singleExitBlock = [&](BlockT *BB,
86 bool AllowRepeats) -> std::pair<BlockT *, bool> {
87 assert(AllowRepeats == Unique && "Unexpected parameter value.");
89 AllowRepeats);
90 };
91 return find_singleton_nested<BlockT>(L->blocks(), singleExitBlock, Unique);
92}
93
94template <class BlockT, class LoopT>
96 auto RC = getExitBlockHelper(&L, false);
97 if (RC.second)
98 // found multiple exit blocks
99 return false;
100 // return true if there is no exit block
101 return !RC.first;
102}
103
104/// getExitBlock - If getExitBlocks would return exactly one block,
105/// return that block. Otherwise return null.
106template <class BlockT, class LoopT>
108 return getExitBlockHelper(this, false).first;
109}
110
111template <class BlockT, class LoopT>
113 // Each predecessor of each exit block of a normal loop is contained
114 // within the loop.
115 SmallVector<BlockT *, 4> UniqueExitBlocks;
116 getUniqueExitBlocks(UniqueExitBlocks);
117 for (BlockT *EB : UniqueExitBlocks)
118 for (BlockT *Predecessor : inverse_children<BlockT *>(EB))
119 if (!contains(Predecessor))
120 return false;
121 // All the requirements are met.
122 return true;
123}
124
125// Helper function to get unique loop exits. Pred is a predicate pointing to
126// BasicBlocks in a loop which should be considered to find loop exits.
127template <class BlockT, class LoopT, typename PredicateT>
128void getUniqueExitBlocksHelper(const LoopT *L,
129 SmallVectorImpl<BlockT *> &ExitBlocks,
130 PredicateT Pred) {
131 assert(!L->isInvalid() && "Loop not in a valid state!");
133 auto Filtered = make_filter_range(L->blocks(), Pred);
134 for (BlockT *BB : Filtered)
135 for (BlockT *Successor : children<BlockT *>(BB))
136 if (!L->contains(Successor))
137 if (Visited.insert(Successor).second)
138 ExitBlocks.push_back(Successor);
139}
140
141template <class BlockT, class LoopT>
143 SmallVectorImpl<BlockT *> &ExitBlocks) const {
144 getUniqueExitBlocksHelper(this, ExitBlocks,
145 [](const BlockT *BB) { return true; });
146}
147
148template <class BlockT, class LoopT>
150 SmallVectorImpl<BlockT *> &ExitBlocks) const {
151 const BlockT *Latch = getLoopLatch();
152 assert(Latch && "Latch block must exists");
153 getUniqueExitBlocksHelper(this, ExitBlocks,
154 [Latch](const BlockT *BB) { return BB != Latch; });
155}
156
157template <class BlockT, class LoopT>
159 return getExitBlockHelper(this, true).first;
160}
161
162template <class BlockT, class LoopT>
163BlockT *
165 BlockT *Latch = L.getLoopLatch();
166 assert(Latch && "Latch block must exists");
167 auto IsExitBlock = [&L](BlockT *BB, bool AllowRepeats) -> BlockT * {
168 assert(!AllowRepeats && "Unexpected parameter value.");
169 return !L.contains(BB) ? BB : nullptr;
170 };
171 return find_singleton<BlockT>(children<BlockT *>(Latch), IsExitBlock);
172}
173
174/// getExitEdges - Return all pairs of (_inside_block_,_outside_block_).
175template <class BlockT, class LoopT>
177 const LoopT &L, SmallVectorImpl<Edge> &ExitEdges) const {
178 for (const auto BB : L.blocks())
179 for (auto *Succ : children<BlockT *>(BB))
180 if (!L.contains(Succ))
181 // Not in current loop? It must be an exit block.
182 ExitEdges.emplace_back(BB, Succ);
183}
184
185namespace detail {
186template <class BlockT>
187using has_hoist_check = decltype(&BlockT::isLegalToHoistInto);
188
189template <class BlockT>
191
192/// SFINAE functions that dispatch to the isLegalToHoistInto member function or
193/// return false, if it doesn't exist.
194template <class BlockT> bool isLegalToHoistInto(BlockT *Block) {
196 return Block->isLegalToHoistInto();
197 return false;
198}
199} // namespace detail
200
201/// getLoopPreheader - If there is a preheader for this loop, return it. A
202/// loop has a preheader if there is only one edge to the header of the loop
203/// from outside of the loop and it is legal to hoist instructions into the
204/// predecessor. If this is the case, the block branching to the header of the
205/// loop is the preheader node.
206///
207/// This method returns null if there is no preheader for the loop.
208///
209template <class BlockT, class LoopT>
211 assert(!isInvalid() && "Loop not in a valid state!");
212 // Keep track of nodes outside the loop branching to the header...
213 BlockT *Out = getLoopPredecessor();
214 if (!Out)
215 return nullptr;
216
217 // Make sure we are allowed to hoist instructions into the predecessor.
219 return nullptr;
220
221 // Make sure there is only one exit out of the preheader.
223 return nullptr; // Multiple exits from the block, must not be a preheader.
224
225 // The predecessor has exactly one successor, so it is a preheader.
226 return Out;
227}
228
229/// getLoopPredecessor - If the given loop's header has exactly one unique
230/// predecessor outside the loop, return it. Otherwise return null.
231/// This is less strict that the loop "preheader" concept, which requires
232/// the predecessor to have exactly one successor.
233///
234template <class BlockT, class LoopT>
236 assert(!isInvalid() && "Loop not in a valid state!");
237 // Keep track of nodes outside the loop branching to the header...
238 BlockT *Out = nullptr;
239
240 // Loop over the predecessors of the header node...
241 BlockT *Header = getHeader();
242 for (const auto Pred : inverse_children<BlockT *>(Header)) {
243 if (!contains(Pred)) { // If the block is not in the loop...
244 if (Out && Out != Pred)
245 return nullptr; // Multiple predecessors outside the loop
246 Out = Pred;
247 }
248 }
249
250 return Out;
251}
252
253/// getLoopLatch - If there is a single latch block for this loop, return it.
254/// A latch block is a block that contains a branch back to the header.
255template <class BlockT, class LoopT>
257 assert(!isInvalid() && "Loop not in a valid state!");
258 BlockT *Header = getHeader();
259 BlockT *Latch = nullptr;
260 for (const auto Pred : inverse_children<BlockT *>(Header)) {
261 if (contains(Pred)) {
262 if (Latch)
263 return nullptr;
264 Latch = Pred;
265 }
266 }
267
268 return Latch;
269}
270
271//===----------------------------------------------------------------------===//
272// APIs for updating loop information after changing the CFG
273//
274
275/// addBasicBlockToLoop - This method is used by other analyses to update loop
276/// information. NewBB is set to be a new member of the current loop.
277/// Because of this, it is added as a member of all parent loops, and is added
278/// to the specified LoopInfo object as being in the current basic block. It
279/// is not valid to replace the loop header with this method.
280///
281template <class BlockT, class LoopT>
283 BlockT *NewBB, LoopInfoBase<BlockT, LoopT> &LIB) {
284 assert(!isInvalid() && "Loop not in a valid state!");
285#ifndef NDEBUG
286 if (!getBlocks().empty()) {
287 auto SameHeader = LIB[getHeader()];
288 assert(contains(SameHeader) && getHeader() == SameHeader->getHeader() &&
289 "Incorrect LI specified for this loop!");
290 }
291#endif
292 assert(NewBB && "Cannot add a null basic block to the loop!");
293 assert(!LIB[NewBB] && "BasicBlock already in the loop!");
294
295 LoopT *L = static_cast<LoopT *>(this);
296
297 // Add the loop mapping to the LoopInfo object...
298 LIB.changeLoopFor(NewBB, L);
299
300 // Add the basic block to this loop and all parent loops...
301 while (L) {
302 L->addBlockEntry(NewBB);
303 L = L->getParentLoop();
304 }
305}
306
307/// replaceChildLoopWith - This is used when splitting loops up. It replaces
308/// the OldChild entry in our children list with NewChild, and updates the
309/// parent pointer of OldChild to be null and the NewChild to be this loop.
310/// This updates the loop depth of the new child.
311template <class BlockT, class LoopT>
313 LoopT *NewChild) {
314 assert(!isInvalid() && "Loop not in a valid state!");
315 assert(OldChild->ParentLoop == this && "This loop is already broken!");
316 assert(!NewChild->ParentLoop && "NewChild already has a parent!");
317 typename std::vector<LoopT *>::iterator I = find(SubLoops, OldChild);
318 assert(I != SubLoops.end() && "OldChild not in loop!");
319 *I = NewChild;
320 OldChild->ParentLoop = nullptr;
321 NewChild->ParentLoop = static_cast<LoopT *>(this);
322}
323
324/// verifyLoop - Verify loop structure
325template <class BlockT, class LoopT>
327 assert(!isInvalid() && "Loop not in a valid state!");
328#ifndef NDEBUG
329 assert(!getBlocks().empty() && "Loop header is missing");
330
331 // Setup for using a depth-first iterator to visit every block in the loop.
333 getExitBlocks(ExitBBs);
335 VisitSet.insert(ExitBBs.begin(), ExitBBs.end());
336
337 // Keep track of the BBs visited.
338 SmallPtrSet<BlockT *, 8> VisitedBBs;
339
340 // Check the individual blocks.
341 for (BlockT *BB : depth_first_ext(getHeader(), VisitSet)) {
343 [&](BlockT *B) { return contains(B); }) &&
344 "Loop block has no in-loop successors!");
345
347 [&](BlockT *B) { return contains(B); }) &&
348 "Loop block has no in-loop predecessors!");
349
350 SmallVector<BlockT *, 2> OutsideLoopPreds;
351 for (BlockT *B : inverse_children<BlockT *>(BB))
352 if (!contains(B))
353 OutsideLoopPreds.push_back(B);
354
355 if (BB == getHeader()) {
356 assert(!OutsideLoopPreds.empty() && "Loop is unreachable!");
357 } else if (!OutsideLoopPreds.empty()) {
358 // A non-header loop block shouldn't be reachable from outside the loop,
359 // though it is permitted if the predecessor is not itself actually
360 // reachable.
361 BlockT *EntryBB = &BB->getParent()->front();
362 for (BlockT *CB : depth_first(EntryBB))
363 for (unsigned i = 0, e = OutsideLoopPreds.size(); i != e; ++i)
364 assert(CB != OutsideLoopPreds[i] &&
365 "Loop has multiple entry points!");
366 }
367 assert(BB != &getHeader()->getParent()->front() &&
368 "Loop contains function entry block!");
369
370 VisitedBBs.insert(BB);
371 }
372
373 if (VisitedBBs.size() != getNumBlocks()) {
374 dbgs() << "The following blocks are unreachable in the loop: ";
375 for (auto *BB : getBlocks()) {
376 if (!VisitedBBs.count(BB)) {
377 dbgs() << *BB << "\n";
378 }
379 }
380 assert(false && "Unreachable block in loop");
382
383 // Check the subloops.
384 for (iterator I = begin(), E = end(); I != E; ++I)
385 // Each block in each subloop should be contained within this loop.
386 for (block_iterator BI = (*I)->block_begin(), BE = (*I)->block_end();
387 BI != BE; ++BI) {
388 assert(contains(*BI) &&
389 "Loop does not contain all the blocks of a subloop!");
390 }
391
392 // Check the parent loop pointer.
393 if (ParentLoop) {
394 assert(is_contained(ParentLoop->getSubLoops(), this) &&
395 "Loop is not a subloop of its parent!");
396 }
397#endif
398}
399
400/// verifyLoop - Verify loop structure of this loop and all nested loops.
401template <class BlockT, class LoopT>
404 assert(!isInvalid() && "Loop not in a valid state!");
405 Loops->insert(static_cast<const LoopT *>(this));
406 // Verify this loop.
407 verifyLoop();
408 // Verify the subloops.
409 for (iterator I = begin(), E = end(); I != E; ++I)
410 (*I)->verifyLoopNest(Loops);
411}
412
413template <class BlockT, class LoopT>
415 bool PrintNested, unsigned Depth) const {
416 OS.indent(Depth * 2);
417 if (static_cast<const LoopT *>(this)->isAnnotatedParallel())
418 OS << "Parallel ";
419 OS << "Loop at depth " << getLoopDepth() << " containing: ";
420
421 BlockT *H = getHeader();
422 for (unsigned i = 0; i < getBlocks().size(); ++i) {
423 BlockT *BB = getBlocks()[i];
424 if (!Verbose) {
425 if (i)
426 OS << ",";
427 BB->printAsOperand(OS, false);
428 } else {
429 OS << '\n';
430 }
431
432 if (BB == H)
433 OS << "<header>";
434 if (isLoopLatch(BB))
435 OS << "<latch>";
436 if (isLoopExiting(BB))
437 OS << "<exiting>";
438 if (Verbose)
439 BB->print(OS);
440 }
441
442 if (PrintNested) {
443 OS << "\n";
444
445 for (iterator I = begin(), E = end(); I != E; ++I)
446 (*I)->print(OS, /*Verbose*/ false, PrintNested, Depth + 2);
447 }
448}
449
450//===----------------------------------------------------------------------===//
451/// Stable LoopInfo Analysis - Build a loop tree using stable iterators so the
452/// result does / not depend on use list (block predecessor) order.
453///
454
455/// Analyze LoopInfo identifies the loops during a single forward depth-first
456/// search of the CFG.
457///
458/// Then build a loop-contiguous reverse postorder for in-loops blocks. Lists
459/// are header-first with each subloop's blocks contiguous, ordered by first
460/// appearance in RPO; SubLoops keep program order, TopLevelLoops reverse
461/// program order.
462template <class BlockT, class LoopT>
464 analyze(DomTree.getRootNode()->getBlock()->getParent(),
465 [&]() -> const DomTreeBase<BlockT> & { return DomTree; });
466}
467
468template <class BlockT, class LoopT>
470 DomTreeBase<BlockT> DomTree;
471 analyze(F, [&]() -> const DomTreeBase<BlockT> & {
472 DomTree.recalculate(*F);
473 return DomTree;
474 });
475}
476
477template <class BlockT, class LoopT>
479 ParentT F, function_ref<const DomTreeBase<BlockT> &()> GetDomTree) {
480 using BlockTraits = GraphTraits<BlockT *>;
481 auto num = [](const BlockT *BB) {
482 return GraphTraits<const BlockT *>::getNumber(BB);
483 };
484
485 ParentPtr = F;
486 BlockNumberEpoch = GraphTraits<ParentT>::getNumberEpoch(ParentPtr);
487 unsigned MaxNumber = GraphTraits<ParentT>::getMaxNumber(ParentPtr);
488
489 // Sentinel block number meaning "no block".
490 constexpr unsigned NoBlock = ~0u;
491 // States during DFS (Unvisited, OffPath, >=FirstOnPath) and post-DFS
492 // (IsHeader, IsReentered).
493 constexpr unsigned Unvisited = 0;
494 constexpr unsigned OffPath = 1;
495 constexpr unsigned IsHeader = 2;
496 constexpr unsigned IsReentered = 3;
497 constexpr unsigned FirstOnPath = IsReentered + 1;
498
499 // Per-block search state, indexed by block number.
500 struct BlockInfo {
501 // Unvisited. Spelled 0 to work around GCC 11 ICE.
502 unsigned Pos = 0;
503 // Block number of the innermost enclosing header; NoBlock if none. Set to
504 // NoBlock when the block is visited, then woven by tagLoopHeader.
505 unsigned LoopHeader = 0;
506 };
508 // The loop headers, repeated once per backedge.
510 // The headers of the loops that an edge re-enters. They mark irreducible
511 // loops that need to be reduced to natural loop subsets.
512 DenseSet<unsigned> Reentries;
513
514 // Weave loop header \p H (and its own header chain) into the loop header
515 // chain of \p B, keeping the chain ordered from innermost to outermost by
516 // search path position. Building this chain on the fly is why the algorithm
517 // needs no union-find (used in the Havlak algorithm) at all.
518 auto tagLoopHeader = [&](unsigned B, unsigned H) {
519 assert(H != NoBlock);
520 // Invariant: Info[B].Pos >= Info[H].Pos.
521 while (B != H) {
522 unsigned IH = Info[B].LoopHeader;
523 if (IH == NoBlock) {
524 // B's chain ended: append the rest of H's chain.
525 Info[B].LoopHeader = H;
526 return;
527 }
528 // Keep whichever candidate header is inner (larger search path position).
529 if (Info[IH].Pos >= Info[H].Pos) {
530 B = IH;
531 } else {
532 Info[B].LoopHeader = H;
533 B = H;
534 H = IH;
535 }
536 }
537 };
538
539 // Identify loops with the algorithm of Wei et al., "A New Algorithm for
540 // Identifying Loops in Decompilation" (SAS 2007): tag each block with its
541 // innermost enclosing header. It also records the postorder the layout below
542 // needs.
544 Postorder.reserve(MaxNumber);
545 struct Frame {
546 BlockT *Block;
547 typename BlockTraits::ChildIteratorType Cur, End;
548 };
550 unsigned Counter = FirstOnPath;
551 auto open = [&](BlockT *BB) {
552 unsigned B = num(BB);
553 Info[B].Pos = Counter++;
554 Info[B].LoopHeader = NoBlock;
555 Stack.push_back(
556 {BB, BlockTraits::child_begin(BB), BlockTraits::child_end(BB)});
557 };
558
559 open(GraphTraits<ParentT>::getEntryNode(ParentPtr));
560 while (!Stack.empty()) {
561 Frame &Top = Stack.back();
562 if (Top.Cur == Top.End) {
563 // Leave the search path, and weave into the parent's chain.
564 unsigned B0 = num(Top.Block);
565 Info[B0].Pos = OffPath;
566 Postorder.push_back(Top.Block);
567 Stack.pop_back();
568 if (!Stack.empty() && Info[B0].LoopHeader != NoBlock)
569 tagLoopHeader(num(Stack.back().Block), Info[B0].LoopHeader);
570 continue;
571 }
572 BlockT *B0P = Top.Block;
573 BlockT *B1P = *Top.Cur++;
574 unsigned B1 = num(B1P);
575 if (Info[B1].Pos == Unvisited) {
576 // Tree edge; the weaving happens when B1's frame is popped.
577 open(B1P);
578 } else if (Info[B1].Pos >= FirstOnPath) {
579 // Retreating edge, including a self edge: B1 heads a loop.
580 Headers.push_back(B1);
581 tagLoopHeader(num(B0P), B1);
582 } else {
583 // Climb B1's header chain: each enclosing header still off the DFS path
584 // heads a closed cycle this edge re-enters, so B1 is a non-header entry
585 // of it (and it is irreducible). Stop at the first on-path header and
586 // attribute B0 to it.
587 for (unsigned H = Info[B1].LoopHeader; H != NoBlock;
588 H = Info[H].LoopHeader) {
589 if (Info[H].Pos >= FirstOnPath) {
590 tagLoopHeader(num(B0P), H);
591 break;
592 }
593 Reentries.insert(H);
594 }
595 }
596 }
597 // Most functions have no loops; skip the layout construction.
598 if (Headers.empty())
599 return;
600 // Every block is off the search path now, so marking the headers cannot be
601 // mistaken for a position on it.
602 for (unsigned H : Headers)
603 Info[H].Pos = IsHeader;
604
605 if (!Reentries.empty()) {
606 // A re-entered loop has more than one entry, so it is not a natural loop.
607 // Reduce it, innermost first, to the natural loop of its header's
608 // backedges: a backward search from the latches finds the blocks to keep;
609 // splice the header out of the chain of every other block.
610 for (unsigned H : Reentries)
611 Info[H].Pos = IsReentered;
612 const DomTreeBase<BlockT> &DomTree = GetDomTree();
613 assert(DomTree.getRootNode()->getBlock() ==
615 DomTree.updateDFSNumbers();
616 SmallVector<unsigned, 0> Mark(MaxNumber, NoBlock);
618 // Invert the chains into the loop forest, so that a header visits only its
619 // own blocks.
620 SmallVector<unsigned, 0> FirstChild(MaxNumber, NoBlock);
621 SmallVector<unsigned, 0> NextSibling(MaxNumber, NoBlock);
622 SmallVector<BlockT *, 0> Blocks(MaxNumber);
623 for (BlockT *BB : Postorder) {
624 unsigned B = num(BB);
625 Blocks[B] = BB;
626 if (unsigned P = Info[B].LoopHeader; P != NoBlock) {
627 NextSibling[B] = FirstChild[P];
628 FirstChild[P] = B;
629 }
630 }
631 for (BlockT *Header : Postorder) {
632 unsigned H = num(Header);
633 if (Info[H].Pos != IsReentered)
634 continue;
635 Mark[H] = H;
636 Worklist.clear();
637 auto enqueue = [&](BlockT *Pred) {
638 unsigned P = num(Pred);
639 // If Pred is in a natural loop, mark its header and skip interior
640 // blocks.
641 for (unsigned A = P; A != NoBlock; A = Info[A].LoopHeader)
642 if (Info[A].LoopHeader == H) {
643 P = A;
644 Pred = Blocks[A];
645 break;
646 }
647 if (Mark[P] == H)
648 return;
649 Mark[P] = H;
650 Worklist.push_back(Pred);
651 };
652 // Place the latches, the predecessors the header dominates, into a
653 // worklist.
654 const DomTreeNodeBase<BlockT> *DomNode = DomTree.getNode(Header);
655 assert(DomNode && "header missing from the dominator tree");
656 bool HasBackedge = false;
657 for (BlockT *Pred : inverse_children<BlockT *>(Header)) {
658 const DomTreeNodeBase<BlockT> *PredNode = DomTree.getNode(Pred);
659 if (PredNode && DomTree.dominates(DomNode, PredNode)) {
660 HasBackedge = true;
661 enqueue(Pred);
662 }
663 }
664 // Whatever reaches a latch without passing the header is in the loop.
665 for (unsigned I = 0; I != Worklist.size(); ++I)
666 for (BlockT *Pred : inverse_children<BlockT *>(Worklist[I]))
667 enqueue(Pred);
668 // Without a backedge the header forms no loop at all.
669 Info[H].Pos = HasBackedge ? IsHeader : OffPath;
670 // Partition the header's blocks: the loop keeps the ones the traversal
671 // reached, and the enclosing header takes the rest, which its own turn
672 // then tests. Both arms relink the block, so step first.
673 unsigned Parent = Info[H].LoopHeader;
674 unsigned Kept = NoBlock;
675 for (unsigned B = FirstChild[H], Next; B != NoBlock; B = Next) {
676 Next = NextSibling[B];
677 if (Mark[B] == H) {
678 NextSibling[B] = Kept;
679 Kept = B;
680 } else {
681 // Leaving the loop; the block is top level if it had no other header.
682 Info[B].LoopHeader = Parent;
683 if (Parent != NoBlock) {
684 NextSibling[B] = FirstChild[Parent];
685 FirstChild[Parent] = B;
686 }
687 }
688 }
689 FirstChild[H] = Kept;
690 }
691 if (none_of(Headers, [&](unsigned H) { return Info[H].Pos == IsHeader; }))
692 return;
693 }
694
695 // Resolve the chains in reverse postorder: a block's innermost header is
696 // one of its search tree ancestors, so it is mapped to its loop first.
697 BBMap.resize(MaxNumber);
698 for (BlockT *BB : llvm::reverse(Postorder)) {
699 unsigned B = num(BB);
700 unsigned H = Info[B].LoopHeader;
701 LoopT *Enclosing = H == NoBlock ? nullptr : BBMap[H];
702 LoopT *L = Enclosing;
703 if (Info[B].Pos == IsHeader) {
704 L = allocateLoop(BB);
705 L->setParentLoop(Enclosing);
706 }
707 BBMap[B] = L;
708 }
710 // Record each in-loop block with its innermost loop in forward CFG postorder,
711 // and build the loop list in PO.
714 PO.reserve(Postorder.size());
715 for (BlockT *BB : Postorder) {
716 LoopT *L = lookupLoopFor(BB);
717 if (!L)
718 continue;
719 PO.emplace_back(BB, L);
720 ++L->BlockLen;
721 if (BB != pendingHeader(L))
722 continue;
723 LoopsPO.push_back(L);
724 if (LoopT *Parent = L->getParentLoop())
725 Parent->BlockLen += L->BlockLen;
726 else
727 TopLevelLoops.push_back(L);
728 }
729 // Headers are dominator-tree nodes, hence reachable and in the postorder.
730 assert(!LoopsPO.empty() && "discovered loops but found no header");
731
732 BlockLayout.reset(new BlockT *[PO.size()]);
733 BlockT **RootCursor = BlockLayout.get();
734 for (auto &[BB, L] : llvm::reverse(PO)) {
735 if (L->BlockCapacity == 0) {
736 // The first block of a L is its the header. Carve its slice from the
737 // parent (already visited)'s cursor.
738 if (LoopT *Parent = L->getParentLoop()) {
739 assert(Parent->BlockCapacity != 0 &&
740 "parent slice not carved before child");
741 L->BlockData = Parent->BlockData + Parent->BlockCapacity;
742 Parent->BlockCapacity += L->BlockLen;
743 Parent->SubLoops.push_back(L);
744 } else {
745 L->BlockData = RootCursor;
746 RootCursor += L->BlockLen;
747 }
748 }
749 // Each block lands once, at its innermost loop's cursor.
750 L->BlockData[L->BlockCapacity++] = BB;
751 }
752
753 // Mark every slice as borrowed from BlockLayout; a later mutation copies it
754 // into private storage (see materializeBlocks).
755 for (LoopT *L : LoopsPO) {
756 assert(L->BlockCapacity == L->BlockLen && "layout slice not fully used");
757 L->BlockCapacity = LoopT::BorrowedCapacity;
758 }
759}
761template <class BlockT, class LoopT>
764 SmallVector<LoopT *, 4> PreOrderLoops;
765 // The outer-most loop actually goes into the result in the same relative
766 // order as we walk it. But LoopInfo stores the top level loops in reverse
767 // program order so for here we reverse it to get forward program order.
768 // FIXME: If we change the order of LoopInfo we will want to remove the
769 // reverse here.
770 for (LoopT *RootL : reverse(*this)) {
771 PreOrderLoops.push_back(RootL);
772 LoopT::getInnerLoopsInPreorder(*RootL, PreOrderLoops);
773 }
774
775 return PreOrderLoops;
776}
777
778template <class BlockT, class LoopT>
781 SmallVector<LoopT *, 4> PreOrderLoops, PreOrderWorklist;
782 // The outer-most loop actually goes into the result in the same relative
783 // order as we walk it. LoopInfo stores the top level loops in reverse
784 // program order so we walk in order here.
785 // FIXME: If we change the order of LoopInfo we will want to add a reverse
786 // here.
787 for (LoopT *RootL : *this) {
788 assert(PreOrderWorklist.empty() &&
789 "Must start with an empty preorder walk worklist.");
790 PreOrderWorklist.push_back(RootL);
791 do {
792 LoopT *L = PreOrderWorklist.pop_back_val();
793 // Sub-loops are stored in forward program order, but will process the
794 // worklist backwards so we can just append them in order.
795 PreOrderWorklist.append(L->begin(), L->end());
796 PreOrderLoops.push_back(L);
797 } while (!PreOrderWorklist.empty());
798 }
799
800 return PreOrderLoops;
801}
802
803template <class BlockT, class LoopT>
805 LoopT *B) const {
806 if (!A || !B)
807 return nullptr;
808
809 // If loops A and B have different depth replace them with parent loop
810 // until they have the same depth.
811 unsigned DepthA = A->getLoopDepth(), DepthB = B->getLoopDepth();
812 for (; DepthA > DepthB; --DepthA)
813 A = A->getParentLoop();
814 for (; DepthB > DepthA; --DepthB)
815 B = B->getParentLoop();
816
817 // Loops A and B are at same depth but may be disjoint, replace them with
818 // parent loops until we find loop that contains both or we run out of
819 // parent loops.
820 while (A != B) {
821 A = A->getParentLoop();
822 B = B->getParentLoop();
823 }
824
825 return A;
826}
827
828template <class BlockT, class LoopT>
830 BlockT *B) const {
832}
833
834// Debugging
835template <class BlockT, class LoopT>
837 for (unsigned i = 0; i < TopLevelLoops.size(); ++i)
838 TopLevelLoops[i]->print(OS);
839}
840
841template <typename T>
842bool compareVectors(std::vector<T> &BB1, std::vector<T> &BB2) {
843 llvm::sort(BB1);
844 llvm::sort(BB2);
845 return BB1 == BB2;
846}
847
848template <class BlockT, class LoopT>
851 const LoopT &L) {
852 LoopHeaders[L.getHeader()] = &L;
853 for (LoopT *SL : L)
854 addInnerLoopsToHeadersMap(LoopHeaders, LI, *SL);
855}
856
857#ifndef NDEBUG
858template <class BlockT, class LoopT>
859static void compareLoops(const LoopT *L, const LoopT *OtherL,
861 BlockT *H = L->getHeader();
862 BlockT *OtherH = OtherL->getHeader();
863 assert(H == OtherH &&
864 "Mismatched headers even though found in the same map entry!");
865
866 assert(L->getLoopDepth() == OtherL->getLoopDepth() &&
867 "Mismatched loop depth!");
868 const LoopT *ParentL = L, *OtherParentL = OtherL;
869 do {
870 assert(ParentL->getHeader() == OtherParentL->getHeader() &&
871 "Mismatched parent loop headers!");
872 ParentL = ParentL->getParentLoop();
873 OtherParentL = OtherParentL->getParentLoop();
874 } while (ParentL);
875
876 for (const LoopT *SubL : *L) {
877 BlockT *SubH = SubL->getHeader();
878 const LoopT *OtherSubL = OtherLoopHeaders.lookup(SubH);
879 assert(OtherSubL && "Inner loop is missing in computed loop info!");
880 OtherLoopHeaders.erase(SubH);
881 compareLoops(SubL, OtherSubL, OtherLoopHeaders);
882 }
883
884 std::vector<BlockT *> BBs = L->getBlocks();
885 std::vector<BlockT *> OtherBBs = OtherL->getBlocks();
886 assert(compareVectors(BBs, OtherBBs) &&
887 "Mismatched basic blocks in the loops!");
888}
889#endif
890
891template <class BlockT, class LoopT>
894 for (iterator I = begin(), E = end(); I != E; ++I) {
895 assert((*I)->isOutermost() && "Top-level loop has a parent!");
896 (*I)->verifyLoopNest(&Loops);
897 }
898
899// Verify that blocks are mapped to valid loops.
900#ifndef NDEBUG
901 // Every loop must point back at this LoopInfo (see resetLoopInfoOwners).
902 for (const LoopT *L : Loops)
903 assert(L->LI == this && "Loop has a stale owning-LoopInfo back-pointer");
904
905 // Recompute the innermost loop of each block from the loops' block lists,
906 // which are maintained independently of BBMap. Using contains() here would
907 // derive from BBMap itself and check nothing.
908 SmallVector<const LoopT *> Innermost(BBMap.size());
910 while (!Worklist.empty()) {
911 const LoopT *L = Worklist.pop_back_val();
912 // A loop is visited before its children, so a child's blocks overwrite the
913 // entries written by its ancestors.
914 for (const BlockT *BB : L->getBlocks()) {
916 assert(Number < Innermost.size() && "block missing from BBMap");
917 Innermost[Number] = L;
918 }
919 Worklist.append(L->begin(), L->end());
920 }
921
922 for (auto [Number, L] : enumerate(BBMap)) {
923 assert((!L || Loops.count(L)) && "orphaned loop");
924 assert(L == Innermost[Number] &&
925 "BBMap should point to the innermost loop containing the block");
926 }
927
928 // Recompute LoopInfo to verify loops structure.
929 LoopInfoBase<BlockT, LoopT> OtherLI;
930 OtherLI.analyze(ParentPtr);
931
932 // Build a map we can use to move from our LI to the computed one. This
933 // allows us to ignore the particular order in any layer of the loop forest
934 // while still comparing the structure.
935 DenseMap<BlockT *, const LoopT *> OtherLoopHeaders;
936 for (LoopT *L : OtherLI)
937 addInnerLoopsToHeadersMap(OtherLoopHeaders, OtherLI, *L);
938
939 // Walk the top level loops and ensure there is a corresponding top-level
940 // loop in the computed version and then recursively compare those loop
941 // nests.
942 for (LoopT *L : *this) {
943 BlockT *Header = L->getHeader();
944 const LoopT *OtherL = OtherLoopHeaders.lookup(Header);
945 assert(OtherL && "Top level loop is missing in computed loop info!");
946 // Now that we've matched this loop, erase its header from the map.
947 OtherLoopHeaders.erase(Header);
948 // And recursively compare these loops.
949 compareLoops(L, OtherL, OtherLoopHeaders);
950 }
951
952 // Any remaining entries in the map are loops which were found when computing
953 // a fresh LoopInfo but not present in the current one.
954 if (!OtherLoopHeaders.empty()) {
955 for (const auto &HeaderAndLoop : OtherLoopHeaders)
956 dbgs() << "Found new loop: " << *HeaderAndLoop.second << "\n";
957 llvm_unreachable("Found new loops when recomputing LoopInfo!");
958 }
959#endif
960}
961
962} // namespace llvm
963
964#endif // LLVM_SUPPORT_GENERICLOOPINFOIMPL_H
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static const Function * getParent(const Value *V)
bbsections Prepares for basic block by splitting functions into clusters of basic blocks
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
This file defines the DenseSet and SmallDenseSet classes.
This file builds on the ADT/GraphTraits.h file to build generic depth first graph iterator.
Hexagon Hardware Loops
static bool isExitBlock(BasicBlock *BB, const SmallVectorImpl< BasicBlock * > &ExitBlocks)
Return true if the specified block is in the list.
Definition LCSSA.cpp:68
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
#define H(x, y, z)
Definition MD5.cpp:56
#define P(N)
This file builds on the ADT/GraphTraits.h file to build a generic graph post order iterator.
This file contains some templates that are useful if you are working with the STL at all.
static bool contains(SmallPtrSetImpl< ConstantExpr * > &Cache, ConstantExpr *Expr, Constant *C)
Definition Value.cpp:484
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.
Definition DenseMap.h:250
bool erase(const KeyT &Val)
Definition DenseMap.h:377
bool empty() const
Definition DenseMap.h:171
Implements a dense probed hash-table based set.
Definition DenseSet.h:281
Base class for the actual dominator tree node.
DomTreeNodeBase< NodeT > * getRootNode()
getRootNode - This returns the entry node for the CFG of the function.
bool dominates(const DomTreeNodeBase< NodeT > *A, const DomTreeNodeBase< NodeT > *B) const
dominates - Returns true iff A dominates B.
void updateDFSNumbers() const
updateDFSNumbers - Assign In and Out numbers to the nodes while walking dominator tree in dfs order.
void recalculate(ParentType &Func)
recalculate - compute a dominator tree for the given function
DomTreeNodeBase< NodeT > * getNode(const NodeT *BB) const
getNode - return the (Post)DominatorTree node for the specified basic block.
Instances of this class are used to represent loops that are detected in the flow graph.
bool isAnnotatedParallel() const
Returns true if the loop is annotated parallel.
typename std::vector< LoopT * >::const_iterator iterator
BlockT * getLoopLatch() const
If there is a single latch block for this loop, return it.
void getExitBlocks(SmallVectorImpl< BlockT * > &ExitBlocks) const
Return all of the successor blocks of this loop.
unsigned getNumBlocks() const
Get the number of blocks in this loop in constant time.
void verifyLoop() const
Verify loop structure.
void verifyLoopNest(DenseSet< const LoopT * > *Loops) const
Verify loop structure of this loop and all nested loops.
void getExitingBlocks(SmallVectorImpl< BlockT * > &ExitingBlocks) const
Return all blocks inside the loop that have successors outside of the loop.
BlockT * getHeader() const
unsigned getLoopDepth() const
Return the nesting level of this loop.
void print(raw_ostream &OS, bool Verbose=false, bool PrintNested=true, unsigned Depth=0) const
Print loop with all the BBs inside it.
void addBasicBlockToLoop(BlockT *NewBB, LoopInfoBase< BlockT, LoopT > &LI)
This method is used by other analyses to update loop information.
bool isInvalid() const
Return true if this loop is no longer valid.
BlockT * getLoopPredecessor() const
If the given loop's header has exactly one unique predecessor outside the loop, return it.
bool isLoopLatch(const BlockT *BB) const
iterator end() const
BlockT * getExitBlock() const
If getExitBlocks would return exactly one block, return that block.
void replaceChildLoopWith(LoopT *OldChild, LoopT *NewChild)
This is used when splitting loops up.
BlockT * getLoopPreheader() const
If there is a preheader for this loop, return it.
ArrayRef< BasicBlock * > getBlocks() const
BlockT * getExitingBlock() const
If getExitingBlocks would return exactly one block, return that block.
void getUniqueExitBlocks(SmallVectorImpl< BlockT * > &ExitBlocks) const
Return all unique successor blocks of this loop.
bool hasDedicatedExits() const
Return true if no exit block for the loop has a predecessor that is outside the loop.
void getUniqueNonLatchExitBlocks(SmallVectorImpl< BlockT * > &ExitBlocks) const
Return all unique successor blocks of this loop except successors from Latch block are not considered...
iterator begin() const
bool isLoopExiting(const BlockT *BB) const
True if terminator in the block can branch to another block that is outside of the current loop.
BlockT * getUniqueExitBlock() const
If getUniqueExitBlocks would return exactly one block, return that block.
This class builds and contains all of the top-level loop structures in the specified function.
bool hasNoExitBlocks(const LoopT &L) const
Return true if L does not have any exit blocks.
SmallVector< LoopT *, 4 > getLoopsInReverseSiblingPreorder() const
Return all of the loops in the function in preorder across the loop nests, with siblings in reverse p...
void print(raw_ostream &OS) const
iterator end() const
SmallVector< LoopT *, 4 > getLoopsInPreorder() const
Return all of the loops in the function in preorder across the loop nests, with siblings in forward p...
LoopT * getSmallestCommonLoop(LoopT *A, LoopT *B) const
Find the innermost loop containing both given loops.
typename std::vector< LoopT * >::const_iterator iterator
iterator/begin/end - The interface to the top-level loops in the current function.
void analyze(ParentT F)
Create the loop forest for a function.
iterator begin() const
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 getExitEdges(const LoopT &L, SmallVectorImpl< Edge > &ExitEdges) const
Return all pairs of (inside_block,outside_block).
LoopT * getLoopFor(const BlockT *BB) const
Return the inner most loop that BB lives in.
void changeLoopFor(const BlockT *BB, LoopT *L)
Change the top-level loop that contains BB to the specified loop.
size_type size() const
Definition SmallPtrSet.h:99
size_type count(ConstPtrType Ptr) const
count - Return 1 if the specified pointer is in the set, 0 otherwise.
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
reference emplace_back(ArgTypes &&... Args)
void 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.
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition raw_ostream.h:53
raw_ostream & indent(unsigned NumSpaces)
indent - Insert 'NumSpaces' spaces.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
decltype(&BlockT::isLegalToHoistInto) has_hoist_check
llvm::is_detected< has_hoist_check, BlockT > detect_has_hoist_check
bool isLegalToHoistInto(BlockT *Block)
SFINAE functions that dispatch to the isLegalToHoistInto member function or return false,...
NodeAddr< BlockNode * > Block
Definition RDFGraph.h:392
This is an optimization pass for GlobalISel generic memory operations.
iterator_range< df_ext_iterator< T, SetTy > > depth_first_ext(const T &G, SetTy &S)
auto find(R &&Range, const T &Val)
Provide wrappers to std::find which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1765
Printable print(const GCNRegPressure &RP, const GCNSubtarget *ST=nullptr, unsigned DynamicVGPRBlockSize=0)
static void compareLoops(const LoopT *L, const LoopT *OtherL, DenseMap< BlockT *, const LoopT * > &OtherLoopHeaders)
auto enumerate(FirstRange &&First, RestRanges &&...Rest)
Given two or more input ranges, returns a new range whose values are tuples (A, B,...
Definition STLExtras.h:2554
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1746
auto reverse(ContainerTy &&C)
Definition STLExtras.h:407
void sort(IteratorTy Start, IteratorTy End)
Definition STLExtras.h:1636
DominatorTreeBase< T, false > DomTreeBase
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:209
bool none_of(R &&Range, UnaryPredicate P)
Provide wrappers to std::none_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1753
bool hasSingleElement(ContainerTy &&C)
Returns true if the given container only contains a single element.
Definition STLExtras.h:299
iterator_range< filter_iterator< detail::IterOfRange< RangeT >, PredicateT > > make_filter_range(RangeT &&Range, PredicateT Pred)
Convenience function that takes a range of elements and a predicate, and return a new filter_iterator...
Definition STLExtras.h:551
std::pair< BlockT *, bool > getExitBlockHelper(const LoopBase< BlockT, LoopT > *L, bool Unique)
getExitBlock - If getExitBlocks would return exactly one block, return that block.
std::pair< T *, bool > find_singleton_nested(R &&Range, Predicate P, bool AllowRepeats=false)
Return a pair consisting of the single value in Range that satisfies P(<member of Range> ,...
Definition STLExtras.h:1862
T * find_singleton(R &&Range, Predicate P, bool AllowRepeats=false)
Return the single value in Range that satisfies P(<member of Range> *, AllowRepeats)->T * returning n...
Definition STLExtras.h:1837
iterator_range< typename GraphTraits< Inverse< GraphType > >::ChildIteratorType > inverse_children(const typename GraphTraits< GraphType >::NodeRef &G)
void addInnerLoopsToHeadersMap(DenseMap< BlockT *, const LoopT * > &LoopHeaders, const LoopInfoBase< BlockT, LoopT > &LI, const LoopT &L)
void getUniqueExitBlocksHelper(const LoopT *L, SmallVectorImpl< BlockT * > &ExitBlocks, PredicateT Pred)
typename detail::detector< void, Op, Args... >::value_t is_detected
Detects if a given trait holds for some set of arguments 'Args'.
iterator_range< typename GraphTraits< GraphType >::ChildIteratorType > children(const typename GraphTraits< GraphType >::NodeRef &G)
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
Definition STLExtras.h:1947
bool compareVectors(std::vector< T > &BB1, std::vector< T > &BB2)
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Next
Definition InstrProf.h:147
iterator_range< df_iterator< T > > depth_first(const T &G)
std::pair< iterator, bool > insert(NodeRef N)