blob: 717e0169b78f5311bbe7467358fc06426e676860 [file] [log] [blame]
Devang Patel16a31c42007-02-22 08:56:17 +00001//===- LoopPass.cpp - Loop Pass and Loop Pass Manager ---------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner4ee451d2007-12-29 20:36:04 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Devang Patel16a31c42007-02-22 08:56:17 +00007//
8//===----------------------------------------------------------------------===//
9//
10// This file implements LoopPass and LPPassManager. All loop optimization
11// and transformation passes are derived from LoopPass. LPPassManager is
12// responsible for managing LoopPasses.
13//
14//===----------------------------------------------------------------------===//
15
16#include "llvm/Analysis/LoopPass.h"
David Greene5c8aa952010-04-02 23:17:14 +000017#include "llvm/Assembly/PrintModulePass.h"
18#include "llvm/Support/Debug.h"
Chris Lattnera782e752010-03-30 04:03:22 +000019#include "llvm/Support/Timer.h"
Devang Patel16a31c42007-02-22 08:56:17 +000020using namespace llvm;
21
David Greene5c8aa952010-04-02 23:17:14 +000022namespace {
23
24/// PrintLoopPass - Print a Function corresponding to a Loop.
25///
26class PrintLoopPass : public LoopPass {
27private:
28 std::string Banner;
29 raw_ostream &Out; // raw_ostream to print on.
30
31public:
32 static char ID;
Owen Anderson9ccaf532010-08-05 23:42:04 +000033 PrintLoopPass() : LoopPass(ID), Out(dbgs()) {}
David Greene5c8aa952010-04-02 23:17:14 +000034 PrintLoopPass(const std::string &B, raw_ostream &o)
Owen Anderson9ccaf532010-08-05 23:42:04 +000035 : LoopPass(ID), Banner(B), Out(o) {}
David Greene5c8aa952010-04-02 23:17:14 +000036
37 virtual void getAnalysisUsage(AnalysisUsage &AU) const {
38 AU.setPreservesAll();
39 }
40
41 bool runOnLoop(Loop *L, LPPassManager &) {
42 Out << Banner;
43 for (Loop::block_iterator b = L->block_begin(), be = L->block_end();
44 b != be;
45 ++b) {
46 (*b)->print(Out);
47 }
48 return false;
49 }
50};
51
52char PrintLoopPass::ID = 0;
53}
54
Devang Patel16a31c42007-02-22 08:56:17 +000055//===----------------------------------------------------------------------===//
56// LPPassManager
57//
Devang Patel794fd752007-05-01 21:15:47 +000058
Devang Patel19974732007-05-03 01:11:54 +000059char LPPassManager::ID = 0;
Devang Patel16a31c42007-02-22 08:56:17 +000060
Devang Patel794fd752007-05-01 21:15:47 +000061LPPassManager::LPPassManager(int Depth)
Owen Anderson9ccaf532010-08-05 23:42:04 +000062 : FunctionPass(ID), PMDataManager(Depth) {
Devang Patel8ded5852007-02-23 00:16:44 +000063 skipThisLoop = false;
64 redoThisLoop = false;
Devang Patel7a9a0692007-03-06 18:38:33 +000065 LI = NULL;
66 CurrentLoop = NULL;
Devang Pateld0e6e332007-02-22 23:30:07 +000067}
68
Dan Gohmane6acf362008-07-11 22:51:32 +000069/// Delete loop from the loop queue and loop hierarchy (LoopInfo).
Devang Patel5afdc7d2007-02-23 00:10:16 +000070void LPPassManager::deleteLoopFromQueue(Loop *L) {
Devang Patel7a9a0692007-03-06 18:38:33 +000071
72 if (Loop *ParentLoop = L->getParentLoop()) { // Not a top-level loop.
73 // Reparent all of the blocks in this loop. Since BBLoop had a parent,
74 // they are now all in it.
75 for (Loop::block_iterator I = L->block_begin(), E = L->block_end();
76 I != E; ++I)
77 if (LI->getLoopFor(*I) == L) // Don't change blocks in subloops.
78 LI->changeLoopFor(*I, ParentLoop);
79
80 // Remove the loop from its parent loop.
81 for (Loop::iterator I = ParentLoop->begin(), E = ParentLoop->end();;
82 ++I) {
83 assert(I != E && "Couldn't find loop");
84 if (*I == L) {
85 ParentLoop->removeChildLoop(I);
86 break;
87 }
88 }
89
90 // Move all subloops into the parent loop.
Dan Gohmancb406c22007-10-03 19:26:29 +000091 while (!L->empty())
Devang Patel7a9a0692007-03-06 18:38:33 +000092 ParentLoop->addChildLoop(L->removeChildLoop(L->end()-1));
93 } else {
94 // Reparent all of the blocks in this loop. Since BBLoop had no parent,
95 // they no longer in a loop at all.
96
97 for (unsigned i = 0; i != L->getBlocks().size(); ++i) {
98 // Don't change blocks in subloops.
99 if (LI->getLoopFor(L->getBlocks()[i]) == L) {
100 LI->removeBlock(L->getBlocks()[i]);
101 --i;
102 }
103 }
104
105 // Remove the loop from the top-level LoopInfo object.
106 for (LoopInfo::iterator I = LI->begin(), E = LI->end();; ++I) {
107 assert(I != E && "Couldn't find loop");
108 if (*I == L) {
109 LI->removeLoop(I);
110 break;
111 }
112 }
113
114 // Move all of the subloops to the top-level.
Dan Gohmancb406c22007-10-03 19:26:29 +0000115 while (!L->empty())
Devang Patel7a9a0692007-03-06 18:38:33 +0000116 LI->addTopLevelLoop(L->removeChildLoop(L->end()-1));
117 }
118
119 delete L;
120
121 // If L is current loop then skip rest of the passes and let
122 // runOnFunction remove L from LQ. Otherwise, remove L from LQ now
123 // and continue applying other passes on CurrentLoop.
124 if (CurrentLoop == L) {
125 skipThisLoop = true;
126 return;
127 }
128
129 for (std::deque<Loop *>::iterator I = LQ.begin(),
130 E = LQ.end(); I != E; ++I) {
131 if (*I == L) {
132 LQ.erase(I);
133 break;
134 }
135 }
Devang Patel5afdc7d2007-02-23 00:10:16 +0000136}
137
Devang Patela885c062007-03-06 19:00:02 +0000138// Inset loop into loop nest (LoopInfo) and loop queue (LQ).
139void LPPassManager::insertLoop(Loop *L, Loop *ParentLoop) {
140
141 assert (CurrentLoop != L && "Cannot insert CurrentLoop");
142
143 // Insert into loop nest
144 if (ParentLoop)
145 ParentLoop->addChildLoop(L);
146 else
147 LI->addTopLevelLoop(L);
148
Dan Gohman3069b312009-09-27 23:49:43 +0000149 insertLoopIntoQueue(L);
150}
151
152void LPPassManager::insertLoopIntoQueue(Loop *L) {
Devang Patela885c062007-03-06 19:00:02 +0000153 // Insert L into loop queue
154 if (L == CurrentLoop)
155 redoLoop(L);
Dan Gohman3069b312009-09-27 23:49:43 +0000156 else if (!L->getParentLoop())
Devang Patela885c062007-03-06 19:00:02 +0000157 // This is top level loop.
158 LQ.push_front(L);
159 else {
Dan Gohman3069b312009-09-27 23:49:43 +0000160 // Insert L after the parent loop.
Devang Patela885c062007-03-06 19:00:02 +0000161 for (std::deque<Loop *>::iterator I = LQ.begin(),
162 E = LQ.end(); I != E; ++I) {
Dan Gohman3069b312009-09-27 23:49:43 +0000163 if (*I == L->getParentLoop()) {
Devang Patela885c062007-03-06 19:00:02 +0000164 // deque does not support insert after.
165 ++I;
166 LQ.insert(I, 1, L);
167 break;
168 }
169 }
170 }
171}
172
Devang Patel8ded5852007-02-23 00:16:44 +0000173// Reoptimize this loop. LPPassManager will re-insert this loop into the
174// queue. This allows LoopPass to change loop nest for the loop. This
175// utility may send LPPassManager into infinite loops so use caution.
176void LPPassManager::redoLoop(Loop *L) {
Devang Patel1bc89362007-03-07 00:26:10 +0000177 assert (CurrentLoop == L && "Can redo only CurrentLoop");
Devang Patel8ded5852007-02-23 00:16:44 +0000178 redoThisLoop = true;
179}
180
Devang Patelc7e49c02007-07-31 08:00:57 +0000181/// cloneBasicBlockSimpleAnalysis - Invoke cloneBasicBlockAnalysis hook for
182/// all loop passes.
183void LPPassManager::cloneBasicBlockSimpleAnalysis(BasicBlock *From,
184 BasicBlock *To, Loop *L) {
185 for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
Chris Lattner77c95ed2010-01-22 05:37:10 +0000186 LoopPass *LP = (LoopPass *)getContainedPass(Index);
Devang Patelc7e49c02007-07-31 08:00:57 +0000187 LP->cloneBasicBlockAnalysis(From, To, L);
188 }
189}
190
191/// deleteSimpleAnalysisValue - Invoke deleteAnalysisValue hook for all passes.
192void LPPassManager::deleteSimpleAnalysisValue(Value *V, Loop *L) {
Devang Patel575ec802009-03-25 23:57:48 +0000193 if (BasicBlock *BB = dyn_cast<BasicBlock>(V)) {
194 for (BasicBlock::iterator BI = BB->begin(), BE = BB->end(); BI != BE;
195 ++BI) {
196 Instruction &I = *BI;
197 deleteSimpleAnalysisValue(&I, L);
198 }
199 }
Devang Patelc7e49c02007-07-31 08:00:57 +0000200 for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
Chris Lattner77c95ed2010-01-22 05:37:10 +0000201 LoopPass *LP = (LoopPass *)getContainedPass(Index);
Devang Patelc7e49c02007-07-31 08:00:57 +0000202 LP->deleteAnalysisValue(V, L);
203 }
204}
205
206
Devang Patel643a79b2007-02-22 23:45:15 +0000207// Recurse through all subloops and all loops into LQ.
Devang Patel30159722007-03-06 02:30:46 +0000208static void addLoopIntoQueue(Loop *L, std::deque<Loop *> &LQ) {
Devang Patel622adea2007-03-06 19:50:49 +0000209 LQ.push_back(L);
Devang Patel643a79b2007-02-22 23:45:15 +0000210 for (Loop::iterator I = L->begin(), E = L->end(); I != E; ++I)
211 addLoopIntoQueue(*I, LQ);
Devang Patel643a79b2007-02-22 23:45:15 +0000212}
213
Devang Patelc37177e2007-03-06 19:11:25 +0000214/// Pass Manager itself does not invalidate any analysis info.
215void LPPassManager::getAnalysisUsage(AnalysisUsage &Info) const {
216 // LPPassManager needs LoopInfo. In the long term LoopInfo class will
217 // become part of LPPassManager.
218 Info.addRequired<LoopInfo>();
219 Info.setPreservesAll();
220}
221
Devang Patel16a31c42007-02-22 08:56:17 +0000222/// run - Execute all of the passes scheduled for execution. Keep track of
223/// whether any of the passes modifies the function, and if so, return true.
224bool LPPassManager::runOnFunction(Function &F) {
Devang Patelc37177e2007-03-06 19:11:25 +0000225 LI = &getAnalysis<LoopInfo>();
Devang Patel16a31c42007-02-22 08:56:17 +0000226 bool Changed = false;
227
Devang Patel70c09c52008-07-03 07:02:30 +0000228 // Collect inherited analysis from Module level pass manager.
229 populateInheritedAnalysis(TPM->activeStack);
230
Devang Patel643a79b2007-02-22 23:45:15 +0000231 // Populate Loop Queue
Devang Patelc37177e2007-03-06 19:11:25 +0000232 for (LoopInfo::iterator I = LI->begin(), E = LI->end(); I != E; ++I)
Devang Patel643a79b2007-02-22 23:45:15 +0000233 addLoopIntoQueue(*I, LQ);
234
Torok Edwin1970a892009-06-29 18:49:09 +0000235 if (LQ.empty()) // No loops, skip calling finalizers
236 return false;
237
Devang Patela5057d02007-03-06 16:59:03 +0000238 // Initialization
239 for (std::deque<Loop *>::const_iterator I = LQ.begin(), E = LQ.end();
240 I != E; ++I) {
241 Loop *L = *I;
242 for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
Chris Lattner77c95ed2010-01-22 05:37:10 +0000243 LoopPass *P = (LoopPass*)getContainedPass(Index);
244 Changed |= P->doInitialization(L, *this);
Devang Patela5057d02007-03-06 16:59:03 +0000245 }
246 }
247
Devang Patel16a31c42007-02-22 08:56:17 +0000248 // Walk Loops
Devang Patel30159722007-03-06 02:30:46 +0000249 while (!LQ.empty()) {
Devang Patel643a79b2007-02-22 23:45:15 +0000250
Devang Patel7a9a0692007-03-06 18:38:33 +0000251 CurrentLoop = LQ.back();
Devang Patel5afdc7d2007-02-23 00:10:16 +0000252 skipThisLoop = false;
Devang Patel8ded5852007-02-23 00:16:44 +0000253 redoThisLoop = false;
Devang Patel5afdc7d2007-02-23 00:10:16 +0000254
Dan Gohman1edaef62009-09-27 23:52:07 +0000255 // Run all passes on the current Loop.
Devang Patel16a31c42007-02-22 08:56:17 +0000256 for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
Chris Lattner77c95ed2010-01-22 05:37:10 +0000257 LoopPass *P = (LoopPass*)getContainedPass(Index);
Devang Patel16a31c42007-02-22 08:56:17 +0000258
Dan Gohman6d594a92009-09-28 15:07:18 +0000259 dumpPassInfo(P, EXECUTION_MSG, ON_LOOP_MSG,
Benjamin Kramer41d43eb2010-03-31 16:06:22 +0000260 CurrentLoop->getHeader()->getName());
Chris Lattner0dabb7e2008-08-08 15:14:09 +0000261 dumpRequiredSet(P);
Devang Patel16a31c42007-02-22 08:56:17 +0000262
263 initializeAnalysisImpl(P);
264
Chris Lattnerd6f16582009-03-06 06:45:05 +0000265 {
Chris Lattner77c95ed2010-01-22 05:37:10 +0000266 PassManagerPrettyStackEntry X(P, *CurrentLoop->getHeader());
Chris Lattnera782e752010-03-30 04:03:22 +0000267 TimeRegion PassTimer(getPassTimer(P));
268
Chris Lattner77c95ed2010-01-22 05:37:10 +0000269 Changed |= P->runOnLoop(CurrentLoop, *this);
Chris Lattnerd6f16582009-03-06 06:45:05 +0000270 }
Devang Patel16a31c42007-02-22 08:56:17 +0000271
272 if (Changed)
Dan Gohman6d594a92009-09-28 15:07:18 +0000273 dumpPassInfo(P, MODIFICATION_MSG, ON_LOOP_MSG,
Dan Gohman322b95c2009-09-28 15:40:01 +0000274 skipThisLoop ? "<deleted>" :
Benjamin Kramer41d43eb2010-03-31 16:06:22 +0000275 CurrentLoop->getHeader()->getName());
Chris Lattner0dabb7e2008-08-08 15:14:09 +0000276 dumpPreservedSet(P);
Devang Patel58e0ef12007-07-19 18:02:32 +0000277
Dan Gohman9450b0e2009-09-28 00:27:48 +0000278 if (!skipThisLoop) {
279 // Manually check that this loop is still healthy. This is done
280 // instead of relying on LoopInfo::verifyLoop since LoopInfo
281 // is a function pass and it's really expensive to verify every
282 // loop in the function every time. That level of checking can be
283 // enabled with the -verify-loop-info option.
Chris Lattnera782e752010-03-30 04:03:22 +0000284 {
285 TimeRegion PassTimer(getPassTimer(LI));
286 CurrentLoop->verifyLoop();
287 }
Dan Gohman9450b0e2009-09-28 00:27:48 +0000288
289 // Then call the regular verifyAnalysis functions.
Chris Lattner77c95ed2010-01-22 05:37:10 +0000290 verifyPreservedAnalysis(P);
Dan Gohman9450b0e2009-09-28 00:27:48 +0000291 }
Dan Gohmandd12de62009-09-03 15:09:24 +0000292
Devang Patel16a31c42007-02-22 08:56:17 +0000293 removeNotPreservedAnalysis(P);
294 recordAvailableAnalysis(P);
Dan Gohman6d594a92009-09-28 15:07:18 +0000295 removeDeadPasses(P,
296 skipThisLoop ? "<deleted>" :
Benjamin Kramer41d43eb2010-03-31 16:06:22 +0000297 CurrentLoop->getHeader()->getName(),
Dan Gohman6d594a92009-09-28 15:07:18 +0000298 ON_LOOP_MSG);
Devang Patel5afdc7d2007-02-23 00:10:16 +0000299
300 if (skipThisLoop)
301 // Do not run other passes on this loop.
302 break;
Devang Patel16a31c42007-02-22 08:56:17 +0000303 }
Devang Patel643a79b2007-02-22 23:45:15 +0000304
Dan Gohman97029012009-09-27 23:43:07 +0000305 // If the loop was deleted, release all the loop passes. This frees up
306 // some memory, and avoids trouble with the pass manager trying to call
307 // verifyAnalysis on them.
308 if (skipThisLoop)
309 for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
310 Pass *P = getContainedPass(Index);
Dan Gohman6d594a92009-09-28 15:07:18 +0000311 freePass(P, "<deleted>", ON_LOOP_MSG);
Dan Gohman97029012009-09-27 23:43:07 +0000312 }
313
Devang Patel643a79b2007-02-22 23:45:15 +0000314 // Pop the loop from queue after running all passes.
Devang Patel30159722007-03-06 02:30:46 +0000315 LQ.pop_back();
Devang Patel8ded5852007-02-23 00:16:44 +0000316
317 if (redoThisLoop)
Devang Patel7a9a0692007-03-06 18:38:33 +0000318 LQ.push_back(CurrentLoop);
Devang Patel16a31c42007-02-22 08:56:17 +0000319 }
Devang Patela5057d02007-03-06 16:59:03 +0000320
321 // Finalization
322 for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
Chris Lattner77c95ed2010-01-22 05:37:10 +0000323 LoopPass *P = (LoopPass *)getContainedPass(Index);
324 Changed |= P->doFinalization();
Devang Patela5057d02007-03-06 16:59:03 +0000325 }
Devang Patel16a31c42007-02-22 08:56:17 +0000326
327 return Changed;
328}
329
Dan Gohman189c6352009-02-17 19:41:26 +0000330/// Print passes managed by this manager
331void LPPassManager::dumpPassStructure(unsigned Offset) {
Chris Lattner103289e2009-08-23 07:19:13 +0000332 errs().indent(Offset*2) << "Loop Pass Manager\n";
Dan Gohman189c6352009-02-17 19:41:26 +0000333 for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
334 Pass *P = getContainedPass(Index);
335 P->dumpPassStructure(Offset + 1);
336 dumpLastUses(P, Offset+1);
337 }
338}
339
Devang Patel16a31c42007-02-22 08:56:17 +0000340
Devang Patelbfd59052007-02-23 00:36:57 +0000341//===----------------------------------------------------------------------===//
342// LoopPass
343
David Greene5c8aa952010-04-02 23:17:14 +0000344Pass *LoopPass::createPrinterPass(raw_ostream &O,
345 const std::string &Banner) const {
346 return new PrintLoopPass(Banner, O);
347}
348
Devang Patel22033be2007-03-06 17:59:37 +0000349// Check if this pass is suitable for the current LPPassManager, if
350// available. This pass P is not suitable for a LPPassManager if P
351// is not preserving higher level analysis info used by other
352// LPPassManager passes. In such case, pop LPPassManager from the
353// stack. This will force assignPassManager() to create new
354// LPPassManger as expected.
355void LoopPass::preparePassManager(PMStack &PMS) {
356
357 // Find LPPassManager
Duncan Sands20d824b2007-07-19 09:42:01 +0000358 while (!PMS.empty() &&
359 PMS.top()->getPassManagerType() > PMT_LoopPassManager)
360 PMS.pop();
Devang Patel22033be2007-03-06 17:59:37 +0000361
Devang Patel22033be2007-03-06 17:59:37 +0000362 // If this pass is destroying high level information that is used
363 // by other passes that are managed by LPM then do not insert
364 // this pass in current LPM. Use new LPPassManager.
Chris Lattner77c95ed2010-01-22 05:37:10 +0000365 if (PMS.top()->getPassManagerType() == PMT_LoopPassManager &&
366 !PMS.top()->preserveHigherLevelAnalysis(this))
Devang Patel22033be2007-03-06 17:59:37 +0000367 PMS.pop();
368}
369
Devang Patelbfd59052007-02-23 00:36:57 +0000370/// Assign pass manager to manage this pass.
371void LoopPass::assignPassManager(PMStack &PMS,
372 PassManagerType PreferredType) {
373 // Find LPPassManager
Duncan Sands20d824b2007-07-19 09:42:01 +0000374 while (!PMS.empty() &&
375 PMS.top()->getPassManagerType() > PMT_LoopPassManager)
376 PMS.pop();
Devang Patelbfd59052007-02-23 00:36:57 +0000377
Chris Lattner77c95ed2010-01-22 05:37:10 +0000378 LPPassManager *LPPM;
379 if (PMS.top()->getPassManagerType() == PMT_LoopPassManager)
380 LPPM = (LPPassManager*)PMS.top();
381 else {
382 // Create new Loop Pass Manager if it does not exist.
Devang Patelbfd59052007-02-23 00:36:57 +0000383 assert (!PMS.empty() && "Unable to create Loop Pass Manager");
384 PMDataManager *PMD = PMS.top();
385
386 // [1] Create new Call Graph Pass Manager
387 LPPM = new LPPassManager(PMD->getDepth() + 1);
Devang Patel1bc89362007-03-07 00:26:10 +0000388 LPPM->populateInheritedAnalysis(PMS);
Devang Patelbfd59052007-02-23 00:36:57 +0000389
390 // [2] Set up new manager's top level manager
391 PMTopLevelManager *TPM = PMD->getTopLevelManager();
392 TPM->addIndirectPassManager(LPPM);
393
394 // [3] Assign manager to manage this new manager. This may create
395 // and push new managers into PMS
Chris Lattner77c95ed2010-01-22 05:37:10 +0000396 Pass *P = LPPM->getAsPass();
Devang Patelc37177e2007-03-06 19:11:25 +0000397 TPM->schedulePass(P);
Devang Patelbfd59052007-02-23 00:36:57 +0000398
399 // [4] Push new manager into PMS
400 PMS.push(LPPM);
401 }
402
403 LPPM->add(this);
404}