1 //===- MachineLoopInfo.cpp - Natural Loop Calculator ----------------------===//
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
7 //===----------------------------------------------------------------------===//
9 // This file defines the MachineLoopInfo class that is used to identify natural
10 // loops and determine the loop depth of various nodes of the CFG. Note that
11 // the loops identified may actually be several natural loops that share the
12 // same header node... not just a single natural loop.
14 //===----------------------------------------------------------------------===//
16 #include "llvm/CodeGen/MachineLoopInfo.h"
17 #include "llvm/Analysis/LoopInfoImpl.h"
18 #include "llvm/CodeGen/MachineDominators.h"
19 #include "llvm/CodeGen/Passes.h"
20 #include "llvm/Config/llvm-config.h"
21 #include "llvm/Support/Debug.h"
22 #include "llvm/Support/raw_ostream.h"
25 // Explicitly instantiate methods in LoopInfoImpl.h for MI-level Loops.
26 template class llvm::LoopBase
<MachineBasicBlock
, MachineLoop
>;
27 template class llvm::LoopInfoBase
<MachineBasicBlock
, MachineLoop
>;
29 char MachineLoopInfo::ID
= 0;
30 INITIALIZE_PASS_BEGIN(MachineLoopInfo
, "machine-loops",
31 "Machine Natural Loop Construction", true, true)
32 INITIALIZE_PASS_DEPENDENCY(MachineDominatorTree
)
33 INITIALIZE_PASS_END(MachineLoopInfo
, "machine-loops",
34 "Machine Natural Loop Construction", true, true)
36 char &llvm::MachineLoopInfoID
= MachineLoopInfo::ID
;
38 bool MachineLoopInfo::runOnMachineFunction(MachineFunction
&) {
40 LI
.analyze(getAnalysis
<MachineDominatorTree
>().getBase());
44 void MachineLoopInfo::getAnalysisUsage(AnalysisUsage
&AU
) const {
46 AU
.addRequired
<MachineDominatorTree
>();
47 MachineFunctionPass::getAnalysisUsage(AU
);
50 MachineBasicBlock
*MachineLoop::getTopBlock() {
51 MachineBasicBlock
*TopMBB
= getHeader();
52 MachineFunction::iterator Begin
= TopMBB
->getParent()->begin();
53 if (TopMBB
->getIterator() != Begin
) {
54 MachineBasicBlock
*PriorMBB
= &*std::prev(TopMBB
->getIterator());
55 while (contains(PriorMBB
)) {
57 if (TopMBB
->getIterator() == Begin
)
59 PriorMBB
= &*std::prev(TopMBB
->getIterator());
65 MachineBasicBlock
*MachineLoop::getBottomBlock() {
66 MachineBasicBlock
*BotMBB
= getHeader();
67 MachineFunction::iterator End
= BotMBB
->getParent()->end();
68 if (BotMBB
->getIterator() != std::prev(End
)) {
69 MachineBasicBlock
*NextMBB
= &*std::next(BotMBB
->getIterator());
70 while (contains(NextMBB
)) {
72 if (BotMBB
== &*std::next(BotMBB
->getIterator()))
74 NextMBB
= &*std::next(BotMBB
->getIterator());
80 MachineBasicBlock
*MachineLoop::findLoopControlBlock() {
81 if (MachineBasicBlock
*Latch
= getLoopLatch()) {
82 if (isLoopExiting(Latch
))
85 return getExitingBlock();
90 DebugLoc
MachineLoop::getStartLoc() const {
91 // Try the pre-header first.
92 if (MachineBasicBlock
*PHeadMBB
= getLoopPreheader())
93 if (const BasicBlock
*PHeadBB
= PHeadMBB
->getBasicBlock())
94 if (DebugLoc DL
= PHeadBB
->getTerminator()->getDebugLoc())
97 // If we have no pre-header or there are no instructions with debug
98 // info in it, try the header.
99 if (MachineBasicBlock
*HeadMBB
= getHeader())
100 if (const BasicBlock
*HeadBB
= HeadMBB
->getBasicBlock())
101 return HeadBB
->getTerminator()->getDebugLoc();
107 MachineLoopInfo::findLoopPreheader(MachineLoop
*L
,
108 bool SpeculativePreheader
) const {
109 if (MachineBasicBlock
*PB
= L
->getLoopPreheader())
112 if (!SpeculativePreheader
)
115 MachineBasicBlock
*HB
= L
->getHeader(), *LB
= L
->getLoopLatch();
116 if (HB
->pred_size() != 2 || HB
->hasAddressTaken())
118 // Find the predecessor of the header that is not the latch block.
119 MachineBasicBlock
*Preheader
= nullptr;
120 for (MachineBasicBlock
*P
: HB
->predecessors()) {
129 // Check if the preheader candidate is a successor of any other loop
130 // headers. We want to avoid having two loop setups in the same block.
131 for (MachineBasicBlock
*S
: Preheader
->successors()) {
134 MachineLoop
*T
= getLoopFor(S
);
135 if (T
&& T
->getHeader() == S
)
141 #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
142 LLVM_DUMP_METHOD
void MachineLoop::dump() const {