1*9880d681SAndroid Build Coastguard Worker //===- LoopInfo.cpp - Natural Loop Calculator -----------------------------===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker //
10*9880d681SAndroid Build Coastguard Worker // This file defines the LoopInfo class that is used to identify natural loops
11*9880d681SAndroid Build Coastguard Worker // and determine the loop depth of various nodes of the CFG. Note that the
12*9880d681SAndroid Build Coastguard Worker // loops identified may actually be several natural loops that share the same
13*9880d681SAndroid Build Coastguard Worker // header node... not just a single natural loop.
14*9880d681SAndroid Build Coastguard Worker //
15*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
16*9880d681SAndroid Build Coastguard Worker
17*9880d681SAndroid Build Coastguard Worker #include "llvm/Analysis/LoopInfo.h"
18*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/DepthFirstIterator.h"
19*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/SmallPtrSet.h"
20*9880d681SAndroid Build Coastguard Worker #include "llvm/Analysis/LoopInfoImpl.h"
21*9880d681SAndroid Build Coastguard Worker #include "llvm/Analysis/LoopIterator.h"
22*9880d681SAndroid Build Coastguard Worker #include "llvm/Analysis/ValueTracking.h"
23*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/CFG.h"
24*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Constants.h"
25*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/DebugLoc.h"
26*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Dominators.h"
27*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Instructions.h"
28*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/LLVMContext.h"
29*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Metadata.h"
30*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/PassManager.h"
31*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/CommandLine.h"
32*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/Debug.h"
33*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/raw_ostream.h"
34*9880d681SAndroid Build Coastguard Worker #include <algorithm>
35*9880d681SAndroid Build Coastguard Worker using namespace llvm;
36*9880d681SAndroid Build Coastguard Worker
37*9880d681SAndroid Build Coastguard Worker // Explicitly instantiate methods in LoopInfoImpl.h for IR-level Loops.
38*9880d681SAndroid Build Coastguard Worker template class llvm::LoopBase<BasicBlock, Loop>;
39*9880d681SAndroid Build Coastguard Worker template class llvm::LoopInfoBase<BasicBlock, Loop>;
40*9880d681SAndroid Build Coastguard Worker
41*9880d681SAndroid Build Coastguard Worker // Always verify loopinfo if expensive checking is enabled.
42*9880d681SAndroid Build Coastguard Worker #ifdef EXPENSIVE_CHECKS
43*9880d681SAndroid Build Coastguard Worker static bool VerifyLoopInfo = true;
44*9880d681SAndroid Build Coastguard Worker #else
45*9880d681SAndroid Build Coastguard Worker static bool VerifyLoopInfo = false;
46*9880d681SAndroid Build Coastguard Worker #endif
47*9880d681SAndroid Build Coastguard Worker static cl::opt<bool,true>
48*9880d681SAndroid Build Coastguard Worker VerifyLoopInfoX("verify-loop-info", cl::location(VerifyLoopInfo),
49*9880d681SAndroid Build Coastguard Worker cl::desc("Verify loop info (time consuming)"));
50*9880d681SAndroid Build Coastguard Worker
51*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
52*9880d681SAndroid Build Coastguard Worker // Loop implementation
53*9880d681SAndroid Build Coastguard Worker //
54*9880d681SAndroid Build Coastguard Worker
isLoopInvariant(const Value * V) const55*9880d681SAndroid Build Coastguard Worker bool Loop::isLoopInvariant(const Value *V) const {
56*9880d681SAndroid Build Coastguard Worker if (const Instruction *I = dyn_cast<Instruction>(V))
57*9880d681SAndroid Build Coastguard Worker return !contains(I);
58*9880d681SAndroid Build Coastguard Worker return true; // All non-instructions are loop invariant
59*9880d681SAndroid Build Coastguard Worker }
60*9880d681SAndroid Build Coastguard Worker
hasLoopInvariantOperands(const Instruction * I) const61*9880d681SAndroid Build Coastguard Worker bool Loop::hasLoopInvariantOperands(const Instruction *I) const {
62*9880d681SAndroid Build Coastguard Worker return all_of(I->operands(), [this](Value *V) { return isLoopInvariant(V); });
63*9880d681SAndroid Build Coastguard Worker }
64*9880d681SAndroid Build Coastguard Worker
makeLoopInvariant(Value * V,bool & Changed,Instruction * InsertPt) const65*9880d681SAndroid Build Coastguard Worker bool Loop::makeLoopInvariant(Value *V, bool &Changed,
66*9880d681SAndroid Build Coastguard Worker Instruction *InsertPt) const {
67*9880d681SAndroid Build Coastguard Worker if (Instruction *I = dyn_cast<Instruction>(V))
68*9880d681SAndroid Build Coastguard Worker return makeLoopInvariant(I, Changed, InsertPt);
69*9880d681SAndroid Build Coastguard Worker return true; // All non-instructions are loop-invariant.
70*9880d681SAndroid Build Coastguard Worker }
71*9880d681SAndroid Build Coastguard Worker
makeLoopInvariant(Instruction * I,bool & Changed,Instruction * InsertPt) const72*9880d681SAndroid Build Coastguard Worker bool Loop::makeLoopInvariant(Instruction *I, bool &Changed,
73*9880d681SAndroid Build Coastguard Worker Instruction *InsertPt) const {
74*9880d681SAndroid Build Coastguard Worker // Test if the value is already loop-invariant.
75*9880d681SAndroid Build Coastguard Worker if (isLoopInvariant(I))
76*9880d681SAndroid Build Coastguard Worker return true;
77*9880d681SAndroid Build Coastguard Worker if (!isSafeToSpeculativelyExecute(I))
78*9880d681SAndroid Build Coastguard Worker return false;
79*9880d681SAndroid Build Coastguard Worker if (I->mayReadFromMemory())
80*9880d681SAndroid Build Coastguard Worker return false;
81*9880d681SAndroid Build Coastguard Worker // EH block instructions are immobile.
82*9880d681SAndroid Build Coastguard Worker if (I->isEHPad())
83*9880d681SAndroid Build Coastguard Worker return false;
84*9880d681SAndroid Build Coastguard Worker // Determine the insertion point, unless one was given.
85*9880d681SAndroid Build Coastguard Worker if (!InsertPt) {
86*9880d681SAndroid Build Coastguard Worker BasicBlock *Preheader = getLoopPreheader();
87*9880d681SAndroid Build Coastguard Worker // Without a preheader, hoisting is not feasible.
88*9880d681SAndroid Build Coastguard Worker if (!Preheader)
89*9880d681SAndroid Build Coastguard Worker return false;
90*9880d681SAndroid Build Coastguard Worker InsertPt = Preheader->getTerminator();
91*9880d681SAndroid Build Coastguard Worker }
92*9880d681SAndroid Build Coastguard Worker // Don't hoist instructions with loop-variant operands.
93*9880d681SAndroid Build Coastguard Worker for (Value *Operand : I->operands())
94*9880d681SAndroid Build Coastguard Worker if (!makeLoopInvariant(Operand, Changed, InsertPt))
95*9880d681SAndroid Build Coastguard Worker return false;
96*9880d681SAndroid Build Coastguard Worker
97*9880d681SAndroid Build Coastguard Worker // Hoist.
98*9880d681SAndroid Build Coastguard Worker I->moveBefore(InsertPt);
99*9880d681SAndroid Build Coastguard Worker
100*9880d681SAndroid Build Coastguard Worker // There is possibility of hoisting this instruction above some arbitrary
101*9880d681SAndroid Build Coastguard Worker // condition. Any metadata defined on it can be control dependent on this
102*9880d681SAndroid Build Coastguard Worker // condition. Conservatively strip it here so that we don't give any wrong
103*9880d681SAndroid Build Coastguard Worker // information to the optimizer.
104*9880d681SAndroid Build Coastguard Worker I->dropUnknownNonDebugMetadata();
105*9880d681SAndroid Build Coastguard Worker
106*9880d681SAndroid Build Coastguard Worker Changed = true;
107*9880d681SAndroid Build Coastguard Worker return true;
108*9880d681SAndroid Build Coastguard Worker }
109*9880d681SAndroid Build Coastguard Worker
getCanonicalInductionVariable() const110*9880d681SAndroid Build Coastguard Worker PHINode *Loop::getCanonicalInductionVariable() const {
111*9880d681SAndroid Build Coastguard Worker BasicBlock *H = getHeader();
112*9880d681SAndroid Build Coastguard Worker
113*9880d681SAndroid Build Coastguard Worker BasicBlock *Incoming = nullptr, *Backedge = nullptr;
114*9880d681SAndroid Build Coastguard Worker pred_iterator PI = pred_begin(H);
115*9880d681SAndroid Build Coastguard Worker assert(PI != pred_end(H) &&
116*9880d681SAndroid Build Coastguard Worker "Loop must have at least one backedge!");
117*9880d681SAndroid Build Coastguard Worker Backedge = *PI++;
118*9880d681SAndroid Build Coastguard Worker if (PI == pred_end(H)) return nullptr; // dead loop
119*9880d681SAndroid Build Coastguard Worker Incoming = *PI++;
120*9880d681SAndroid Build Coastguard Worker if (PI != pred_end(H)) return nullptr; // multiple backedges?
121*9880d681SAndroid Build Coastguard Worker
122*9880d681SAndroid Build Coastguard Worker if (contains(Incoming)) {
123*9880d681SAndroid Build Coastguard Worker if (contains(Backedge))
124*9880d681SAndroid Build Coastguard Worker return nullptr;
125*9880d681SAndroid Build Coastguard Worker std::swap(Incoming, Backedge);
126*9880d681SAndroid Build Coastguard Worker } else if (!contains(Backedge))
127*9880d681SAndroid Build Coastguard Worker return nullptr;
128*9880d681SAndroid Build Coastguard Worker
129*9880d681SAndroid Build Coastguard Worker // Loop over all of the PHI nodes, looking for a canonical indvar.
130*9880d681SAndroid Build Coastguard Worker for (BasicBlock::iterator I = H->begin(); isa<PHINode>(I); ++I) {
131*9880d681SAndroid Build Coastguard Worker PHINode *PN = cast<PHINode>(I);
132*9880d681SAndroid Build Coastguard Worker if (ConstantInt *CI =
133*9880d681SAndroid Build Coastguard Worker dyn_cast<ConstantInt>(PN->getIncomingValueForBlock(Incoming)))
134*9880d681SAndroid Build Coastguard Worker if (CI->isNullValue())
135*9880d681SAndroid Build Coastguard Worker if (Instruction *Inc =
136*9880d681SAndroid Build Coastguard Worker dyn_cast<Instruction>(PN->getIncomingValueForBlock(Backedge)))
137*9880d681SAndroid Build Coastguard Worker if (Inc->getOpcode() == Instruction::Add &&
138*9880d681SAndroid Build Coastguard Worker Inc->getOperand(0) == PN)
139*9880d681SAndroid Build Coastguard Worker if (ConstantInt *CI = dyn_cast<ConstantInt>(Inc->getOperand(1)))
140*9880d681SAndroid Build Coastguard Worker if (CI->equalsInt(1))
141*9880d681SAndroid Build Coastguard Worker return PN;
142*9880d681SAndroid Build Coastguard Worker }
143*9880d681SAndroid Build Coastguard Worker return nullptr;
144*9880d681SAndroid Build Coastguard Worker }
145*9880d681SAndroid Build Coastguard Worker
isLCSSAForm(DominatorTree & DT) const146*9880d681SAndroid Build Coastguard Worker bool Loop::isLCSSAForm(DominatorTree &DT) const {
147*9880d681SAndroid Build Coastguard Worker for (BasicBlock *BB : this->blocks()) {
148*9880d681SAndroid Build Coastguard Worker for (Instruction &I : *BB) {
149*9880d681SAndroid Build Coastguard Worker // Tokens can't be used in PHI nodes and live-out tokens prevent loop
150*9880d681SAndroid Build Coastguard Worker // optimizations, so for the purposes of considered LCSSA form, we
151*9880d681SAndroid Build Coastguard Worker // can ignore them.
152*9880d681SAndroid Build Coastguard Worker if (I.getType()->isTokenTy())
153*9880d681SAndroid Build Coastguard Worker continue;
154*9880d681SAndroid Build Coastguard Worker
155*9880d681SAndroid Build Coastguard Worker for (Use &U : I.uses()) {
156*9880d681SAndroid Build Coastguard Worker Instruction *UI = cast<Instruction>(U.getUser());
157*9880d681SAndroid Build Coastguard Worker BasicBlock *UserBB = UI->getParent();
158*9880d681SAndroid Build Coastguard Worker if (PHINode *P = dyn_cast<PHINode>(UI))
159*9880d681SAndroid Build Coastguard Worker UserBB = P->getIncomingBlock(U);
160*9880d681SAndroid Build Coastguard Worker
161*9880d681SAndroid Build Coastguard Worker // Check the current block, as a fast-path, before checking whether
162*9880d681SAndroid Build Coastguard Worker // the use is anywhere in the loop. Most values are used in the same
163*9880d681SAndroid Build Coastguard Worker // block they are defined in. Also, blocks not reachable from the
164*9880d681SAndroid Build Coastguard Worker // entry are special; uses in them don't need to go through PHIs.
165*9880d681SAndroid Build Coastguard Worker if (UserBB != BB &&
166*9880d681SAndroid Build Coastguard Worker !contains(UserBB) &&
167*9880d681SAndroid Build Coastguard Worker DT.isReachableFromEntry(UserBB))
168*9880d681SAndroid Build Coastguard Worker return false;
169*9880d681SAndroid Build Coastguard Worker }
170*9880d681SAndroid Build Coastguard Worker }
171*9880d681SAndroid Build Coastguard Worker }
172*9880d681SAndroid Build Coastguard Worker
173*9880d681SAndroid Build Coastguard Worker return true;
174*9880d681SAndroid Build Coastguard Worker }
175*9880d681SAndroid Build Coastguard Worker
isRecursivelyLCSSAForm(DominatorTree & DT) const176*9880d681SAndroid Build Coastguard Worker bool Loop::isRecursivelyLCSSAForm(DominatorTree &DT) const {
177*9880d681SAndroid Build Coastguard Worker if (!isLCSSAForm(DT))
178*9880d681SAndroid Build Coastguard Worker return false;
179*9880d681SAndroid Build Coastguard Worker
180*9880d681SAndroid Build Coastguard Worker return std::all_of(begin(), end(), [&](const Loop *L) {
181*9880d681SAndroid Build Coastguard Worker return L->isRecursivelyLCSSAForm(DT);
182*9880d681SAndroid Build Coastguard Worker });
183*9880d681SAndroid Build Coastguard Worker }
184*9880d681SAndroid Build Coastguard Worker
isLoopSimplifyForm() const185*9880d681SAndroid Build Coastguard Worker bool Loop::isLoopSimplifyForm() const {
186*9880d681SAndroid Build Coastguard Worker // Normal-form loops have a preheader, a single backedge, and all of their
187*9880d681SAndroid Build Coastguard Worker // exits have all their predecessors inside the loop.
188*9880d681SAndroid Build Coastguard Worker return getLoopPreheader() && getLoopLatch() && hasDedicatedExits();
189*9880d681SAndroid Build Coastguard Worker }
190*9880d681SAndroid Build Coastguard Worker
191*9880d681SAndroid Build Coastguard Worker // Routines that reform the loop CFG and split edges often fail on indirectbr.
isSafeToClone() const192*9880d681SAndroid Build Coastguard Worker bool Loop::isSafeToClone() const {
193*9880d681SAndroid Build Coastguard Worker // Return false if any loop blocks contain indirectbrs, or there are any calls
194*9880d681SAndroid Build Coastguard Worker // to noduplicate functions.
195*9880d681SAndroid Build Coastguard Worker for (BasicBlock *BB : this->blocks()) {
196*9880d681SAndroid Build Coastguard Worker if (isa<IndirectBrInst>(BB->getTerminator()))
197*9880d681SAndroid Build Coastguard Worker return false;
198*9880d681SAndroid Build Coastguard Worker
199*9880d681SAndroid Build Coastguard Worker for (Instruction &I : *BB)
200*9880d681SAndroid Build Coastguard Worker if (auto CS = CallSite(&I))
201*9880d681SAndroid Build Coastguard Worker if (CS.cannotDuplicate())
202*9880d681SAndroid Build Coastguard Worker return false;
203*9880d681SAndroid Build Coastguard Worker }
204*9880d681SAndroid Build Coastguard Worker return true;
205*9880d681SAndroid Build Coastguard Worker }
206*9880d681SAndroid Build Coastguard Worker
getLoopID() const207*9880d681SAndroid Build Coastguard Worker MDNode *Loop::getLoopID() const {
208*9880d681SAndroid Build Coastguard Worker MDNode *LoopID = nullptr;
209*9880d681SAndroid Build Coastguard Worker if (isLoopSimplifyForm()) {
210*9880d681SAndroid Build Coastguard Worker LoopID = getLoopLatch()->getTerminator()->getMetadata(LLVMContext::MD_loop);
211*9880d681SAndroid Build Coastguard Worker } else {
212*9880d681SAndroid Build Coastguard Worker // Go through each predecessor of the loop header and check the
213*9880d681SAndroid Build Coastguard Worker // terminator for the metadata.
214*9880d681SAndroid Build Coastguard Worker BasicBlock *H = getHeader();
215*9880d681SAndroid Build Coastguard Worker for (BasicBlock *BB : this->blocks()) {
216*9880d681SAndroid Build Coastguard Worker TerminatorInst *TI = BB->getTerminator();
217*9880d681SAndroid Build Coastguard Worker MDNode *MD = nullptr;
218*9880d681SAndroid Build Coastguard Worker
219*9880d681SAndroid Build Coastguard Worker // Check if this terminator branches to the loop header.
220*9880d681SAndroid Build Coastguard Worker for (BasicBlock *Successor : TI->successors()) {
221*9880d681SAndroid Build Coastguard Worker if (Successor == H) {
222*9880d681SAndroid Build Coastguard Worker MD = TI->getMetadata(LLVMContext::MD_loop);
223*9880d681SAndroid Build Coastguard Worker break;
224*9880d681SAndroid Build Coastguard Worker }
225*9880d681SAndroid Build Coastguard Worker }
226*9880d681SAndroid Build Coastguard Worker if (!MD)
227*9880d681SAndroid Build Coastguard Worker return nullptr;
228*9880d681SAndroid Build Coastguard Worker
229*9880d681SAndroid Build Coastguard Worker if (!LoopID)
230*9880d681SAndroid Build Coastguard Worker LoopID = MD;
231*9880d681SAndroid Build Coastguard Worker else if (MD != LoopID)
232*9880d681SAndroid Build Coastguard Worker return nullptr;
233*9880d681SAndroid Build Coastguard Worker }
234*9880d681SAndroid Build Coastguard Worker }
235*9880d681SAndroid Build Coastguard Worker if (!LoopID || LoopID->getNumOperands() == 0 ||
236*9880d681SAndroid Build Coastguard Worker LoopID->getOperand(0) != LoopID)
237*9880d681SAndroid Build Coastguard Worker return nullptr;
238*9880d681SAndroid Build Coastguard Worker return LoopID;
239*9880d681SAndroid Build Coastguard Worker }
240*9880d681SAndroid Build Coastguard Worker
setLoopID(MDNode * LoopID) const241*9880d681SAndroid Build Coastguard Worker void Loop::setLoopID(MDNode *LoopID) const {
242*9880d681SAndroid Build Coastguard Worker assert(LoopID && "Loop ID should not be null");
243*9880d681SAndroid Build Coastguard Worker assert(LoopID->getNumOperands() > 0 && "Loop ID needs at least one operand");
244*9880d681SAndroid Build Coastguard Worker assert(LoopID->getOperand(0) == LoopID && "Loop ID should refer to itself");
245*9880d681SAndroid Build Coastguard Worker
246*9880d681SAndroid Build Coastguard Worker if (isLoopSimplifyForm()) {
247*9880d681SAndroid Build Coastguard Worker getLoopLatch()->getTerminator()->setMetadata(LLVMContext::MD_loop, LoopID);
248*9880d681SAndroid Build Coastguard Worker return;
249*9880d681SAndroid Build Coastguard Worker }
250*9880d681SAndroid Build Coastguard Worker
251*9880d681SAndroid Build Coastguard Worker BasicBlock *H = getHeader();
252*9880d681SAndroid Build Coastguard Worker for (BasicBlock *BB : this->blocks()) {
253*9880d681SAndroid Build Coastguard Worker TerminatorInst *TI = BB->getTerminator();
254*9880d681SAndroid Build Coastguard Worker for (BasicBlock *Successor : TI->successors()) {
255*9880d681SAndroid Build Coastguard Worker if (Successor == H)
256*9880d681SAndroid Build Coastguard Worker TI->setMetadata(LLVMContext::MD_loop, LoopID);
257*9880d681SAndroid Build Coastguard Worker }
258*9880d681SAndroid Build Coastguard Worker }
259*9880d681SAndroid Build Coastguard Worker }
260*9880d681SAndroid Build Coastguard Worker
isAnnotatedParallel() const261*9880d681SAndroid Build Coastguard Worker bool Loop::isAnnotatedParallel() const {
262*9880d681SAndroid Build Coastguard Worker MDNode *DesiredLoopIdMetadata = getLoopID();
263*9880d681SAndroid Build Coastguard Worker
264*9880d681SAndroid Build Coastguard Worker if (!DesiredLoopIdMetadata)
265*9880d681SAndroid Build Coastguard Worker return false;
266*9880d681SAndroid Build Coastguard Worker
267*9880d681SAndroid Build Coastguard Worker // The loop branch contains the parallel loop metadata. In order to ensure
268*9880d681SAndroid Build Coastguard Worker // that any parallel-loop-unaware optimization pass hasn't added loop-carried
269*9880d681SAndroid Build Coastguard Worker // dependencies (thus converted the loop back to a sequential loop), check
270*9880d681SAndroid Build Coastguard Worker // that all the memory instructions in the loop contain parallelism metadata
271*9880d681SAndroid Build Coastguard Worker // that point to the same unique "loop id metadata" the loop branch does.
272*9880d681SAndroid Build Coastguard Worker for (BasicBlock *BB : this->blocks()) {
273*9880d681SAndroid Build Coastguard Worker for (Instruction &I : *BB) {
274*9880d681SAndroid Build Coastguard Worker if (!I.mayReadOrWriteMemory())
275*9880d681SAndroid Build Coastguard Worker continue;
276*9880d681SAndroid Build Coastguard Worker
277*9880d681SAndroid Build Coastguard Worker // The memory instruction can refer to the loop identifier metadata
278*9880d681SAndroid Build Coastguard Worker // directly or indirectly through another list metadata (in case of
279*9880d681SAndroid Build Coastguard Worker // nested parallel loops). The loop identifier metadata refers to
280*9880d681SAndroid Build Coastguard Worker // itself so we can check both cases with the same routine.
281*9880d681SAndroid Build Coastguard Worker MDNode *LoopIdMD =
282*9880d681SAndroid Build Coastguard Worker I.getMetadata(LLVMContext::MD_mem_parallel_loop_access);
283*9880d681SAndroid Build Coastguard Worker
284*9880d681SAndroid Build Coastguard Worker if (!LoopIdMD)
285*9880d681SAndroid Build Coastguard Worker return false;
286*9880d681SAndroid Build Coastguard Worker
287*9880d681SAndroid Build Coastguard Worker bool LoopIdMDFound = false;
288*9880d681SAndroid Build Coastguard Worker for (const MDOperand &MDOp : LoopIdMD->operands()) {
289*9880d681SAndroid Build Coastguard Worker if (MDOp == DesiredLoopIdMetadata) {
290*9880d681SAndroid Build Coastguard Worker LoopIdMDFound = true;
291*9880d681SAndroid Build Coastguard Worker break;
292*9880d681SAndroid Build Coastguard Worker }
293*9880d681SAndroid Build Coastguard Worker }
294*9880d681SAndroid Build Coastguard Worker
295*9880d681SAndroid Build Coastguard Worker if (!LoopIdMDFound)
296*9880d681SAndroid Build Coastguard Worker return false;
297*9880d681SAndroid Build Coastguard Worker }
298*9880d681SAndroid Build Coastguard Worker }
299*9880d681SAndroid Build Coastguard Worker return true;
300*9880d681SAndroid Build Coastguard Worker }
301*9880d681SAndroid Build Coastguard Worker
getStartLoc() const302*9880d681SAndroid Build Coastguard Worker DebugLoc Loop::getStartLoc() const {
303*9880d681SAndroid Build Coastguard Worker // If we have a debug location in the loop ID, then use it.
304*9880d681SAndroid Build Coastguard Worker if (MDNode *LoopID = getLoopID())
305*9880d681SAndroid Build Coastguard Worker for (unsigned i = 1, ie = LoopID->getNumOperands(); i < ie; ++i)
306*9880d681SAndroid Build Coastguard Worker if (DILocation *L = dyn_cast<DILocation>(LoopID->getOperand(i)))
307*9880d681SAndroid Build Coastguard Worker return DebugLoc(L);
308*9880d681SAndroid Build Coastguard Worker
309*9880d681SAndroid Build Coastguard Worker // Try the pre-header first.
310*9880d681SAndroid Build Coastguard Worker if (BasicBlock *PHeadBB = getLoopPreheader())
311*9880d681SAndroid Build Coastguard Worker if (DebugLoc DL = PHeadBB->getTerminator()->getDebugLoc())
312*9880d681SAndroid Build Coastguard Worker return DL;
313*9880d681SAndroid Build Coastguard Worker
314*9880d681SAndroid Build Coastguard Worker // If we have no pre-header or there are no instructions with debug
315*9880d681SAndroid Build Coastguard Worker // info in it, try the header.
316*9880d681SAndroid Build Coastguard Worker if (BasicBlock *HeadBB = getHeader())
317*9880d681SAndroid Build Coastguard Worker return HeadBB->getTerminator()->getDebugLoc();
318*9880d681SAndroid Build Coastguard Worker
319*9880d681SAndroid Build Coastguard Worker return DebugLoc();
320*9880d681SAndroid Build Coastguard Worker }
321*9880d681SAndroid Build Coastguard Worker
hasDedicatedExits() const322*9880d681SAndroid Build Coastguard Worker bool Loop::hasDedicatedExits() const {
323*9880d681SAndroid Build Coastguard Worker // Each predecessor of each exit block of a normal loop is contained
324*9880d681SAndroid Build Coastguard Worker // within the loop.
325*9880d681SAndroid Build Coastguard Worker SmallVector<BasicBlock *, 4> ExitBlocks;
326*9880d681SAndroid Build Coastguard Worker getExitBlocks(ExitBlocks);
327*9880d681SAndroid Build Coastguard Worker for (BasicBlock *BB : ExitBlocks)
328*9880d681SAndroid Build Coastguard Worker for (BasicBlock *Predecessor : predecessors(BB))
329*9880d681SAndroid Build Coastguard Worker if (!contains(Predecessor))
330*9880d681SAndroid Build Coastguard Worker return false;
331*9880d681SAndroid Build Coastguard Worker // All the requirements are met.
332*9880d681SAndroid Build Coastguard Worker return true;
333*9880d681SAndroid Build Coastguard Worker }
334*9880d681SAndroid Build Coastguard Worker
335*9880d681SAndroid Build Coastguard Worker void
getUniqueExitBlocks(SmallVectorImpl<BasicBlock * > & ExitBlocks) const336*9880d681SAndroid Build Coastguard Worker Loop::getUniqueExitBlocks(SmallVectorImpl<BasicBlock *> &ExitBlocks) const {
337*9880d681SAndroid Build Coastguard Worker assert(hasDedicatedExits() &&
338*9880d681SAndroid Build Coastguard Worker "getUniqueExitBlocks assumes the loop has canonical form exits!");
339*9880d681SAndroid Build Coastguard Worker
340*9880d681SAndroid Build Coastguard Worker SmallVector<BasicBlock *, 32> SwitchExitBlocks;
341*9880d681SAndroid Build Coastguard Worker for (BasicBlock *BB : this->blocks()) {
342*9880d681SAndroid Build Coastguard Worker SwitchExitBlocks.clear();
343*9880d681SAndroid Build Coastguard Worker for (BasicBlock *Successor : successors(BB)) {
344*9880d681SAndroid Build Coastguard Worker // If block is inside the loop then it is not an exit block.
345*9880d681SAndroid Build Coastguard Worker if (contains(Successor))
346*9880d681SAndroid Build Coastguard Worker continue;
347*9880d681SAndroid Build Coastguard Worker
348*9880d681SAndroid Build Coastguard Worker pred_iterator PI = pred_begin(Successor);
349*9880d681SAndroid Build Coastguard Worker BasicBlock *FirstPred = *PI;
350*9880d681SAndroid Build Coastguard Worker
351*9880d681SAndroid Build Coastguard Worker // If current basic block is this exit block's first predecessor
352*9880d681SAndroid Build Coastguard Worker // then only insert exit block in to the output ExitBlocks vector.
353*9880d681SAndroid Build Coastguard Worker // This ensures that same exit block is not inserted twice into
354*9880d681SAndroid Build Coastguard Worker // ExitBlocks vector.
355*9880d681SAndroid Build Coastguard Worker if (BB != FirstPred)
356*9880d681SAndroid Build Coastguard Worker continue;
357*9880d681SAndroid Build Coastguard Worker
358*9880d681SAndroid Build Coastguard Worker // If a terminator has more then two successors, for example SwitchInst,
359*9880d681SAndroid Build Coastguard Worker // then it is possible that there are multiple edges from current block
360*9880d681SAndroid Build Coastguard Worker // to one exit block.
361*9880d681SAndroid Build Coastguard Worker if (std::distance(succ_begin(BB), succ_end(BB)) <= 2) {
362*9880d681SAndroid Build Coastguard Worker ExitBlocks.push_back(Successor);
363*9880d681SAndroid Build Coastguard Worker continue;
364*9880d681SAndroid Build Coastguard Worker }
365*9880d681SAndroid Build Coastguard Worker
366*9880d681SAndroid Build Coastguard Worker // In case of multiple edges from current block to exit block, collect
367*9880d681SAndroid Build Coastguard Worker // only one edge in ExitBlocks. Use switchExitBlocks to keep track of
368*9880d681SAndroid Build Coastguard Worker // duplicate edges.
369*9880d681SAndroid Build Coastguard Worker if (std::find(SwitchExitBlocks.begin(), SwitchExitBlocks.end(), Successor)
370*9880d681SAndroid Build Coastguard Worker == SwitchExitBlocks.end()) {
371*9880d681SAndroid Build Coastguard Worker SwitchExitBlocks.push_back(Successor);
372*9880d681SAndroid Build Coastguard Worker ExitBlocks.push_back(Successor);
373*9880d681SAndroid Build Coastguard Worker }
374*9880d681SAndroid Build Coastguard Worker }
375*9880d681SAndroid Build Coastguard Worker }
376*9880d681SAndroid Build Coastguard Worker }
377*9880d681SAndroid Build Coastguard Worker
getUniqueExitBlock() const378*9880d681SAndroid Build Coastguard Worker BasicBlock *Loop::getUniqueExitBlock() const {
379*9880d681SAndroid Build Coastguard Worker SmallVector<BasicBlock *, 8> UniqueExitBlocks;
380*9880d681SAndroid Build Coastguard Worker getUniqueExitBlocks(UniqueExitBlocks);
381*9880d681SAndroid Build Coastguard Worker if (UniqueExitBlocks.size() == 1)
382*9880d681SAndroid Build Coastguard Worker return UniqueExitBlocks[0];
383*9880d681SAndroid Build Coastguard Worker return nullptr;
384*9880d681SAndroid Build Coastguard Worker }
385*9880d681SAndroid Build Coastguard Worker
386*9880d681SAndroid Build Coastguard Worker #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
dump() const387*9880d681SAndroid Build Coastguard Worker LLVM_DUMP_METHOD void Loop::dump() const {
388*9880d681SAndroid Build Coastguard Worker print(dbgs());
389*9880d681SAndroid Build Coastguard Worker }
390*9880d681SAndroid Build Coastguard Worker #endif
391*9880d681SAndroid Build Coastguard Worker
392*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
393*9880d681SAndroid Build Coastguard Worker // UnloopUpdater implementation
394*9880d681SAndroid Build Coastguard Worker //
395*9880d681SAndroid Build Coastguard Worker
396*9880d681SAndroid Build Coastguard Worker namespace {
397*9880d681SAndroid Build Coastguard Worker /// Find the new parent loop for all blocks within the "unloop" whose last
398*9880d681SAndroid Build Coastguard Worker /// backedges has just been removed.
399*9880d681SAndroid Build Coastguard Worker class UnloopUpdater {
400*9880d681SAndroid Build Coastguard Worker Loop &Unloop;
401*9880d681SAndroid Build Coastguard Worker LoopInfo *LI;
402*9880d681SAndroid Build Coastguard Worker
403*9880d681SAndroid Build Coastguard Worker LoopBlocksDFS DFS;
404*9880d681SAndroid Build Coastguard Worker
405*9880d681SAndroid Build Coastguard Worker // Map unloop's immediate subloops to their nearest reachable parents. Nested
406*9880d681SAndroid Build Coastguard Worker // loops within these subloops will not change parents. However, an immediate
407*9880d681SAndroid Build Coastguard Worker // subloop's new parent will be the nearest loop reachable from either its own
408*9880d681SAndroid Build Coastguard Worker // exits *or* any of its nested loop's exits.
409*9880d681SAndroid Build Coastguard Worker DenseMap<Loop*, Loop*> SubloopParents;
410*9880d681SAndroid Build Coastguard Worker
411*9880d681SAndroid Build Coastguard Worker // Flag the presence of an irreducible backedge whose destination is a block
412*9880d681SAndroid Build Coastguard Worker // directly contained by the original unloop.
413*9880d681SAndroid Build Coastguard Worker bool FoundIB;
414*9880d681SAndroid Build Coastguard Worker
415*9880d681SAndroid Build Coastguard Worker public:
UnloopUpdater(Loop * UL,LoopInfo * LInfo)416*9880d681SAndroid Build Coastguard Worker UnloopUpdater(Loop *UL, LoopInfo *LInfo) :
417*9880d681SAndroid Build Coastguard Worker Unloop(*UL), LI(LInfo), DFS(UL), FoundIB(false) {}
418*9880d681SAndroid Build Coastguard Worker
419*9880d681SAndroid Build Coastguard Worker void updateBlockParents();
420*9880d681SAndroid Build Coastguard Worker
421*9880d681SAndroid Build Coastguard Worker void removeBlocksFromAncestors();
422*9880d681SAndroid Build Coastguard Worker
423*9880d681SAndroid Build Coastguard Worker void updateSubloopParents();
424*9880d681SAndroid Build Coastguard Worker
425*9880d681SAndroid Build Coastguard Worker protected:
426*9880d681SAndroid Build Coastguard Worker Loop *getNearestLoop(BasicBlock *BB, Loop *BBLoop);
427*9880d681SAndroid Build Coastguard Worker };
428*9880d681SAndroid Build Coastguard Worker } // end anonymous namespace
429*9880d681SAndroid Build Coastguard Worker
430*9880d681SAndroid Build Coastguard Worker /// Update the parent loop for all blocks that are directly contained within the
431*9880d681SAndroid Build Coastguard Worker /// original "unloop".
updateBlockParents()432*9880d681SAndroid Build Coastguard Worker void UnloopUpdater::updateBlockParents() {
433*9880d681SAndroid Build Coastguard Worker if (Unloop.getNumBlocks()) {
434*9880d681SAndroid Build Coastguard Worker // Perform a post order CFG traversal of all blocks within this loop,
435*9880d681SAndroid Build Coastguard Worker // propagating the nearest loop from sucessors to predecessors.
436*9880d681SAndroid Build Coastguard Worker LoopBlocksTraversal Traversal(DFS, LI);
437*9880d681SAndroid Build Coastguard Worker for (BasicBlock *POI : Traversal) {
438*9880d681SAndroid Build Coastguard Worker
439*9880d681SAndroid Build Coastguard Worker Loop *L = LI->getLoopFor(POI);
440*9880d681SAndroid Build Coastguard Worker Loop *NL = getNearestLoop(POI, L);
441*9880d681SAndroid Build Coastguard Worker
442*9880d681SAndroid Build Coastguard Worker if (NL != L) {
443*9880d681SAndroid Build Coastguard Worker // For reducible loops, NL is now an ancestor of Unloop.
444*9880d681SAndroid Build Coastguard Worker assert((NL != &Unloop && (!NL || NL->contains(&Unloop))) &&
445*9880d681SAndroid Build Coastguard Worker "uninitialized successor");
446*9880d681SAndroid Build Coastguard Worker LI->changeLoopFor(POI, NL);
447*9880d681SAndroid Build Coastguard Worker }
448*9880d681SAndroid Build Coastguard Worker else {
449*9880d681SAndroid Build Coastguard Worker // Or the current block is part of a subloop, in which case its parent
450*9880d681SAndroid Build Coastguard Worker // is unchanged.
451*9880d681SAndroid Build Coastguard Worker assert((FoundIB || Unloop.contains(L)) && "uninitialized successor");
452*9880d681SAndroid Build Coastguard Worker }
453*9880d681SAndroid Build Coastguard Worker }
454*9880d681SAndroid Build Coastguard Worker }
455*9880d681SAndroid Build Coastguard Worker // Each irreducible loop within the unloop induces a round of iteration using
456*9880d681SAndroid Build Coastguard Worker // the DFS result cached by Traversal.
457*9880d681SAndroid Build Coastguard Worker bool Changed = FoundIB;
458*9880d681SAndroid Build Coastguard Worker for (unsigned NIters = 0; Changed; ++NIters) {
459*9880d681SAndroid Build Coastguard Worker assert(NIters < Unloop.getNumBlocks() && "runaway iterative algorithm");
460*9880d681SAndroid Build Coastguard Worker
461*9880d681SAndroid Build Coastguard Worker // Iterate over the postorder list of blocks, propagating the nearest loop
462*9880d681SAndroid Build Coastguard Worker // from successors to predecessors as before.
463*9880d681SAndroid Build Coastguard Worker Changed = false;
464*9880d681SAndroid Build Coastguard Worker for (LoopBlocksDFS::POIterator POI = DFS.beginPostorder(),
465*9880d681SAndroid Build Coastguard Worker POE = DFS.endPostorder(); POI != POE; ++POI) {
466*9880d681SAndroid Build Coastguard Worker
467*9880d681SAndroid Build Coastguard Worker Loop *L = LI->getLoopFor(*POI);
468*9880d681SAndroid Build Coastguard Worker Loop *NL = getNearestLoop(*POI, L);
469*9880d681SAndroid Build Coastguard Worker if (NL != L) {
470*9880d681SAndroid Build Coastguard Worker assert(NL != &Unloop && (!NL || NL->contains(&Unloop)) &&
471*9880d681SAndroid Build Coastguard Worker "uninitialized successor");
472*9880d681SAndroid Build Coastguard Worker LI->changeLoopFor(*POI, NL);
473*9880d681SAndroid Build Coastguard Worker Changed = true;
474*9880d681SAndroid Build Coastguard Worker }
475*9880d681SAndroid Build Coastguard Worker }
476*9880d681SAndroid Build Coastguard Worker }
477*9880d681SAndroid Build Coastguard Worker }
478*9880d681SAndroid Build Coastguard Worker
479*9880d681SAndroid Build Coastguard Worker /// Remove unloop's blocks from all ancestors below their new parents.
removeBlocksFromAncestors()480*9880d681SAndroid Build Coastguard Worker void UnloopUpdater::removeBlocksFromAncestors() {
481*9880d681SAndroid Build Coastguard Worker // Remove all unloop's blocks (including those in nested subloops) from
482*9880d681SAndroid Build Coastguard Worker // ancestors below the new parent loop.
483*9880d681SAndroid Build Coastguard Worker for (Loop::block_iterator BI = Unloop.block_begin(),
484*9880d681SAndroid Build Coastguard Worker BE = Unloop.block_end(); BI != BE; ++BI) {
485*9880d681SAndroid Build Coastguard Worker Loop *OuterParent = LI->getLoopFor(*BI);
486*9880d681SAndroid Build Coastguard Worker if (Unloop.contains(OuterParent)) {
487*9880d681SAndroid Build Coastguard Worker while (OuterParent->getParentLoop() != &Unloop)
488*9880d681SAndroid Build Coastguard Worker OuterParent = OuterParent->getParentLoop();
489*9880d681SAndroid Build Coastguard Worker OuterParent = SubloopParents[OuterParent];
490*9880d681SAndroid Build Coastguard Worker }
491*9880d681SAndroid Build Coastguard Worker // Remove blocks from former Ancestors except Unloop itself which will be
492*9880d681SAndroid Build Coastguard Worker // deleted.
493*9880d681SAndroid Build Coastguard Worker for (Loop *OldParent = Unloop.getParentLoop(); OldParent != OuterParent;
494*9880d681SAndroid Build Coastguard Worker OldParent = OldParent->getParentLoop()) {
495*9880d681SAndroid Build Coastguard Worker assert(OldParent && "new loop is not an ancestor of the original");
496*9880d681SAndroid Build Coastguard Worker OldParent->removeBlockFromLoop(*BI);
497*9880d681SAndroid Build Coastguard Worker }
498*9880d681SAndroid Build Coastguard Worker }
499*9880d681SAndroid Build Coastguard Worker }
500*9880d681SAndroid Build Coastguard Worker
501*9880d681SAndroid Build Coastguard Worker /// Update the parent loop for all subloops directly nested within unloop.
updateSubloopParents()502*9880d681SAndroid Build Coastguard Worker void UnloopUpdater::updateSubloopParents() {
503*9880d681SAndroid Build Coastguard Worker while (!Unloop.empty()) {
504*9880d681SAndroid Build Coastguard Worker Loop *Subloop = *std::prev(Unloop.end());
505*9880d681SAndroid Build Coastguard Worker Unloop.removeChildLoop(std::prev(Unloop.end()));
506*9880d681SAndroid Build Coastguard Worker
507*9880d681SAndroid Build Coastguard Worker assert(SubloopParents.count(Subloop) && "DFS failed to visit subloop");
508*9880d681SAndroid Build Coastguard Worker if (Loop *Parent = SubloopParents[Subloop])
509*9880d681SAndroid Build Coastguard Worker Parent->addChildLoop(Subloop);
510*9880d681SAndroid Build Coastguard Worker else
511*9880d681SAndroid Build Coastguard Worker LI->addTopLevelLoop(Subloop);
512*9880d681SAndroid Build Coastguard Worker }
513*9880d681SAndroid Build Coastguard Worker }
514*9880d681SAndroid Build Coastguard Worker
515*9880d681SAndroid Build Coastguard Worker /// Return the nearest parent loop among this block's successors. If a successor
516*9880d681SAndroid Build Coastguard Worker /// is a subloop header, consider its parent to be the nearest parent of the
517*9880d681SAndroid Build Coastguard Worker /// subloop's exits.
518*9880d681SAndroid Build Coastguard Worker ///
519*9880d681SAndroid Build Coastguard Worker /// For subloop blocks, simply update SubloopParents and return NULL.
getNearestLoop(BasicBlock * BB,Loop * BBLoop)520*9880d681SAndroid Build Coastguard Worker Loop *UnloopUpdater::getNearestLoop(BasicBlock *BB, Loop *BBLoop) {
521*9880d681SAndroid Build Coastguard Worker
522*9880d681SAndroid Build Coastguard Worker // Initially for blocks directly contained by Unloop, NearLoop == Unloop and
523*9880d681SAndroid Build Coastguard Worker // is considered uninitialized.
524*9880d681SAndroid Build Coastguard Worker Loop *NearLoop = BBLoop;
525*9880d681SAndroid Build Coastguard Worker
526*9880d681SAndroid Build Coastguard Worker Loop *Subloop = nullptr;
527*9880d681SAndroid Build Coastguard Worker if (NearLoop != &Unloop && Unloop.contains(NearLoop)) {
528*9880d681SAndroid Build Coastguard Worker Subloop = NearLoop;
529*9880d681SAndroid Build Coastguard Worker // Find the subloop ancestor that is directly contained within Unloop.
530*9880d681SAndroid Build Coastguard Worker while (Subloop->getParentLoop() != &Unloop) {
531*9880d681SAndroid Build Coastguard Worker Subloop = Subloop->getParentLoop();
532*9880d681SAndroid Build Coastguard Worker assert(Subloop && "subloop is not an ancestor of the original loop");
533*9880d681SAndroid Build Coastguard Worker }
534*9880d681SAndroid Build Coastguard Worker // Get the current nearest parent of the Subloop exits, initially Unloop.
535*9880d681SAndroid Build Coastguard Worker NearLoop =
536*9880d681SAndroid Build Coastguard Worker SubloopParents.insert(std::make_pair(Subloop, &Unloop)).first->second;
537*9880d681SAndroid Build Coastguard Worker }
538*9880d681SAndroid Build Coastguard Worker
539*9880d681SAndroid Build Coastguard Worker succ_iterator I = succ_begin(BB), E = succ_end(BB);
540*9880d681SAndroid Build Coastguard Worker if (I == E) {
541*9880d681SAndroid Build Coastguard Worker assert(!Subloop && "subloop blocks must have a successor");
542*9880d681SAndroid Build Coastguard Worker NearLoop = nullptr; // unloop blocks may now exit the function.
543*9880d681SAndroid Build Coastguard Worker }
544*9880d681SAndroid Build Coastguard Worker for (; I != E; ++I) {
545*9880d681SAndroid Build Coastguard Worker if (*I == BB)
546*9880d681SAndroid Build Coastguard Worker continue; // self loops are uninteresting
547*9880d681SAndroid Build Coastguard Worker
548*9880d681SAndroid Build Coastguard Worker Loop *L = LI->getLoopFor(*I);
549*9880d681SAndroid Build Coastguard Worker if (L == &Unloop) {
550*9880d681SAndroid Build Coastguard Worker // This successor has not been processed. This path must lead to an
551*9880d681SAndroid Build Coastguard Worker // irreducible backedge.
552*9880d681SAndroid Build Coastguard Worker assert((FoundIB || !DFS.hasPostorder(*I)) && "should have seen IB");
553*9880d681SAndroid Build Coastguard Worker FoundIB = true;
554*9880d681SAndroid Build Coastguard Worker }
555*9880d681SAndroid Build Coastguard Worker if (L != &Unloop && Unloop.contains(L)) {
556*9880d681SAndroid Build Coastguard Worker // Successor is in a subloop.
557*9880d681SAndroid Build Coastguard Worker if (Subloop)
558*9880d681SAndroid Build Coastguard Worker continue; // Branching within subloops. Ignore it.
559*9880d681SAndroid Build Coastguard Worker
560*9880d681SAndroid Build Coastguard Worker // BB branches from the original into a subloop header.
561*9880d681SAndroid Build Coastguard Worker assert(L->getParentLoop() == &Unloop && "cannot skip into nested loops");
562*9880d681SAndroid Build Coastguard Worker
563*9880d681SAndroid Build Coastguard Worker // Get the current nearest parent of the Subloop's exits.
564*9880d681SAndroid Build Coastguard Worker L = SubloopParents[L];
565*9880d681SAndroid Build Coastguard Worker // L could be Unloop if the only exit was an irreducible backedge.
566*9880d681SAndroid Build Coastguard Worker }
567*9880d681SAndroid Build Coastguard Worker if (L == &Unloop) {
568*9880d681SAndroid Build Coastguard Worker continue;
569*9880d681SAndroid Build Coastguard Worker }
570*9880d681SAndroid Build Coastguard Worker // Handle critical edges from Unloop into a sibling loop.
571*9880d681SAndroid Build Coastguard Worker if (L && !L->contains(&Unloop)) {
572*9880d681SAndroid Build Coastguard Worker L = L->getParentLoop();
573*9880d681SAndroid Build Coastguard Worker }
574*9880d681SAndroid Build Coastguard Worker // Remember the nearest parent loop among successors or subloop exits.
575*9880d681SAndroid Build Coastguard Worker if (NearLoop == &Unloop || !NearLoop || NearLoop->contains(L))
576*9880d681SAndroid Build Coastguard Worker NearLoop = L;
577*9880d681SAndroid Build Coastguard Worker }
578*9880d681SAndroid Build Coastguard Worker if (Subloop) {
579*9880d681SAndroid Build Coastguard Worker SubloopParents[Subloop] = NearLoop;
580*9880d681SAndroid Build Coastguard Worker return BBLoop;
581*9880d681SAndroid Build Coastguard Worker }
582*9880d681SAndroid Build Coastguard Worker return NearLoop;
583*9880d681SAndroid Build Coastguard Worker }
584*9880d681SAndroid Build Coastguard Worker
LoopInfo(const DominatorTreeBase<BasicBlock> & DomTree)585*9880d681SAndroid Build Coastguard Worker LoopInfo::LoopInfo(const DominatorTreeBase<BasicBlock> &DomTree) {
586*9880d681SAndroid Build Coastguard Worker analyze(DomTree);
587*9880d681SAndroid Build Coastguard Worker }
588*9880d681SAndroid Build Coastguard Worker
markAsRemoved(Loop * Unloop)589*9880d681SAndroid Build Coastguard Worker void LoopInfo::markAsRemoved(Loop *Unloop) {
590*9880d681SAndroid Build Coastguard Worker assert(!Unloop->isInvalid() && "Loop has already been removed");
591*9880d681SAndroid Build Coastguard Worker Unloop->invalidate();
592*9880d681SAndroid Build Coastguard Worker RemovedLoops.push_back(Unloop);
593*9880d681SAndroid Build Coastguard Worker
594*9880d681SAndroid Build Coastguard Worker // First handle the special case of no parent loop to simplify the algorithm.
595*9880d681SAndroid Build Coastguard Worker if (!Unloop->getParentLoop()) {
596*9880d681SAndroid Build Coastguard Worker // Since BBLoop had no parent, Unloop blocks are no longer in a loop.
597*9880d681SAndroid Build Coastguard Worker for (Loop::block_iterator I = Unloop->block_begin(),
598*9880d681SAndroid Build Coastguard Worker E = Unloop->block_end();
599*9880d681SAndroid Build Coastguard Worker I != E; ++I) {
600*9880d681SAndroid Build Coastguard Worker
601*9880d681SAndroid Build Coastguard Worker // Don't reparent blocks in subloops.
602*9880d681SAndroid Build Coastguard Worker if (getLoopFor(*I) != Unloop)
603*9880d681SAndroid Build Coastguard Worker continue;
604*9880d681SAndroid Build Coastguard Worker
605*9880d681SAndroid Build Coastguard Worker // Blocks no longer have a parent but are still referenced by Unloop until
606*9880d681SAndroid Build Coastguard Worker // the Unloop object is deleted.
607*9880d681SAndroid Build Coastguard Worker changeLoopFor(*I, nullptr);
608*9880d681SAndroid Build Coastguard Worker }
609*9880d681SAndroid Build Coastguard Worker
610*9880d681SAndroid Build Coastguard Worker // Remove the loop from the top-level LoopInfo object.
611*9880d681SAndroid Build Coastguard Worker for (iterator I = begin();; ++I) {
612*9880d681SAndroid Build Coastguard Worker assert(I != end() && "Couldn't find loop");
613*9880d681SAndroid Build Coastguard Worker if (*I == Unloop) {
614*9880d681SAndroid Build Coastguard Worker removeLoop(I);
615*9880d681SAndroid Build Coastguard Worker break;
616*9880d681SAndroid Build Coastguard Worker }
617*9880d681SAndroid Build Coastguard Worker }
618*9880d681SAndroid Build Coastguard Worker
619*9880d681SAndroid Build Coastguard Worker // Move all of the subloops to the top-level.
620*9880d681SAndroid Build Coastguard Worker while (!Unloop->empty())
621*9880d681SAndroid Build Coastguard Worker addTopLevelLoop(Unloop->removeChildLoop(std::prev(Unloop->end())));
622*9880d681SAndroid Build Coastguard Worker
623*9880d681SAndroid Build Coastguard Worker return;
624*9880d681SAndroid Build Coastguard Worker }
625*9880d681SAndroid Build Coastguard Worker
626*9880d681SAndroid Build Coastguard Worker // Update the parent loop for all blocks within the loop. Blocks within
627*9880d681SAndroid Build Coastguard Worker // subloops will not change parents.
628*9880d681SAndroid Build Coastguard Worker UnloopUpdater Updater(Unloop, this);
629*9880d681SAndroid Build Coastguard Worker Updater.updateBlockParents();
630*9880d681SAndroid Build Coastguard Worker
631*9880d681SAndroid Build Coastguard Worker // Remove blocks from former ancestor loops.
632*9880d681SAndroid Build Coastguard Worker Updater.removeBlocksFromAncestors();
633*9880d681SAndroid Build Coastguard Worker
634*9880d681SAndroid Build Coastguard Worker // Add direct subloops as children in their new parent loop.
635*9880d681SAndroid Build Coastguard Worker Updater.updateSubloopParents();
636*9880d681SAndroid Build Coastguard Worker
637*9880d681SAndroid Build Coastguard Worker // Remove unloop from its parent loop.
638*9880d681SAndroid Build Coastguard Worker Loop *ParentLoop = Unloop->getParentLoop();
639*9880d681SAndroid Build Coastguard Worker for (Loop::iterator I = ParentLoop->begin();; ++I) {
640*9880d681SAndroid Build Coastguard Worker assert(I != ParentLoop->end() && "Couldn't find loop");
641*9880d681SAndroid Build Coastguard Worker if (*I == Unloop) {
642*9880d681SAndroid Build Coastguard Worker ParentLoop->removeChildLoop(I);
643*9880d681SAndroid Build Coastguard Worker break;
644*9880d681SAndroid Build Coastguard Worker }
645*9880d681SAndroid Build Coastguard Worker }
646*9880d681SAndroid Build Coastguard Worker }
647*9880d681SAndroid Build Coastguard Worker
648*9880d681SAndroid Build Coastguard Worker char LoopAnalysis::PassID;
649*9880d681SAndroid Build Coastguard Worker
run(Function & F,AnalysisManager<Function> & AM)650*9880d681SAndroid Build Coastguard Worker LoopInfo LoopAnalysis::run(Function &F, AnalysisManager<Function> &AM) {
651*9880d681SAndroid Build Coastguard Worker // FIXME: Currently we create a LoopInfo from scratch for every function.
652*9880d681SAndroid Build Coastguard Worker // This may prove to be too wasteful due to deallocating and re-allocating
653*9880d681SAndroid Build Coastguard Worker // memory each time for the underlying map and vector datastructures. At some
654*9880d681SAndroid Build Coastguard Worker // point it may prove worthwhile to use a freelist and recycle LoopInfo
655*9880d681SAndroid Build Coastguard Worker // objects. I don't want to add that kind of complexity until the scope of
656*9880d681SAndroid Build Coastguard Worker // the problem is better understood.
657*9880d681SAndroid Build Coastguard Worker LoopInfo LI;
658*9880d681SAndroid Build Coastguard Worker LI.analyze(AM.getResult<DominatorTreeAnalysis>(F));
659*9880d681SAndroid Build Coastguard Worker return LI;
660*9880d681SAndroid Build Coastguard Worker }
661*9880d681SAndroid Build Coastguard Worker
run(Function & F,AnalysisManager<Function> & AM)662*9880d681SAndroid Build Coastguard Worker PreservedAnalyses LoopPrinterPass::run(Function &F,
663*9880d681SAndroid Build Coastguard Worker AnalysisManager<Function> &AM) {
664*9880d681SAndroid Build Coastguard Worker AM.getResult<LoopAnalysis>(F).print(OS);
665*9880d681SAndroid Build Coastguard Worker return PreservedAnalyses::all();
666*9880d681SAndroid Build Coastguard Worker }
667*9880d681SAndroid Build Coastguard Worker
PrintLoopPass()668*9880d681SAndroid Build Coastguard Worker PrintLoopPass::PrintLoopPass() : OS(dbgs()) {}
PrintLoopPass(raw_ostream & OS,const std::string & Banner)669*9880d681SAndroid Build Coastguard Worker PrintLoopPass::PrintLoopPass(raw_ostream &OS, const std::string &Banner)
670*9880d681SAndroid Build Coastguard Worker : OS(OS), Banner(Banner) {}
671*9880d681SAndroid Build Coastguard Worker
run(Loop & L,AnalysisManager<Loop> &)672*9880d681SAndroid Build Coastguard Worker PreservedAnalyses PrintLoopPass::run(Loop &L, AnalysisManager<Loop> &) {
673*9880d681SAndroid Build Coastguard Worker OS << Banner;
674*9880d681SAndroid Build Coastguard Worker for (auto *Block : L.blocks())
675*9880d681SAndroid Build Coastguard Worker if (Block)
676*9880d681SAndroid Build Coastguard Worker Block->print(OS);
677*9880d681SAndroid Build Coastguard Worker else
678*9880d681SAndroid Build Coastguard Worker OS << "Printing <null> block";
679*9880d681SAndroid Build Coastguard Worker return PreservedAnalyses::all();
680*9880d681SAndroid Build Coastguard Worker }
681*9880d681SAndroid Build Coastguard Worker
682*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
683*9880d681SAndroid Build Coastguard Worker // LoopInfo implementation
684*9880d681SAndroid Build Coastguard Worker //
685*9880d681SAndroid Build Coastguard Worker
686*9880d681SAndroid Build Coastguard Worker char LoopInfoWrapperPass::ID = 0;
687*9880d681SAndroid Build Coastguard Worker INITIALIZE_PASS_BEGIN(LoopInfoWrapperPass, "loops", "Natural Loop Information",
688*9880d681SAndroid Build Coastguard Worker true, true)
INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)689*9880d681SAndroid Build Coastguard Worker INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)
690*9880d681SAndroid Build Coastguard Worker INITIALIZE_PASS_END(LoopInfoWrapperPass, "loops", "Natural Loop Information",
691*9880d681SAndroid Build Coastguard Worker true, true)
692*9880d681SAndroid Build Coastguard Worker
693*9880d681SAndroid Build Coastguard Worker bool LoopInfoWrapperPass::runOnFunction(Function &) {
694*9880d681SAndroid Build Coastguard Worker releaseMemory();
695*9880d681SAndroid Build Coastguard Worker LI.analyze(getAnalysis<DominatorTreeWrapperPass>().getDomTree());
696*9880d681SAndroid Build Coastguard Worker return false;
697*9880d681SAndroid Build Coastguard Worker }
698*9880d681SAndroid Build Coastguard Worker
verifyAnalysis() const699*9880d681SAndroid Build Coastguard Worker void LoopInfoWrapperPass::verifyAnalysis() const {
700*9880d681SAndroid Build Coastguard Worker // LoopInfoWrapperPass is a FunctionPass, but verifying every loop in the
701*9880d681SAndroid Build Coastguard Worker // function each time verifyAnalysis is called is very expensive. The
702*9880d681SAndroid Build Coastguard Worker // -verify-loop-info option can enable this. In order to perform some
703*9880d681SAndroid Build Coastguard Worker // checking by default, LoopPass has been taught to call verifyLoop manually
704*9880d681SAndroid Build Coastguard Worker // during loop pass sequences.
705*9880d681SAndroid Build Coastguard Worker if (VerifyLoopInfo)
706*9880d681SAndroid Build Coastguard Worker LI.verify();
707*9880d681SAndroid Build Coastguard Worker }
708*9880d681SAndroid Build Coastguard Worker
getAnalysisUsage(AnalysisUsage & AU) const709*9880d681SAndroid Build Coastguard Worker void LoopInfoWrapperPass::getAnalysisUsage(AnalysisUsage &AU) const {
710*9880d681SAndroid Build Coastguard Worker AU.setPreservesAll();
711*9880d681SAndroid Build Coastguard Worker AU.addRequired<DominatorTreeWrapperPass>();
712*9880d681SAndroid Build Coastguard Worker }
713*9880d681SAndroid Build Coastguard Worker
print(raw_ostream & OS,const Module *) const714*9880d681SAndroid Build Coastguard Worker void LoopInfoWrapperPass::print(raw_ostream &OS, const Module *) const {
715*9880d681SAndroid Build Coastguard Worker LI.print(OS);
716*9880d681SAndroid Build Coastguard Worker }
717*9880d681SAndroid Build Coastguard Worker
718*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
719*9880d681SAndroid Build Coastguard Worker // LoopBlocksDFS implementation
720*9880d681SAndroid Build Coastguard Worker //
721*9880d681SAndroid Build Coastguard Worker
722*9880d681SAndroid Build Coastguard Worker /// Traverse the loop blocks and store the DFS result.
723*9880d681SAndroid Build Coastguard Worker /// Useful for clients that just want the final DFS result and don't need to
724*9880d681SAndroid Build Coastguard Worker /// visit blocks during the initial traversal.
perform(LoopInfo * LI)725*9880d681SAndroid Build Coastguard Worker void LoopBlocksDFS::perform(LoopInfo *LI) {
726*9880d681SAndroid Build Coastguard Worker LoopBlocksTraversal Traversal(*this, LI);
727*9880d681SAndroid Build Coastguard Worker for (LoopBlocksTraversal::POTIterator POI = Traversal.begin(),
728*9880d681SAndroid Build Coastguard Worker POE = Traversal.end(); POI != POE; ++POI) ;
729*9880d681SAndroid Build Coastguard Worker }
730