/src/llvm-project/llvm/lib/Analysis/LoopPass.cpp
Line | Count | Source (jump to first uncovered line) |
1 | | //===- LoopPass.cpp - Loop Pass and Loop Pass Manager ---------------------===// |
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 file implements LoopPass and LPPassManager. All loop optimization |
10 | | // and transformation passes are derived from LoopPass. LPPassManager is |
11 | | // responsible for managing LoopPasses. |
12 | | // |
13 | | //===----------------------------------------------------------------------===// |
14 | | |
15 | | #include "llvm/Analysis/LoopPass.h" |
16 | | #include "llvm/Analysis/LoopInfo.h" |
17 | | #include "llvm/IR/Dominators.h" |
18 | | #include "llvm/IR/LLVMContext.h" |
19 | | #include "llvm/IR/OptBisect.h" |
20 | | #include "llvm/IR/PassTimingInfo.h" |
21 | | #include "llvm/IR/PrintPasses.h" |
22 | | #include "llvm/InitializePasses.h" |
23 | | #include "llvm/Support/Debug.h" |
24 | | #include "llvm/Support/TimeProfiler.h" |
25 | | #include "llvm/Support/Timer.h" |
26 | | #include "llvm/Support/raw_ostream.h" |
27 | | using namespace llvm; |
28 | | |
29 | | #define DEBUG_TYPE "loop-pass-manager" |
30 | | |
31 | | namespace { |
32 | | |
33 | | /// PrintLoopPass - Print a Function corresponding to a Loop. |
34 | | /// |
35 | | class PrintLoopPassWrapper : public LoopPass { |
36 | | raw_ostream &OS; |
37 | | std::string Banner; |
38 | | |
39 | | public: |
40 | | static char ID; |
41 | 0 | PrintLoopPassWrapper() : LoopPass(ID), OS(dbgs()) {} |
42 | | PrintLoopPassWrapper(raw_ostream &OS, const std::string &Banner) |
43 | 0 | : LoopPass(ID), OS(OS), Banner(Banner) {} |
44 | | |
45 | 0 | void getAnalysisUsage(AnalysisUsage &AU) const override { |
46 | 0 | AU.setPreservesAll(); |
47 | 0 | } |
48 | | |
49 | 0 | bool runOnLoop(Loop *L, LPPassManager &) override { |
50 | 0 | auto BBI = llvm::find_if(L->blocks(), [](BasicBlock *BB) { return BB; }); |
51 | 0 | if (BBI != L->blocks().end() && |
52 | 0 | isFunctionInPrintList((*BBI)->getParent()->getName())) { |
53 | 0 | printLoop(*L, OS, Banner); |
54 | 0 | } |
55 | 0 | return false; |
56 | 0 | } |
57 | | |
58 | 0 | StringRef getPassName() const override { return "Print Loop IR"; } |
59 | | }; |
60 | | |
61 | | char PrintLoopPassWrapper::ID = 0; |
62 | | } |
63 | | |
64 | | //===----------------------------------------------------------------------===// |
65 | | // LPPassManager |
66 | | // |
67 | | |
68 | | char LPPassManager::ID = 0; |
69 | | |
70 | 44.7k | LPPassManager::LPPassManager() : FunctionPass(ID) { |
71 | 44.7k | LI = nullptr; |
72 | 44.7k | CurrentLoop = nullptr; |
73 | 44.7k | } |
74 | | |
75 | | // Insert loop into loop nest (LoopInfo) and loop queue (LQ). |
76 | 0 | void LPPassManager::addLoop(Loop &L) { |
77 | 0 | if (L.isOutermost()) { |
78 | | // This is the top level loop. |
79 | 0 | LQ.push_front(&L); |
80 | 0 | return; |
81 | 0 | } |
82 | | |
83 | | // Insert L into the loop queue after the parent loop. |
84 | 0 | for (auto I = LQ.begin(), E = LQ.end(); I != E; ++I) { |
85 | 0 | if (*I == L.getParentLoop()) { |
86 | | // deque does not support insert after. |
87 | 0 | ++I; |
88 | 0 | LQ.insert(I, 1, &L); |
89 | 0 | return; |
90 | 0 | } |
91 | 0 | } |
92 | 0 | } |
93 | | |
94 | | // Recurse through all subloops and all loops into LQ. |
95 | 33.0k | static void addLoopIntoQueue(Loop *L, std::deque<Loop *> &LQ) { |
96 | 33.0k | LQ.push_back(L); |
97 | 33.0k | for (Loop *I : reverse(*L)) |
98 | 6.56k | addLoopIntoQueue(I, LQ); |
99 | 33.0k | } |
100 | | |
101 | | /// Pass Manager itself does not invalidate any analysis info. |
102 | 44.7k | void LPPassManager::getAnalysisUsage(AnalysisUsage &Info) const { |
103 | | // LPPassManager needs LoopInfo. In the long term LoopInfo class will |
104 | | // become part of LPPassManager. |
105 | 44.7k | Info.addRequired<LoopInfoWrapperPass>(); |
106 | 44.7k | Info.addRequired<DominatorTreeWrapperPass>(); |
107 | 44.7k | Info.setPreservesAll(); |
108 | 44.7k | } |
109 | | |
110 | 0 | void LPPassManager::markLoopAsDeleted(Loop &L) { |
111 | 0 | assert((&L == CurrentLoop || CurrentLoop->contains(&L)) && |
112 | 0 | "Must not delete loop outside the current loop tree!"); |
113 | | // If this loop appears elsewhere within the queue, we also need to remove it |
114 | | // there. However, we have to be careful to not remove the back of the queue |
115 | | // as that is assumed to match the current loop. |
116 | 0 | assert(LQ.back() == CurrentLoop && "Loop queue back isn't the current loop!"); |
117 | 0 | llvm::erase(LQ, &L); |
118 | |
|
119 | 0 | if (&L == CurrentLoop) { |
120 | 0 | CurrentLoopDeleted = true; |
121 | | // Add this loop back onto the back of the queue to preserve our invariants. |
122 | 0 | LQ.push_back(&L); |
123 | 0 | } |
124 | 0 | } |
125 | | |
126 | | /// run - Execute all of the passes scheduled for execution. Keep track of |
127 | | /// whether any of the passes modifies the function, and if so, return true. |
128 | 146k | bool LPPassManager::runOnFunction(Function &F) { |
129 | 146k | auto &LIWP = getAnalysis<LoopInfoWrapperPass>(); |
130 | 146k | LI = &LIWP.getLoopInfo(); |
131 | 146k | Module &M = *F.getParent(); |
132 | | #if 0 |
133 | | DominatorTree *DT = &getAnalysis<DominatorTreeWrapperPass>().getDomTree(); |
134 | | #endif |
135 | 146k | bool Changed = false; |
136 | | |
137 | | // Collect inherited analysis from Module level pass manager. |
138 | 146k | populateInheritedAnalysis(TPM->activeStack); |
139 | | |
140 | | // Populate the loop queue in reverse program order. There is no clear need to |
141 | | // process sibling loops in either forward or reverse order. There may be some |
142 | | // advantage in deleting uses in a later loop before optimizing the |
143 | | // definitions in an earlier loop. If we find a clear reason to process in |
144 | | // forward order, then a forward variant of LoopPassManager should be created. |
145 | | // |
146 | | // Note that LoopInfo::iterator visits loops in reverse program |
147 | | // order. Here, reverse_iterator gives us a forward order, and the LoopQueue |
148 | | // reverses the order a third time by popping from the back. |
149 | 146k | for (Loop *L : reverse(*LI)) |
150 | 26.5k | addLoopIntoQueue(L, LQ); |
151 | | |
152 | 146k | if (LQ.empty()) // No loops, skip calling finalizers |
153 | 126k | return false; |
154 | | |
155 | | // Initialization |
156 | 33.0k | for (Loop *L : LQ) { |
157 | 119k | for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) { |
158 | 86.1k | LoopPass *P = getContainedPass(Index); |
159 | 86.1k | Changed |= P->doInitialization(L, *this); |
160 | 86.1k | } |
161 | 33.0k | } |
162 | | |
163 | | // Walk Loops |
164 | 20.6k | unsigned InstrCount, FunctionSize = 0; |
165 | 20.6k | StringMap<std::pair<unsigned, unsigned>> FunctionToInstrCount; |
166 | 20.6k | bool EmitICRemark = M.shouldEmitInstrCountChangedRemark(); |
167 | | // Collect the initial size of the module and the function we're looking at. |
168 | 20.6k | if (EmitICRemark) { |
169 | 0 | InstrCount = initSizeRemarkInfo(M, FunctionToInstrCount); |
170 | 0 | FunctionSize = F.getInstructionCount(); |
171 | 0 | } |
172 | 53.7k | while (!LQ.empty()) { |
173 | 33.0k | CurrentLoopDeleted = false; |
174 | 33.0k | CurrentLoop = LQ.back(); |
175 | | |
176 | | // Run all passes on the current Loop. |
177 | 119k | for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) { |
178 | 86.1k | LoopPass *P = getContainedPass(Index); |
179 | | |
180 | 86.1k | llvm::TimeTraceScope LoopPassScope("RunLoopPass", P->getPassName()); |
181 | | |
182 | 86.1k | dumpPassInfo(P, EXECUTION_MSG, ON_LOOP_MSG, |
183 | 86.1k | CurrentLoop->getHeader()->getName()); |
184 | 86.1k | dumpRequiredSet(P); |
185 | | |
186 | 86.1k | initializeAnalysisImpl(P); |
187 | | |
188 | 86.1k | bool LocalChanged = false; |
189 | 86.1k | { |
190 | 86.1k | PassManagerPrettyStackEntry X(P, *CurrentLoop->getHeader()); |
191 | 86.1k | TimeRegion PassTimer(getPassTimer(P)); |
192 | | #ifdef EXPENSIVE_CHECKS |
193 | | uint64_t RefHash = P->structuralHash(F); |
194 | | #endif |
195 | 86.1k | LocalChanged = P->runOnLoop(CurrentLoop, *this); |
196 | | |
197 | | #ifdef EXPENSIVE_CHECKS |
198 | | if (!LocalChanged && (RefHash != P->structuralHash(F))) { |
199 | | llvm::errs() << "Pass modifies its input and doesn't report it: " |
200 | | << P->getPassName() << "\n"; |
201 | | llvm_unreachable("Pass modifies its input and doesn't report it"); |
202 | | } |
203 | | #endif |
204 | | |
205 | 86.1k | Changed |= LocalChanged; |
206 | 86.1k | if (EmitICRemark) { |
207 | 0 | unsigned NewSize = F.getInstructionCount(); |
208 | | // Update the size of the function, emit a remark, and update the |
209 | | // size of the module. |
210 | 0 | if (NewSize != FunctionSize) { |
211 | 0 | int64_t Delta = static_cast<int64_t>(NewSize) - |
212 | 0 | static_cast<int64_t>(FunctionSize); |
213 | 0 | emitInstrCountChangedRemark(P, M, Delta, InstrCount, |
214 | 0 | FunctionToInstrCount, &F); |
215 | 0 | InstrCount = static_cast<int64_t>(InstrCount) + Delta; |
216 | 0 | FunctionSize = NewSize; |
217 | 0 | } |
218 | 0 | } |
219 | 86.1k | } |
220 | | |
221 | 86.1k | if (LocalChanged) |
222 | 10.4k | dumpPassInfo(P, MODIFICATION_MSG, ON_LOOP_MSG, |
223 | 10.4k | CurrentLoopDeleted ? "<deleted loop>" |
224 | 10.4k | : CurrentLoop->getName()); |
225 | 86.1k | dumpPreservedSet(P); |
226 | | |
227 | 86.1k | if (!CurrentLoopDeleted) { |
228 | | // Manually check that this loop is still healthy. This is done |
229 | | // instead of relying on LoopInfo::verifyLoop since LoopInfo |
230 | | // is a function pass and it's really expensive to verify every |
231 | | // loop in the function every time. That level of checking can be |
232 | | // enabled with the -verify-loop-info option. |
233 | 86.1k | { |
234 | 86.1k | TimeRegion PassTimer(getPassTimer(&LIWP)); |
235 | 86.1k | CurrentLoop->verifyLoop(); |
236 | 86.1k | } |
237 | | // Here we apply same reasoning as in the above case. Only difference |
238 | | // is that LPPassManager might run passes which do not require LCSSA |
239 | | // form (LoopPassPrinter for example). We should skip verification for |
240 | | // such passes. |
241 | | // FIXME: Loop-sink currently break LCSSA. Fix it and reenable the |
242 | | // verification! |
243 | | #if 0 |
244 | | if (mustPreserveAnalysisID(LCSSAVerificationPass::ID)) |
245 | | assert(CurrentLoop->isRecursivelyLCSSAForm(*DT, *LI)); |
246 | | #endif |
247 | | |
248 | | // Then call the regular verifyAnalysis functions. |
249 | 86.1k | verifyPreservedAnalysis(P); |
250 | | |
251 | 86.1k | F.getContext().yield(); |
252 | 86.1k | } |
253 | | |
254 | 86.1k | if (LocalChanged) |
255 | 10.4k | removeNotPreservedAnalysis(P); |
256 | 86.1k | recordAvailableAnalysis(P); |
257 | 86.1k | removeDeadPasses(P, |
258 | 86.1k | CurrentLoopDeleted ? "<deleted>" |
259 | 86.1k | : CurrentLoop->getHeader()->getName(), |
260 | 86.1k | ON_LOOP_MSG); |
261 | | |
262 | 86.1k | if (CurrentLoopDeleted) |
263 | | // Do not run other passes on this loop. |
264 | 0 | break; |
265 | 86.1k | } |
266 | | |
267 | | // If the loop was deleted, release all the loop passes. This frees up |
268 | | // some memory, and avoids trouble with the pass manager trying to call |
269 | | // verifyAnalysis on them. |
270 | 33.0k | if (CurrentLoopDeleted) { |
271 | 0 | for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) { |
272 | 0 | Pass *P = getContainedPass(Index); |
273 | 0 | freePass(P, "<deleted>", ON_LOOP_MSG); |
274 | 0 | } |
275 | 0 | } |
276 | | |
277 | | // Pop the loop from queue after running all passes. |
278 | 33.0k | LQ.pop_back(); |
279 | 33.0k | } |
280 | | |
281 | | // Finalization |
282 | 75.8k | for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) { |
283 | 55.2k | LoopPass *P = getContainedPass(Index); |
284 | 55.2k | Changed |= P->doFinalization(); |
285 | 55.2k | } |
286 | | |
287 | 20.6k | return Changed; |
288 | 146k | } |
289 | | |
290 | | /// Print passes managed by this manager |
291 | 0 | void LPPassManager::dumpPassStructure(unsigned Offset) { |
292 | 0 | errs().indent(Offset*2) << "Loop Pass Manager\n"; |
293 | 0 | for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) { |
294 | 0 | Pass *P = getContainedPass(Index); |
295 | 0 | P->dumpPassStructure(Offset + 1); |
296 | 0 | dumpLastUses(P, Offset+1); |
297 | 0 | } |
298 | 0 | } |
299 | | |
300 | | |
301 | | //===----------------------------------------------------------------------===// |
302 | | // LoopPass |
303 | | |
304 | | Pass *LoopPass::createPrinterPass(raw_ostream &O, |
305 | 0 | const std::string &Banner) const { |
306 | 0 | return new PrintLoopPassWrapper(O, Banner); |
307 | 0 | } |
308 | | |
309 | | // Check if this pass is suitable for the current LPPassManager, if |
310 | | // available. This pass P is not suitable for a LPPassManager if P |
311 | | // is not preserving higher level analysis info used by other |
312 | | // LPPassManager passes. In such case, pop LPPassManager from the |
313 | | // stack. This will force assignPassManager() to create new |
314 | | // LPPassManger as expected. |
315 | 112k | void LoopPass::preparePassManager(PMStack &PMS) { |
316 | | |
317 | | // Find LPPassManager |
318 | 112k | while (!PMS.empty() && |
319 | 112k | PMS.top()->getPassManagerType() > PMT_LoopPassManager) |
320 | 0 | PMS.pop(); |
321 | | |
322 | | // If this pass is destroying high level information that is used |
323 | | // by other passes that are managed by LPM then do not insert |
324 | | // this pass in current LPM. Use new LPPassManager. |
325 | 112k | if (PMS.top()->getPassManagerType() == PMT_LoopPassManager && |
326 | 112k | !PMS.top()->preserveHigherLevelAnalysis(this)) |
327 | 8.28k | PMS.pop(); |
328 | 112k | } |
329 | | |
330 | | /// Assign pass manager to manage this pass. |
331 | | void LoopPass::assignPassManager(PMStack &PMS, |
332 | 112k | PassManagerType PreferredType) { |
333 | | // Find LPPassManager |
334 | 112k | while (!PMS.empty() && |
335 | 112k | PMS.top()->getPassManagerType() > PMT_LoopPassManager) |
336 | 0 | PMS.pop(); |
337 | | |
338 | 112k | LPPassManager *LPPM; |
339 | 112k | if (PMS.top()->getPassManagerType() == PMT_LoopPassManager) |
340 | 68.0k | LPPM = (LPPassManager*)PMS.top(); |
341 | 44.7k | else { |
342 | | // Create new Loop Pass Manager if it does not exist. |
343 | 44.7k | assert (!PMS.empty() && "Unable to create Loop Pass Manager"); |
344 | 0 | PMDataManager *PMD = PMS.top(); |
345 | | |
346 | | // [1] Create new Loop Pass Manager |
347 | 44.7k | LPPM = new LPPassManager(); |
348 | 44.7k | LPPM->populateInheritedAnalysis(PMS); |
349 | | |
350 | | // [2] Set up new manager's top level manager |
351 | 44.7k | PMTopLevelManager *TPM = PMD->getTopLevelManager(); |
352 | 44.7k | TPM->addIndirectPassManager(LPPM); |
353 | | |
354 | | // [3] Assign manager to manage this new manager. This may create |
355 | | // and push new managers into PMS |
356 | 44.7k | Pass *P = LPPM->getAsPass(); |
357 | 44.7k | TPM->schedulePass(P); |
358 | | |
359 | | // [4] Push new manager into PMS |
360 | 44.7k | PMS.push(LPPM); |
361 | 44.7k | } |
362 | | |
363 | 0 | LPPM->add(this); |
364 | 112k | } |
365 | | |
366 | 0 | static std::string getDescription(const Loop &L) { |
367 | 0 | return "loop"; |
368 | 0 | } |
369 | | |
370 | 59.6k | bool LoopPass::skipLoop(const Loop *L) const { |
371 | 59.6k | const Function *F = L->getHeader()->getParent(); |
372 | 59.6k | if (!F) |
373 | 0 | return false; |
374 | | // Check the opt bisect limit. |
375 | 59.6k | OptPassGate &Gate = F->getContext().getOptPassGate(); |
376 | 59.6k | if (Gate.isEnabled() && |
377 | 59.6k | !Gate.shouldRunPass(this->getPassName(), getDescription(*L))) |
378 | 0 | return true; |
379 | | // Check for the OptimizeNone attribute. |
380 | 59.6k | if (F->hasOptNone()) { |
381 | | // FIXME: Report this to dbgs() only once per function. |
382 | 0 | LLVM_DEBUG(dbgs() << "Skipping pass '" << getPassName() << "' in function " |
383 | 0 | << F->getName() << "\n"); |
384 | | // FIXME: Delete loop from pass manager's queue? |
385 | 0 | return true; |
386 | 0 | } |
387 | 59.6k | return false; |
388 | 59.6k | } |
389 | | |
390 | 8.28k | LCSSAVerificationPass::LCSSAVerificationPass() : FunctionPass(ID) { |
391 | 8.28k | initializeLCSSAVerificationPassPass(*PassRegistry::getPassRegistry()); |
392 | 8.28k | } |
393 | | |
394 | | char LCSSAVerificationPass::ID = 0; |
395 | | INITIALIZE_PASS(LCSSAVerificationPass, "lcssa-verification", "LCSSA Verifier", |
396 | | false, false) |