blob: 1e3b48ee686d1f5c93cba8468521d12f98ba37ed [file] [log] [blame]
Devang Patel6e5a1132006-11-07 21:31:57 +00001//===- PassManager.cpp - LLVM Pass Infrastructure Implementation ----------===//
2//
3// The LLVM Compiler Infrastructure
4//
Devang Patelca58e352006-11-08 10:05:38 +00005// This file was developed by Devang Patel and is distributed under
Devang Patel6e5a1132006-11-07 21:31:57 +00006// the University of Illinois Open Source License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file implements the LLVM Pass Manager infrastructure.
11//
12//===----------------------------------------------------------------------===//
13
14
Devang Patele7599552007-01-12 18:52:44 +000015#include "llvm/PassManagers.h"
Devang Patelf1567a52006-12-13 20:03:48 +000016#include "llvm/Support/CommandLine.h"
Devang Patelb8817b92006-12-14 00:59:42 +000017#include "llvm/Support/Timer.h"
Devang Patel6e5a1132006-11-07 21:31:57 +000018#include "llvm/Module.h"
Devang Patelff631ae2006-11-15 01:27:05 +000019#include "llvm/ModuleProvider.h"
Bill Wendlingdfc91892006-11-28 02:09:03 +000020#include "llvm/Support/Streams.h"
Devang Patelb8817b92006-12-14 00:59:42 +000021#include "llvm/Support/ManagedStatic.h"
Devang Patela9844592006-11-11 01:31:05 +000022#include <vector>
Devang Patelf60b5d92006-11-14 01:59:59 +000023#include <map>
Devang Patelffca9102006-12-15 19:39:30 +000024
Devang Patele7599552007-01-12 18:52:44 +000025// See PassManagers.h for Pass Manager infrastructure overview.
Devang Patel6fea2852006-12-07 18:23:30 +000026
Devang Patelf1567a52006-12-13 20:03:48 +000027namespace llvm {
28
29//===----------------------------------------------------------------------===//
30// Pass debugging information. Often it is useful to find out what pass is
31// running when a crash occurs in a utility. When this library is compiled with
32// debugging on, a command line option (--debug-pass) is enabled that causes the
33// pass name to be printed before it executes.
34//
35
Devang Patel03fb5872006-12-13 21:13:31 +000036// Different debug levels that can be enabled...
37enum PassDebugLevel {
38 None, Arguments, Structure, Executions, Details
39};
40
Devang Patelf1567a52006-12-13 20:03:48 +000041static cl::opt<enum PassDebugLevel>
42PassDebugging_New("debug-pass", cl::Hidden,
43 cl::desc("Print PassManager debugging information"),
44 cl::values(
Devang Patel03fb5872006-12-13 21:13:31 +000045 clEnumVal(None , "disable debug output"),
46 clEnumVal(Arguments , "print pass arguments to pass to 'opt'"),
47 clEnumVal(Structure , "print pass structure before run()"),
48 clEnumVal(Executions, "print pass name before it is executed"),
49 clEnumVal(Details , "print pass details when it is executed"),
Devang Patelf1567a52006-12-13 20:03:48 +000050 clEnumValEnd));
51} // End of llvm namespace
52
Devang Patelffca9102006-12-15 19:39:30 +000053namespace {
Devang Patelafb1f3622006-12-12 22:35:25 +000054
Devang Patelf33f3eb2006-12-07 19:21:29 +000055//===----------------------------------------------------------------------===//
Devang Patel67d6a5e2006-12-19 19:46:59 +000056// BBPassManager
Devang Patel10c2ca62006-12-12 22:47:13 +000057//
Devang Patel67d6a5e2006-12-19 19:46:59 +000058/// BBPassManager manages BasicBlockPass. It batches all the
Devang Patelca58e352006-11-08 10:05:38 +000059/// pass together and sequence them to process one basic block before
60/// processing next basic block.
Devang Patel67d6a5e2006-12-19 19:46:59 +000061class VISIBILITY_HIDDEN BBPassManager : public PMDataManager,
62 public FunctionPass {
Devang Patelca58e352006-11-08 10:05:38 +000063
64public:
Devang Patel67d6a5e2006-12-19 19:46:59 +000065 BBPassManager(int Depth) : PMDataManager(Depth) { }
Devang Patelca58e352006-11-08 10:05:38 +000066
Devang Patelca58e352006-11-08 10:05:38 +000067 /// Execute all of the passes scheduled for execution. Keep track of
68 /// whether any of the passes modifies the function, and if so, return true.
69 bool runOnFunction(Function &F);
70
Devang Patelf9d96b92006-12-07 19:57:52 +000071 /// Pass Manager itself does not invalidate any analysis info.
72 void getAnalysisUsage(AnalysisUsage &Info) const {
73 Info.setPreservesAll();
74 }
75
Devang Patel475c4532006-12-08 00:59:05 +000076 bool doInitialization(Module &M);
77 bool doInitialization(Function &F);
78 bool doFinalization(Module &M);
79 bool doFinalization(Function &F);
80
Devang Pateleda56172006-12-12 23:34:33 +000081 // Print passes managed by this manager
82 void dumpPassStructure(unsigned Offset) {
Devang Patelffca9102006-12-15 19:39:30 +000083 llvm::cerr << std::string(Offset*2, ' ') << "BasicBlockPass Manager\n";
Devang Patelabfbe3b2006-12-16 00:56:26 +000084 for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
85 BasicBlockPass *BP = getContainedPass(Index);
86 BP->dumpPassStructure(Offset + 1);
87 dumpLastUses(BP, Offset+1);
Devang Pateleda56172006-12-12 23:34:33 +000088 }
89 }
Devang Patelabfbe3b2006-12-16 00:56:26 +000090
91 BasicBlockPass *getContainedPass(unsigned N) {
92 assert ( N < PassVector.size() && "Pass number out of range!");
93 BasicBlockPass *BP = static_cast<BasicBlockPass *>(PassVector[N]);
94 return BP;
95 }
Devang Patel3b3f8992007-01-11 01:10:25 +000096
97 virtual PassManagerType getPassManagerType() {
98 return PMT_BasicBlockPassManager;
99 }
Devang Patelca58e352006-11-08 10:05:38 +0000100};
101
Devang Patele7599552007-01-12 18:52:44 +0000102}
Devang Patel67d6a5e2006-12-19 19:46:59 +0000103
Devang Patele7599552007-01-12 18:52:44 +0000104namespace llvm {
Devang Patelca58e352006-11-08 10:05:38 +0000105
Devang Patel10c2ca62006-12-12 22:47:13 +0000106//===----------------------------------------------------------------------===//
Devang Patel67d6a5e2006-12-19 19:46:59 +0000107// FunctionPassManagerImpl
Devang Patel10c2ca62006-12-12 22:47:13 +0000108//
Devang Patel67d6a5e2006-12-19 19:46:59 +0000109/// FunctionPassManagerImpl manages FPPassManagers
110class FunctionPassManagerImpl : public Pass,
Devang Patelad98d232007-01-11 22:15:30 +0000111 public PMDataManager,
112 public PMTopLevelManager {
Devang Patel67d6a5e2006-12-19 19:46:59 +0000113public:
114
Devang Patel4268fc02007-01-16 02:00:38 +0000115 FunctionPassManagerImpl(int Depth) : PMDataManager(Depth),
116 PMTopLevelManager(TLM_Function) { }
Devang Patel67d6a5e2006-12-19 19:46:59 +0000117
118 /// add - Add a pass to the queue of passes to run. This passes ownership of
119 /// the Pass to the PassManager. When the PassManager is destroyed, the pass
120 /// will be destroyed as well, so there is no need to delete the pass. This
121 /// implies that all passes MUST be allocated with 'new'.
122 void add(Pass *P) {
123 schedulePass(P);
124 }
125
126 /// run - Execute all of the passes scheduled for execution. Keep track of
127 /// whether any of the passes modifies the module, and if so, return true.
128 bool run(Function &F);
129
130 /// doInitialization - Run all of the initializers for the function passes.
131 ///
132 bool doInitialization(Module &M);
133
134 /// doFinalization - Run all of the initializers for the function passes.
135 ///
136 bool doFinalization(Module &M);
137
138 /// Pass Manager itself does not invalidate any analysis info.
139 void getAnalysisUsage(AnalysisUsage &Info) const {
140 Info.setPreservesAll();
141 }
142
143 inline void addTopLevelPass(Pass *P) {
144
145 if (ImmutablePass *IP = dynamic_cast<ImmutablePass *> (P)) {
146
147 // P is a immutable pass and it will be managed by this
148 // top level manager. Set up analysis resolver to connect them.
Devang Patelb66334b2007-01-05 22:47:07 +0000149 AnalysisResolver *AR = new AnalysisResolver(*this);
Devang Patel67d6a5e2006-12-19 19:46:59 +0000150 P->setResolver(AR);
151 initializeAnalysisImpl(P);
152 addImmutablePass(IP);
153 recordAvailableAnalysis(IP);
Devang Patel0f080042007-01-12 17:23:48 +0000154 } else {
Devang Patel0f080042007-01-12 17:23:48 +0000155 P->assignPassManager(activeStack);
Devang Patel67d6a5e2006-12-19 19:46:59 +0000156 }
Devang Patel0f080042007-01-12 17:23:48 +0000157
Devang Patel67d6a5e2006-12-19 19:46:59 +0000158 }
159
160 FPPassManager *getContainedManager(unsigned N) {
161 assert ( N < PassManagers.size() && "Pass number out of range!");
162 FPPassManager *FP = static_cast<FPPassManager *>(PassManagers[N]);
163 return FP;
164 }
165
Devang Patel67d6a5e2006-12-19 19:46:59 +0000166};
167
168//===----------------------------------------------------------------------===//
169// MPPassManager
170//
171/// MPPassManager manages ModulePasses and function pass managers.
Devang Patelca58e352006-11-08 10:05:38 +0000172/// It batches all Module passes passes and function pass managers together and
173/// sequence them to process one module.
Devang Patel67d6a5e2006-12-19 19:46:59 +0000174class MPPassManager : public Pass, public PMDataManager {
Devang Patelca58e352006-11-08 10:05:38 +0000175
176public:
Devang Patel0f080042007-01-12 17:23:48 +0000177 MPPassManager(int Depth) : PMDataManager(Depth) { }
Devang Patelca58e352006-11-08 10:05:38 +0000178
179 /// run - Execute all of the passes scheduled for execution. Keep track of
180 /// whether any of the passes modifies the module, and if so, return true.
181 bool runOnModule(Module &M);
Devang Patelebba9702006-11-13 22:40:09 +0000182
Devang Patelf9d96b92006-12-07 19:57:52 +0000183 /// Pass Manager itself does not invalidate any analysis info.
184 void getAnalysisUsage(AnalysisUsage &Info) const {
185 Info.setPreservesAll();
186 }
187
Devang Pateleda56172006-12-12 23:34:33 +0000188 // Print passes managed by this manager
189 void dumpPassStructure(unsigned Offset) {
190 llvm::cerr << std::string(Offset*2, ' ') << "ModulePass Manager\n";
Devang Patelabfbe3b2006-12-16 00:56:26 +0000191 for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
192 ModulePass *MP = getContainedPass(Index);
193 MP->dumpPassStructure(Offset + 1);
194 dumpLastUses(MP, Offset+1);
Devang Pateleda56172006-12-12 23:34:33 +0000195 }
196 }
197
Devang Patelabfbe3b2006-12-16 00:56:26 +0000198 ModulePass *getContainedPass(unsigned N) {
199 assert ( N < PassVector.size() && "Pass number out of range!");
200 ModulePass *MP = static_cast<ModulePass *>(PassVector[N]);
201 return MP;
202 }
203
Devang Patel3b3f8992007-01-11 01:10:25 +0000204 virtual PassManagerType getPassManagerType() { return PMT_ModulePassManager; }
Devang Patelca58e352006-11-08 10:05:38 +0000205};
206
Devang Patel10c2ca62006-12-12 22:47:13 +0000207//===----------------------------------------------------------------------===//
Devang Patel67d6a5e2006-12-19 19:46:59 +0000208// PassManagerImpl
Devang Patel10c2ca62006-12-12 22:47:13 +0000209//
Devang Patel67d6a5e2006-12-19 19:46:59 +0000210/// PassManagerImpl manages MPPassManagers
211class PassManagerImpl : public Pass,
Devang Patelad98d232007-01-11 22:15:30 +0000212 public PMDataManager,
213 public PMTopLevelManager {
Devang Patel376fefa2006-11-08 10:29:57 +0000214
215public:
216
Devang Patel4268fc02007-01-16 02:00:38 +0000217 PassManagerImpl(int Depth) : PMDataManager(Depth),
218 PMTopLevelManager(TLM_Pass) { }
Devang Patel4c36e6b2006-12-07 23:24:58 +0000219
Devang Patel376fefa2006-11-08 10:29:57 +0000220 /// add - Add a pass to the queue of passes to run. This passes ownership of
221 /// the Pass to the PassManager. When the PassManager is destroyed, the pass
222 /// will be destroyed as well, so there is no need to delete the pass. This
223 /// implies that all passes MUST be allocated with 'new'.
Devang Patel31217af2006-12-07 21:32:57 +0000224 void add(Pass *P) {
Devang Pateldf6c9ae2006-12-08 22:34:02 +0000225 schedulePass(P);
Devang Patel31217af2006-12-07 21:32:57 +0000226 }
Devang Patel376fefa2006-11-08 10:29:57 +0000227
228 /// run - Execute all of the passes scheduled for execution. Keep track of
229 /// whether any of the passes modifies the module, and if so, return true.
230 bool run(Module &M);
231
Devang Patelf9d96b92006-12-07 19:57:52 +0000232 /// Pass Manager itself does not invalidate any analysis info.
233 void getAnalysisUsage(AnalysisUsage &Info) const {
234 Info.setPreservesAll();
235 }
236
Devang Patelabcd1d32006-12-07 21:27:23 +0000237 inline void addTopLevelPass(Pass *P) {
Devang Pateld440cd92006-12-08 23:53:00 +0000238
Devang Patelfa971cd2006-12-08 23:57:43 +0000239 if (ImmutablePass *IP = dynamic_cast<ImmutablePass *> (P)) {
Devang Pateld440cd92006-12-08 23:53:00 +0000240
241 // P is a immutable pass and it will be managed by this
242 // top level manager. Set up analysis resolver to connect them.
Devang Patelb66334b2007-01-05 22:47:07 +0000243 AnalysisResolver *AR = new AnalysisResolver(*this);
Devang Pateld440cd92006-12-08 23:53:00 +0000244 P->setResolver(AR);
Devang Patel95257542006-12-12 22:21:37 +0000245 initializeAnalysisImpl(P);
Devang Patelfa971cd2006-12-08 23:57:43 +0000246 addImmutablePass(IP);
Devang Patel95257542006-12-12 22:21:37 +0000247 recordAvailableAnalysis(IP);
Devang Patel0f080042007-01-12 17:23:48 +0000248 } else {
Devang Patel0f080042007-01-12 17:23:48 +0000249 P->assignPassManager(activeStack);
Devang Pateld440cd92006-12-08 23:53:00 +0000250 }
Devang Patel0f080042007-01-12 17:23:48 +0000251
Devang Patelabcd1d32006-12-07 21:27:23 +0000252 }
253
Devang Patel67d6a5e2006-12-19 19:46:59 +0000254 MPPassManager *getContainedManager(unsigned N) {
255 assert ( N < PassManagers.size() && "Pass number out of range!");
256 MPPassManager *MP = static_cast<MPPassManager *>(PassManagers[N]);
257 return MP;
258 }
259
Devang Patel376fefa2006-11-08 10:29:57 +0000260};
261
Devang Patelffca9102006-12-15 19:39:30 +0000262} // End of llvm namespace
263
264namespace {
265
Devang Patelb8817b92006-12-14 00:59:42 +0000266//===----------------------------------------------------------------------===//
267// TimingInfo Class - This class is used to calculate information about the
268// amount of time each pass takes to execute. This only happens when
269// -time-passes is enabled on the command line.
270//
271
Devang Patelffca9102006-12-15 19:39:30 +0000272class VISIBILITY_HIDDEN TimingInfo {
Devang Patelb8817b92006-12-14 00:59:42 +0000273 std::map<Pass*, Timer> TimingData;
274 TimerGroup TG;
275
276public:
277 // Use 'create' member to get this.
278 TimingInfo() : TG("... Pass execution timing report ...") {}
279
280 // TimingDtor - Print out information about timing information
281 ~TimingInfo() {
282 // Delete all of the timers...
283 TimingData.clear();
284 // TimerGroup is deleted next, printing the report.
285 }
286
287 // createTheTimeInfo - This method either initializes the TheTimeInfo pointer
288 // to a non null value (if the -time-passes option is enabled) or it leaves it
289 // null. It may be called multiple times.
290 static void createTheTimeInfo();
291
292 void passStarted(Pass *P) {
293
294 if (dynamic_cast<PMDataManager *>(P))
295 return;
296
297 std::map<Pass*, Timer>::iterator I = TimingData.find(P);
298 if (I == TimingData.end())
299 I=TimingData.insert(std::make_pair(P, Timer(P->getPassName(), TG))).first;
300 I->second.startTimer();
301 }
302 void passEnded(Pass *P) {
303
304 if (dynamic_cast<PMDataManager *>(P))
305 return;
306
307 std::map<Pass*, Timer>::iterator I = TimingData.find(P);
308 assert (I != TimingData.end() && "passStarted/passEnded not nested right!");
309 I->second.stopTimer();
310 }
311};
312
313static TimingInfo *TheTimeInfo;
314
Devang Patelffca9102006-12-15 19:39:30 +0000315} // End of anon namespace
Devang Patelca58e352006-11-08 10:05:38 +0000316
Devang Patela1514cb2006-12-07 19:39:39 +0000317//===----------------------------------------------------------------------===//
Devang Patelafb1f3622006-12-12 22:35:25 +0000318// PMTopLevelManager implementation
319
Devang Patel4268fc02007-01-16 02:00:38 +0000320/// Initialize top level manager. Create first pass manager.
321PMTopLevelManager::PMTopLevelManager (enum TopLevelManagerType t) {
322
323 if (t == TLM_Pass) {
324 MPPassManager *MPP = new MPPassManager(1);
325 MPP->setTopLevelManager(this);
326 addPassManager(MPP);
327 activeStack.push(MPP);
328 }
329 else if (t == TLM_Function) {
330 FPPassManager *FPP = new FPPassManager(1);
331 FPP->setTopLevelManager(this);
332 addPassManager(FPP);
333 activeStack.push(FPP);
334 }
335}
336
Devang Patelafb1f3622006-12-12 22:35:25 +0000337/// Set pass P as the last user of the given analysis passes.
338void PMTopLevelManager::setLastUser(std::vector<Pass *> &AnalysisPasses,
339 Pass *P) {
340
341 for (std::vector<Pass *>::iterator I = AnalysisPasses.begin(),
342 E = AnalysisPasses.end(); I != E; ++I) {
343 Pass *AP = *I;
344 LastUser[AP] = P;
345 // If AP is the last user of other passes then make P last user of
346 // such passes.
347 for (std::map<Pass *, Pass *>::iterator LUI = LastUser.begin(),
348 LUE = LastUser.end(); LUI != LUE; ++LUI) {
349 if (LUI->second == AP)
350 LastUser[LUI->first] = P;
351 }
352 }
Devang Patelafb1f3622006-12-12 22:35:25 +0000353}
354
355/// Collect passes whose last user is P
356void PMTopLevelManager::collectLastUses(std::vector<Pass *> &LastUses,
357 Pass *P) {
358 for (std::map<Pass *, Pass *>::iterator LUI = LastUser.begin(),
359 LUE = LastUser.end(); LUI != LUE; ++LUI)
360 if (LUI->second == P)
361 LastUses.push_back(LUI->first);
362}
363
364/// Schedule pass P for execution. Make sure that passes required by
365/// P are run before P is run. Update analysis info maintained by
366/// the manager. Remove dead passes. This is a recursive function.
367void PMTopLevelManager::schedulePass(Pass *P) {
368
369 // TODO : Allocate function manager for this pass, other wise required set
370 // may be inserted into previous function manager
371
372 AnalysisUsage AnUsage;
373 P->getAnalysisUsage(AnUsage);
374 const std::vector<AnalysisID> &RequiredSet = AnUsage.getRequiredSet();
375 for (std::vector<AnalysisID>::const_iterator I = RequiredSet.begin(),
376 E = RequiredSet.end(); I != E; ++I) {
377
378 Pass *AnalysisPass = findAnalysisPass(*I);
379 if (!AnalysisPass) {
380 // Schedule this analysis run first.
381 AnalysisPass = (*I)->createPass();
382 schedulePass(AnalysisPass);
383 }
384 }
385
386 // Now all required passes are available.
387 addTopLevelPass(P);
388}
389
390/// Find the pass that implements Analysis AID. Search immutable
391/// passes and all pass managers. If desired pass is not found
392/// then return NULL.
393Pass *PMTopLevelManager::findAnalysisPass(AnalysisID AID) {
394
395 Pass *P = NULL;
Devang Patelcd6ba152006-12-12 22:50:05 +0000396 // Check pass managers
397 for (std::vector<Pass *>::iterator I = PassManagers.begin(),
398 E = PassManagers.end(); P == NULL && I != E; ++I) {
399 PMDataManager *PMD = dynamic_cast<PMDataManager *>(*I);
400 assert(PMD && "This is not a PassManager");
401 P = PMD->findAnalysisPass(AID, false);
402 }
403
404 // Check other pass managers
405 for (std::vector<PMDataManager *>::iterator I = IndirectPassManagers.begin(),
406 E = IndirectPassManagers.end(); P == NULL && I != E; ++I)
407 P = (*I)->findAnalysisPass(AID, false);
408
Devang Patelafb1f3622006-12-12 22:35:25 +0000409 for (std::vector<ImmutablePass *>::iterator I = ImmutablePasses.begin(),
410 E = ImmutablePasses.end(); P == NULL && I != E; ++I) {
411 const PassInfo *PI = (*I)->getPassInfo();
412 if (PI == AID)
413 P = *I;
414
415 // If Pass not found then check the interfaces implemented by Immutable Pass
416 if (!P) {
Devang Patel56d48ec2006-12-15 22:57:49 +0000417 const std::vector<const PassInfo*> &ImmPI = PI->getInterfacesImplemented();
418 if (std::find(ImmPI.begin(), ImmPI.end(), AID) != ImmPI.end())
419 P = *I;
Devang Patelafb1f3622006-12-12 22:35:25 +0000420 }
421 }
422
Devang Patelafb1f3622006-12-12 22:35:25 +0000423 return P;
424}
425
Devang Pateleda56172006-12-12 23:34:33 +0000426// Print passes managed by this top level manager.
Devang Patel991aeba2006-12-15 20:13:01 +0000427void PMTopLevelManager::dumpPasses() const {
Devang Pateleda56172006-12-12 23:34:33 +0000428
Devang Patel67d6a5e2006-12-19 19:46:59 +0000429 if (PassDebugging_New < Structure)
430 return;
431
Devang Pateleda56172006-12-12 23:34:33 +0000432 // Print out the immutable passes
433 for (unsigned i = 0, e = ImmutablePasses.size(); i != e; ++i) {
434 ImmutablePasses[i]->dumpPassStructure(0);
435 }
436
Devang Patel991aeba2006-12-15 20:13:01 +0000437 for (std::vector<Pass *>::const_iterator I = PassManagers.begin(),
Devang Pateleda56172006-12-12 23:34:33 +0000438 E = PassManagers.end(); I != E; ++I)
439 (*I)->dumpPassStructure(1);
Devang Pateleda56172006-12-12 23:34:33 +0000440}
441
Devang Patel991aeba2006-12-15 20:13:01 +0000442void PMTopLevelManager::dumpArguments() const {
Devang Patelcfd70c42006-12-13 22:10:00 +0000443
444 if (PassDebugging_New < Arguments)
445 return;
446
447 cerr << "Pass Arguments: ";
Devang Patel991aeba2006-12-15 20:13:01 +0000448 for (std::vector<Pass *>::const_iterator I = PassManagers.begin(),
Devang Patelcfd70c42006-12-13 22:10:00 +0000449 E = PassManagers.end(); I != E; ++I) {
450 PMDataManager *PMD = dynamic_cast<PMDataManager *>(*I);
451 assert(PMD && "This is not a PassManager");
452 PMD->dumpPassArguments();
453 }
454 cerr << "\n";
455}
456
Devang Patele3068402006-12-21 00:16:50 +0000457void PMTopLevelManager::initializeAllAnalysisInfo() {
458
459 for (std::vector<Pass *>::iterator I = PassManagers.begin(),
460 E = PassManagers.end(); I != E; ++I) {
461 PMDataManager *PMD = dynamic_cast<PMDataManager *>(*I);
462 assert(PMD && "This is not a PassManager");
463 PMD->initializeAnalysisInfo();
464 }
465
466 // Initailize other pass managers
467 for (std::vector<PMDataManager *>::iterator I = IndirectPassManagers.begin(),
468 E = IndirectPassManagers.end(); I != E; ++I)
469 (*I)->initializeAnalysisInfo();
470}
471
Devang Patele7599552007-01-12 18:52:44 +0000472/// Destructor
473PMTopLevelManager::~PMTopLevelManager() {
474 for (std::vector<Pass *>::iterator I = PassManagers.begin(),
475 E = PassManagers.end(); I != E; ++I)
476 delete *I;
477
478 for (std::vector<ImmutablePass *>::iterator
479 I = ImmutablePasses.begin(), E = ImmutablePasses.end(); I != E; ++I)
480 delete *I;
481
482 PassManagers.clear();
483}
484
Devang Patelafb1f3622006-12-12 22:35:25 +0000485//===----------------------------------------------------------------------===//
Devang Pateldbe4a1e2006-12-07 18:36:24 +0000486// PMDataManager implementation
Devang Patelf68a3492006-11-07 22:35:17 +0000487
Devang Pateld65e9e92006-11-08 01:31:28 +0000488/// Return true IFF pass P's required analysis set does not required new
Devang Patelf68a3492006-11-07 22:35:17 +0000489/// manager.
Devang Pateldbe4a1e2006-12-07 18:36:24 +0000490bool PMDataManager::manageablePass(Pass *P) {
Devang Patelf68a3492006-11-07 22:35:17 +0000491
Devang Patel8f677ce2006-12-07 18:47:25 +0000492 // TODO
493 // If this pass is not preserving information that is required by a
494 // pass maintained by higher level pass manager then do not insert
495 // this pass into current manager. Use new manager. For example,
496 // For example, If FunctionPass F is not preserving ModulePass Info M1
497 // that is used by another ModulePass M2 then do not insert F in
498 // current function pass manager.
Devang Patelf68a3492006-11-07 22:35:17 +0000499 return true;
500}
501
Devang Patel643676c2006-11-11 01:10:19 +0000502/// Augement AvailableAnalysis by adding analysis made available by pass P.
Devang Patele9976aa2006-12-07 19:33:53 +0000503void PMDataManager::recordAvailableAnalysis(Pass *P) {
Devang Patelf60b5d92006-11-14 01:59:59 +0000504
Devang Patel643676c2006-11-11 01:10:19 +0000505 if (const PassInfo *PI = P->getPassInfo()) {
Devang Patelf60b5d92006-11-14 01:59:59 +0000506 AvailableAnalysis[PI] = P;
Devang Patel643676c2006-11-11 01:10:19 +0000507
Devang Patele9976aa2006-12-07 19:33:53 +0000508 //This pass is the current implementation of all of the interfaces it
509 //implements as well.
510 const std::vector<const PassInfo*> &II = PI->getInterfacesImplemented();
511 for (unsigned i = 0, e = II.size(); i != e; ++i)
512 AvailableAnalysis[II[i]] = P;
Devang Patel643676c2006-11-11 01:10:19 +0000513 }
514}
515
Devang Patelf68a3492006-11-07 22:35:17 +0000516/// Remove Analyss not preserved by Pass P
Devang Pateldbe4a1e2006-12-07 18:36:24 +0000517void PMDataManager::removeNotPreservedAnalysis(Pass *P) {
Devang Patel349170f2006-11-11 01:24:55 +0000518 AnalysisUsage AnUsage;
519 P->getAnalysisUsage(AnUsage);
Devang Patelf68a3492006-11-07 22:35:17 +0000520
Devang Patel2e169c32006-12-07 20:03:49 +0000521 if (AnUsage.getPreservesAll())
522 return;
523
524 const std::vector<AnalysisID> &PreservedSet = AnUsage.getPreservedSet();
Devang Patelf60b5d92006-11-14 01:59:59 +0000525 for (std::map<AnalysisID, Pass*>::iterator I = AvailableAnalysis.begin(),
Devang Patelbe6bd55e2006-12-12 23:07:44 +0000526 E = AvailableAnalysis.end(); I != E; ) {
Devang Patel56d48ec2006-12-15 22:57:49 +0000527 std::map<AnalysisID, Pass*>::iterator Info = I++;
528 if (std::find(PreservedSet.begin(), PreservedSet.end(), Info->first) ==
Devang Patel349170f2006-11-11 01:24:55 +0000529 PreservedSet.end()) {
530 // Remove this analysis
Devang Patel56d48ec2006-12-15 22:57:49 +0000531 if (!dynamic_cast<ImmutablePass*>(Info->second))
532 AvailableAnalysis.erase(Info);
533 }
Devang Patel349170f2006-11-11 01:24:55 +0000534 }
Devang Patelf68a3492006-11-07 22:35:17 +0000535}
536
Devang Patelca189262006-11-14 03:05:08 +0000537/// Remove analysis passes that are not used any longer
Devang Patel200d3052006-12-13 23:50:44 +0000538void PMDataManager::removeDeadPasses(Pass *P, std::string &Msg) {
Devang Patel17ad0962006-12-08 00:37:52 +0000539
540 std::vector<Pass *> DeadPasses;
541 TPM->collectLastUses(DeadPasses, P);
542
543 for (std::vector<Pass *>::iterator I = DeadPasses.begin(),
544 E = DeadPasses.end(); I != E; ++I) {
Devang Patel200d3052006-12-13 23:50:44 +0000545
546 std::string Msg1 = " Freeing Pass '";
547 dumpPassInfo(*I, Msg1, Msg);
548
Devang Patelb8817b92006-12-14 00:59:42 +0000549 if (TheTimeInfo) TheTimeInfo->passStarted(P);
Devang Patel17ad0962006-12-08 00:37:52 +0000550 (*I)->releaseMemory();
Devang Patelb8817b92006-12-14 00:59:42 +0000551 if (TheTimeInfo) TheTimeInfo->passEnded(P);
552
Devang Patel17ad0962006-12-08 00:37:52 +0000553 std::map<AnalysisID, Pass*>::iterator Pos =
554 AvailableAnalysis.find((*I)->getPassInfo());
555
Devang Patel475c4532006-12-08 00:59:05 +0000556 // It is possible that pass is already removed from the AvailableAnalysis
Devang Patel17ad0962006-12-08 00:37:52 +0000557 if (Pos != AvailableAnalysis.end())
558 AvailableAnalysis.erase(Pos);
559 }
Devang Patelca189262006-11-14 03:05:08 +0000560}
561
Devang Patel8f677ce2006-12-07 18:47:25 +0000562/// Add pass P into the PassVector. Update
Devang Patel90b05e02006-11-11 02:04:19 +0000563/// AvailableAnalysis appropriately if ProcessAnalysis is true.
Devang Patelf85793d2007-01-12 20:07:16 +0000564void PMDataManager::add(Pass *P,
Devang Patel6975b6e2007-01-15 23:06:56 +0000565 bool ProcessAnalysis) {
Devang Patel8cad70d2006-11-11 01:51:02 +0000566
Devang Pateld440cd92006-12-08 23:53:00 +0000567 // This manager is going to manage pass P. Set up analysis resolver
568 // to connect them.
Devang Patelb66334b2007-01-05 22:47:07 +0000569 AnalysisResolver *AR = new AnalysisResolver(*this);
Devang Pateld440cd92006-12-08 23:53:00 +0000570 P->setResolver(AR);
571
Devang Patel90b05e02006-11-11 02:04:19 +0000572 if (ProcessAnalysis) {
Devang Patelbc03f132006-12-07 23:55:10 +0000573
574 // At the moment, this pass is the last user of all required passes.
575 std::vector<Pass *> LastUses;
576 std::vector<Pass *> RequiredPasses;
577 unsigned PDepth = this->getDepth();
578
579 collectRequiredAnalysisPasses(RequiredPasses, P);
580 for (std::vector<Pass *>::iterator I = RequiredPasses.begin(),
581 E = RequiredPasses.end(); I != E; ++I) {
582 Pass *PRequired = *I;
583 unsigned RDepth = 0;
Devang Patel64619be2006-12-09 00:07:38 +0000584
585 PMDataManager &DM = PRequired->getResolver()->getPMDataManager();
586 RDepth = DM.getDepth();
587
Devang Patelbc03f132006-12-07 23:55:10 +0000588 if (PDepth == RDepth)
589 LastUses.push_back(PRequired);
590 else if (PDepth > RDepth) {
591 // Let the parent claim responsibility of last use
Devang Patel832bc072006-12-15 00:08:26 +0000592 TransferLastUses.push_back(PRequired);
Devang Patelbc03f132006-12-07 23:55:10 +0000593 } else {
594 // Note : This feature is not yet implemented
595 assert (0 &&
596 "Unable to handle Pass that requires lower level Analysis pass");
597 }
598 }
599
Devang Patel39786a92007-01-15 20:31:54 +0000600 // Set P as P's last user until someone starts using P.
601 // However, if P is a Pass Manager then it does not need
602 // to record its last user.
603 if (!dynamic_cast<PMDataManager *>(P)) {
604 LastUses.push_back(P);
605 TPM->setLastUser(LastUses, P);
606 }
Devang Patelbc03f132006-12-07 23:55:10 +0000607
Devang Patel17bff0d2006-12-07 22:09:36 +0000608 // Take a note of analysis required and made available by this pass.
Devang Patel90b05e02006-11-11 02:04:19 +0000609 // Remove the analysis not preserved by this pass
610 removeNotPreservedAnalysis(P);
Devang Patel17bff0d2006-12-07 22:09:36 +0000611 recordAvailableAnalysis(P);
Devang Patel90b05e02006-11-11 02:04:19 +0000612 }
Devang Patel8cad70d2006-11-11 01:51:02 +0000613
614 // Add pass
615 PassVector.push_back(P);
Devang Patel8cad70d2006-11-11 01:51:02 +0000616}
617
Devang Patel1d6267c2006-12-07 23:05:44 +0000618/// Populate RequiredPasses with the analysis pass that are required by
619/// pass P.
620void PMDataManager::collectRequiredAnalysisPasses(std::vector<Pass *> &RP,
621 Pass *P) {
622 AnalysisUsage AnUsage;
623 P->getAnalysisUsage(AnUsage);
624 const std::vector<AnalysisID> &RequiredSet = AnUsage.getRequiredSet();
625 for (std::vector<AnalysisID>::const_iterator
626 I = RequiredSet.begin(), E = RequiredSet.end();
627 I != E; ++I) {
Devang Patel640c5bb2006-12-08 22:30:11 +0000628 Pass *AnalysisPass = findAnalysisPass(*I, true);
Devang Patel1d6267c2006-12-07 23:05:44 +0000629 assert (AnalysisPass && "Analysis pass is not available");
630 RP.push_back(AnalysisPass);
631 }
Devang Patelf58183d2006-12-12 23:09:32 +0000632
633 const std::vector<AnalysisID> &IDs = AnUsage.getRequiredTransitiveSet();
634 for (std::vector<AnalysisID>::const_iterator I = IDs.begin(),
635 E = IDs.end(); I != E; ++I) {
636 Pass *AnalysisPass = findAnalysisPass(*I, true);
637 assert (AnalysisPass && "Analysis pass is not available");
638 RP.push_back(AnalysisPass);
639 }
Devang Patel1d6267c2006-12-07 23:05:44 +0000640}
641
Devang Patel07f4f582006-11-14 21:49:36 +0000642// All Required analyses should be available to the pass as it runs! Here
643// we fill in the AnalysisImpls member of the pass so that it can
644// successfully use the getAnalysis() method to retrieve the
645// implementations it needs.
646//
Devang Pateldbe4a1e2006-12-07 18:36:24 +0000647void PMDataManager::initializeAnalysisImpl(Pass *P) {
Devang Patelff631ae2006-11-15 01:27:05 +0000648 AnalysisUsage AnUsage;
649 P->getAnalysisUsage(AnUsage);
Devang Patel07f4f582006-11-14 21:49:36 +0000650
651 for (std::vector<const PassInfo *>::const_iterator
652 I = AnUsage.getRequiredSet().begin(),
653 E = AnUsage.getRequiredSet().end(); I != E; ++I) {
Devang Patel640c5bb2006-12-08 22:30:11 +0000654 Pass *Impl = findAnalysisPass(*I, true);
Devang Patel07f4f582006-11-14 21:49:36 +0000655 if (Impl == 0)
656 assert(0 && "Analysis used but not available!");
Devang Patelb66334b2007-01-05 22:47:07 +0000657 AnalysisResolver *AR = P->getResolver();
Devang Patel984698a2006-12-09 01:11:34 +0000658 AR->addAnalysisImplsPair(*I, Impl);
Devang Patel07f4f582006-11-14 21:49:36 +0000659 }
660}
661
Devang Patel640c5bb2006-12-08 22:30:11 +0000662/// Find the pass that implements Analysis AID. If desired pass is not found
663/// then return NULL.
664Pass *PMDataManager::findAnalysisPass(AnalysisID AID, bool SearchParent) {
665
666 // Check if AvailableAnalysis map has one entry.
667 std::map<AnalysisID, Pass*>::const_iterator I = AvailableAnalysis.find(AID);
668
669 if (I != AvailableAnalysis.end())
670 return I->second;
671
672 // Search Parents through TopLevelManager
673 if (SearchParent)
674 return TPM->findAnalysisPass(AID);
675
Devang Patel9d759b82006-12-09 00:09:12 +0000676 return NULL;
Devang Patel640c5bb2006-12-08 22:30:11 +0000677}
678
Devang Patel991aeba2006-12-15 20:13:01 +0000679// Print list of passes that are last used by P.
680void PMDataManager::dumpLastUses(Pass *P, unsigned Offset) const{
681
682 std::vector<Pass *> LUses;
683
684 assert (TPM && "Top Level Manager is missing");
685 TPM->collectLastUses(LUses, P);
686
687 for (std::vector<Pass *>::iterator I = LUses.begin(),
688 E = LUses.end(); I != E; ++I) {
689 llvm::cerr << "--" << std::string(Offset*2, ' ');
690 (*I)->dumpPassStructure(0);
691 }
692}
693
694void PMDataManager::dumpPassArguments() const {
695 for(std::vector<Pass *>::const_iterator I = PassVector.begin(),
696 E = PassVector.end(); I != E; ++I) {
697 if (PMDataManager *PMD = dynamic_cast<PMDataManager *>(*I))
698 PMD->dumpPassArguments();
699 else
700 if (const PassInfo *PI = (*I)->getPassInfo())
701 if (!PI->isAnalysisGroup())
702 cerr << " -" << PI->getPassArgument();
703 }
704}
705
706void PMDataManager:: dumpPassInfo(Pass *P, std::string &Msg1,
707 std::string &Msg2) const {
708 if (PassDebugging_New < Executions)
709 return;
710 cerr << (void*)this << std::string(getDepth()*2+1, ' ');
711 cerr << Msg1;
712 cerr << P->getPassName();
713 cerr << Msg2;
714}
715
716void PMDataManager::dumpAnalysisSetInfo(const char *Msg, Pass *P,
717 const std::vector<AnalysisID> &Set)
718 const {
719 if (PassDebugging_New >= Details && !Set.empty()) {
720 cerr << (void*)P << std::string(getDepth()*2+3, ' ') << Msg << " Analyses:";
721 for (unsigned i = 0; i != Set.size(); ++i) {
722 if (i) cerr << ",";
723 cerr << " " << Set[i]->getPassName();
724 }
725 cerr << "\n";
726 }
727}
Devang Patel9bdf7d42006-12-08 23:28:54 +0000728
Devang Patele7599552007-01-12 18:52:44 +0000729// Destructor
730PMDataManager::~PMDataManager() {
731
732 for (std::vector<Pass *>::iterator I = PassVector.begin(),
733 E = PassVector.end(); I != E; ++I)
734 delete *I;
735
736 PassVector.clear();
737}
738
Devang Patel9bdf7d42006-12-08 23:28:54 +0000739//===----------------------------------------------------------------------===//
740// NOTE: Is this the right place to define this method ?
741// getAnalysisToUpdate - Return an analysis result or null if it doesn't exist
Devang Patelb66334b2007-01-05 22:47:07 +0000742Pass *AnalysisResolver::getAnalysisToUpdate(AnalysisID ID, bool dir) const {
Devang Patel9bdf7d42006-12-08 23:28:54 +0000743 return PM.findAnalysisPass(ID, dir);
744}
745
Devang Patela1514cb2006-12-07 19:39:39 +0000746//===----------------------------------------------------------------------===//
Devang Patel67d6a5e2006-12-19 19:46:59 +0000747// BBPassManager implementation
Devang Patel6e5a1132006-11-07 21:31:57 +0000748
Devang Patel6e5a1132006-11-07 21:31:57 +0000749/// Execute all of the passes scheduled for execution by invoking
750/// runOnBasicBlock method. Keep track of whether any of the passes modifies
751/// the function, and if so, return true.
752bool
Devang Patel67d6a5e2006-12-19 19:46:59 +0000753BBPassManager::runOnFunction(Function &F) {
Devang Patel6e5a1132006-11-07 21:31:57 +0000754
Devang Patel745a6962006-12-12 23:15:28 +0000755 if (F.isExternal())
756 return false;
757
Devang Patele9585592006-12-08 01:38:28 +0000758 bool Changed = doInitialization(F);
Devang Patel050ec722006-11-14 01:23:29 +0000759
Devang Patel93a197c2006-12-14 00:08:04 +0000760 std::string Msg1 = "Executing Pass '";
761 std::string Msg3 = "' Made Modification '";
762
Devang Patel6e5a1132006-11-07 21:31:57 +0000763 for (Function::iterator I = F.begin(), E = F.end(); I != E; ++I)
Devang Patelabfbe3b2006-12-16 00:56:26 +0000764 for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
765 BasicBlockPass *BP = getContainedPass(Index);
Devang Patelf6d1d212006-12-14 00:25:06 +0000766 AnalysisUsage AnUsage;
Devang Patelabfbe3b2006-12-16 00:56:26 +0000767 BP->getAnalysisUsage(AnUsage);
Devang Patelf6d1d212006-12-14 00:25:06 +0000768
Devang Patel200d3052006-12-13 23:50:44 +0000769 std::string Msg2 = "' on BasicBlock '" + (*I).getName() + "'...\n";
Devang Patelabfbe3b2006-12-16 00:56:26 +0000770 dumpPassInfo(BP, Msg1, Msg2);
771 dumpAnalysisSetInfo("Required", BP, AnUsage.getRequiredSet());
Devang Patelf6d1d212006-12-14 00:25:06 +0000772
Devang Patelabfbe3b2006-12-16 00:56:26 +0000773 initializeAnalysisImpl(BP);
Devang Patel93a197c2006-12-14 00:08:04 +0000774
Devang Patelabfbe3b2006-12-16 00:56:26 +0000775 if (TheTimeInfo) TheTimeInfo->passStarted(BP);
Devang Patel6e5a1132006-11-07 21:31:57 +0000776 Changed |= BP->runOnBasicBlock(*I);
Devang Patelabfbe3b2006-12-16 00:56:26 +0000777 if (TheTimeInfo) TheTimeInfo->passEnded(BP);
Devang Patel93a197c2006-12-14 00:08:04 +0000778
779 if (Changed)
Devang Patelabfbe3b2006-12-16 00:56:26 +0000780 dumpPassInfo(BP, Msg3, Msg2);
781 dumpAnalysisSetInfo("Preserved", BP, AnUsage.getPreservedSet());
Devang Patel93a197c2006-12-14 00:08:04 +0000782
Devang Patelabfbe3b2006-12-16 00:56:26 +0000783 removeNotPreservedAnalysis(BP);
784 recordAvailableAnalysis(BP);
785 removeDeadPasses(BP, Msg2);
Devang Patel6e5a1132006-11-07 21:31:57 +0000786 }
Devang Patel56d48ec2006-12-15 22:57:49 +0000787 return Changed |= doFinalization(F);
Devang Patel6e5a1132006-11-07 21:31:57 +0000788}
789
Devang Patel475c4532006-12-08 00:59:05 +0000790// Implement doInitialization and doFinalization
Devang Patel67d6a5e2006-12-19 19:46:59 +0000791inline bool BBPassManager::doInitialization(Module &M) {
Devang Patel475c4532006-12-08 00:59:05 +0000792 bool Changed = false;
793
Devang Patelabfbe3b2006-12-16 00:56:26 +0000794 for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
795 BasicBlockPass *BP = getContainedPass(Index);
Devang Patel475c4532006-12-08 00:59:05 +0000796 Changed |= BP->doInitialization(M);
797 }
798
799 return Changed;
800}
801
Devang Patel67d6a5e2006-12-19 19:46:59 +0000802inline bool BBPassManager::doFinalization(Module &M) {
Devang Patel475c4532006-12-08 00:59:05 +0000803 bool Changed = false;
804
Devang Patelabfbe3b2006-12-16 00:56:26 +0000805 for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
806 BasicBlockPass *BP = getContainedPass(Index);
Devang Patel475c4532006-12-08 00:59:05 +0000807 Changed |= BP->doFinalization(M);
808 }
809
810 return Changed;
811}
812
Devang Patel67d6a5e2006-12-19 19:46:59 +0000813inline bool BBPassManager::doInitialization(Function &F) {
Devang Patel475c4532006-12-08 00:59:05 +0000814 bool Changed = false;
815
Devang Patelabfbe3b2006-12-16 00:56:26 +0000816 for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
817 BasicBlockPass *BP = getContainedPass(Index);
Devang Patel475c4532006-12-08 00:59:05 +0000818 Changed |= BP->doInitialization(F);
819 }
820
821 return Changed;
822}
823
Devang Patel67d6a5e2006-12-19 19:46:59 +0000824inline bool BBPassManager::doFinalization(Function &F) {
Devang Patel475c4532006-12-08 00:59:05 +0000825 bool Changed = false;
826
Devang Patelabfbe3b2006-12-16 00:56:26 +0000827 for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
828 BasicBlockPass *BP = getContainedPass(Index);
Devang Patel475c4532006-12-08 00:59:05 +0000829 Changed |= BP->doFinalization(F);
830 }
831
832 return Changed;
833}
834
835
Devang Patela1514cb2006-12-07 19:39:39 +0000836//===----------------------------------------------------------------------===//
Devang Patelb67904d2006-12-13 02:36:01 +0000837// FunctionPassManager implementation
Devang Patela1514cb2006-12-07 19:39:39 +0000838
Devang Patel4e12f862006-11-08 10:44:40 +0000839/// Create new Function pass manager
Devang Patelb67904d2006-12-13 02:36:01 +0000840FunctionPassManager::FunctionPassManager(ModuleProvider *P) {
Devang Patel67d6a5e2006-12-19 19:46:59 +0000841 FPM = new FunctionPassManagerImpl(0);
Devang Patel9c6290c2006-12-12 22:02:16 +0000842 // FPM is the top level manager.
843 FPM->setTopLevelManager(FPM);
Devang Patel1036b652006-12-12 23:27:37 +0000844
845 PMDataManager *PMD = dynamic_cast<PMDataManager *>(FPM);
Devang Patelb66334b2007-01-05 22:47:07 +0000846 AnalysisResolver *AR = new AnalysisResolver(*PMD);
Devang Patel1036b652006-12-12 23:27:37 +0000847 FPM->setResolver(AR);
848
Devang Patel1f653682006-12-08 18:57:16 +0000849 MP = P;
850}
851
Devang Patelb67904d2006-12-13 02:36:01 +0000852FunctionPassManager::~FunctionPassManager() {
Devang Patelab97cf42006-12-13 00:09:23 +0000853 delete FPM;
854}
855
Devang Patel4e12f862006-11-08 10:44:40 +0000856/// add - Add a pass to the queue of passes to run. This passes
857/// ownership of the Pass to the PassManager. When the
858/// PassManager_X is destroyed, the pass will be destroyed as well, so
859/// there is no need to delete the pass. (TODO delete passes.)
860/// This implies that all passes MUST be allocated with 'new'.
Devang Patelb67904d2006-12-13 02:36:01 +0000861void FunctionPassManager::add(Pass *P) {
Devang Patel4e12f862006-11-08 10:44:40 +0000862 FPM->add(P);
863}
864
Devang Patel9f3083e2006-11-15 19:39:54 +0000865/// run - Execute all of the passes scheduled for execution. Keep
866/// track of whether any of the passes modifies the function, and if
867/// so, return true.
868///
Devang Patelb67904d2006-12-13 02:36:01 +0000869bool FunctionPassManager::run(Function &F) {
Devang Patel9f3083e2006-11-15 19:39:54 +0000870 std::string errstr;
871 if (MP->materializeFunction(&F, &errstr)) {
Bill Wendlingf3baad32006-12-07 01:30:32 +0000872 cerr << "Error reading bytecode file: " << errstr << "\n";
Devang Patel9f3083e2006-11-15 19:39:54 +0000873 abort();
874 }
Devang Patel272908d2006-12-08 22:57:48 +0000875 return FPM->run(F);
Devang Patel9f3083e2006-11-15 19:39:54 +0000876}
877
878
Devang Patelff631ae2006-11-15 01:27:05 +0000879/// doInitialization - Run all of the initializers for the function passes.
880///
Devang Patelb67904d2006-12-13 02:36:01 +0000881bool FunctionPassManager::doInitialization() {
Devang Patelff631ae2006-11-15 01:27:05 +0000882 return FPM->doInitialization(*MP->getModule());
883}
884
885/// doFinalization - Run all of the initializers for the function passes.
886///
Devang Patelb67904d2006-12-13 02:36:01 +0000887bool FunctionPassManager::doFinalization() {
Devang Patelff631ae2006-11-15 01:27:05 +0000888 return FPM->doFinalization(*MP->getModule());
889}
890
Devang Patela1514cb2006-12-07 19:39:39 +0000891//===----------------------------------------------------------------------===//
Devang Patel67d6a5e2006-12-19 19:46:59 +0000892// FunctionPassManagerImpl implementation
893//
Devang Patel67d6a5e2006-12-19 19:46:59 +0000894inline bool FunctionPassManagerImpl::doInitialization(Module &M) {
895 bool Changed = false;
896
897 for (unsigned Index = 0; Index < getNumContainedManagers(); ++Index) {
898 FPPassManager *FP = getContainedManager(Index);
899 Changed |= FP->doInitialization(M);
900 }
901
902 return Changed;
903}
904
905inline bool FunctionPassManagerImpl::doFinalization(Module &M) {
906 bool Changed = false;
907
908 for (unsigned Index = 0; Index < getNumContainedManagers(); ++Index) {
909 FPPassManager *FP = getContainedManager(Index);
910 Changed |= FP->doFinalization(M);
911 }
912
913 return Changed;
914}
915
916// Execute all the passes managed by this top level manager.
917// Return true if any function is modified by a pass.
918bool FunctionPassManagerImpl::run(Function &F) {
919
920 bool Changed = false;
921
922 TimingInfo::createTheTimeInfo();
923
924 dumpArguments();
925 dumpPasses();
926
Devang Patele3068402006-12-21 00:16:50 +0000927 initializeAllAnalysisInfo();
Devang Patel67d6a5e2006-12-19 19:46:59 +0000928 for (unsigned Index = 0; Index < getNumContainedManagers(); ++Index) {
929 FPPassManager *FP = getContainedManager(Index);
930 Changed |= FP->runOnFunction(F);
931 }
932 return Changed;
933}
934
935//===----------------------------------------------------------------------===//
936// FPPassManager implementation
Devang Patel0c2012f2006-11-07 21:49:50 +0000937
Devang Patele7599552007-01-12 18:52:44 +0000938/// Print passes managed by this manager
939void FPPassManager::dumpPassStructure(unsigned Offset) {
940 llvm::cerr << std::string(Offset*2, ' ') << "FunctionPass Manager\n";
941 for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
942 FunctionPass *FP = getContainedPass(Index);
943 FP->dumpPassStructure(Offset + 1);
944 dumpLastUses(FP, Offset+1);
945 }
946}
947
948
Devang Patel0c2012f2006-11-07 21:49:50 +0000949/// Execute all of the passes scheduled for execution by invoking
950/// runOnFunction method. Keep track of whether any of the passes modifies
951/// the function, and if so, return true.
Devang Patel67d6a5e2006-12-19 19:46:59 +0000952bool FPPassManager::runOnFunction(Function &F) {
Devang Patel9f3083e2006-11-15 19:39:54 +0000953
954 bool Changed = false;
Devang Patel745a6962006-12-12 23:15:28 +0000955
956 if (F.isExternal())
957 return false;
958
Devang Patel93a197c2006-12-14 00:08:04 +0000959 std::string Msg1 = "Executing Pass '";
960 std::string Msg3 = "' Made Modification '";
961
Devang Patelabfbe3b2006-12-16 00:56:26 +0000962 for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
963 FunctionPass *FP = getContainedPass(Index);
964
Devang Patelf6d1d212006-12-14 00:25:06 +0000965 AnalysisUsage AnUsage;
Devang Patelabfbe3b2006-12-16 00:56:26 +0000966 FP->getAnalysisUsage(AnUsage);
Devang Patel93a197c2006-12-14 00:08:04 +0000967
Devang Patel200d3052006-12-13 23:50:44 +0000968 std::string Msg2 = "' on Function '" + F.getName() + "'...\n";
Devang Patelabfbe3b2006-12-16 00:56:26 +0000969 dumpPassInfo(FP, Msg1, Msg2);
970 dumpAnalysisSetInfo("Required", FP, AnUsage.getRequiredSet());
Devang Patel93a197c2006-12-14 00:08:04 +0000971
Devang Patelabfbe3b2006-12-16 00:56:26 +0000972 initializeAnalysisImpl(FP);
Devang Patelb8817b92006-12-14 00:59:42 +0000973
Devang Patelabfbe3b2006-12-16 00:56:26 +0000974 if (TheTimeInfo) TheTimeInfo->passStarted(FP);
Devang Patel9f3083e2006-11-15 19:39:54 +0000975 Changed |= FP->runOnFunction(F);
Devang Patelabfbe3b2006-12-16 00:56:26 +0000976 if (TheTimeInfo) TheTimeInfo->passEnded(FP);
Devang Patel93a197c2006-12-14 00:08:04 +0000977
978 if (Changed)
Devang Patelabfbe3b2006-12-16 00:56:26 +0000979 dumpPassInfo(FP, Msg3, Msg2);
980 dumpAnalysisSetInfo("Preserved", FP, AnUsage.getPreservedSet());
Devang Patel93a197c2006-12-14 00:08:04 +0000981
Devang Patelabfbe3b2006-12-16 00:56:26 +0000982 removeNotPreservedAnalysis(FP);
983 recordAvailableAnalysis(FP);
984 removeDeadPasses(FP, Msg2);
Devang Patel9f3083e2006-11-15 19:39:54 +0000985 }
986 return Changed;
987}
988
Devang Patel67d6a5e2006-12-19 19:46:59 +0000989bool FPPassManager::runOnModule(Module &M) {
Devang Patel9f3083e2006-11-15 19:39:54 +0000990
Devang Patel67d6a5e2006-12-19 19:46:59 +0000991 bool Changed = doInitialization(M);
Devang Patel67d6a5e2006-12-19 19:46:59 +0000992
993 for(Module::iterator I = M.begin(), E = M.end(); I != E; ++I)
994 this->runOnFunction(*I);
995
996 return Changed |= doFinalization(M);
997}
998
999inline bool FPPassManager::doInitialization(Module &M) {
Devang Patelff631ae2006-11-15 01:27:05 +00001000 bool Changed = false;
1001
Devang Patelabfbe3b2006-12-16 00:56:26 +00001002 for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
1003 FunctionPass *FP = getContainedPass(Index);
Devang Patelff631ae2006-11-15 01:27:05 +00001004 Changed |= FP->doInitialization(M);
1005 }
1006
1007 return Changed;
1008}
1009
Devang Patel67d6a5e2006-12-19 19:46:59 +00001010inline bool FPPassManager::doFinalization(Module &M) {
Devang Patelff631ae2006-11-15 01:27:05 +00001011 bool Changed = false;
1012
Devang Patelabfbe3b2006-12-16 00:56:26 +00001013 for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
1014 FunctionPass *FP = getContainedPass(Index);
Devang Patelff631ae2006-11-15 01:27:05 +00001015 Changed |= FP->doFinalization(M);
1016 }
1017
Devang Patelff631ae2006-11-15 01:27:05 +00001018 return Changed;
1019}
1020
Devang Patela1514cb2006-12-07 19:39:39 +00001021//===----------------------------------------------------------------------===//
Devang Patel67d6a5e2006-12-19 19:46:59 +00001022// MPPassManager implementation
Devang Patel05e1a972006-11-07 22:03:15 +00001023
Devang Patel05e1a972006-11-07 22:03:15 +00001024/// Execute all of the passes scheduled for execution by invoking
1025/// runOnModule method. Keep track of whether any of the passes modifies
1026/// the module, and if so, return true.
1027bool
Devang Patel67d6a5e2006-12-19 19:46:59 +00001028MPPassManager::runOnModule(Module &M) {
Devang Patel05e1a972006-11-07 22:03:15 +00001029 bool Changed = false;
Devang Patel050ec722006-11-14 01:23:29 +00001030
Devang Patel93a197c2006-12-14 00:08:04 +00001031 std::string Msg1 = "Executing Pass '";
1032 std::string Msg3 = "' Made Modification '";
1033
Devang Patelabfbe3b2006-12-16 00:56:26 +00001034 for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
1035 ModulePass *MP = getContainedPass(Index);
1036
Devang Patelf6d1d212006-12-14 00:25:06 +00001037 AnalysisUsage AnUsage;
Devang Patelabfbe3b2006-12-16 00:56:26 +00001038 MP->getAnalysisUsage(AnUsage);
Devang Patel93a197c2006-12-14 00:08:04 +00001039
Devang Patel200d3052006-12-13 23:50:44 +00001040 std::string Msg2 = "' on Module '" + M.getModuleIdentifier() + "'...\n";
Devang Patelabfbe3b2006-12-16 00:56:26 +00001041 dumpPassInfo(MP, Msg1, Msg2);
1042 dumpAnalysisSetInfo("Required", MP, AnUsage.getRequiredSet());
Devang Patel93a197c2006-12-14 00:08:04 +00001043
Devang Patelabfbe3b2006-12-16 00:56:26 +00001044 initializeAnalysisImpl(MP);
Devang Patelb8817b92006-12-14 00:59:42 +00001045
Devang Patelabfbe3b2006-12-16 00:56:26 +00001046 if (TheTimeInfo) TheTimeInfo->passStarted(MP);
Devang Patel05e1a972006-11-07 22:03:15 +00001047 Changed |= MP->runOnModule(M);
Devang Patelabfbe3b2006-12-16 00:56:26 +00001048 if (TheTimeInfo) TheTimeInfo->passEnded(MP);
Devang Patel93a197c2006-12-14 00:08:04 +00001049
1050 if (Changed)
Devang Patelabfbe3b2006-12-16 00:56:26 +00001051 dumpPassInfo(MP, Msg3, Msg2);
1052 dumpAnalysisSetInfo("Preserved", MP, AnUsage.getPreservedSet());
Devang Patelf6d1d212006-12-14 00:25:06 +00001053
Devang Patelabfbe3b2006-12-16 00:56:26 +00001054 removeNotPreservedAnalysis(MP);
1055 recordAvailableAnalysis(MP);
1056 removeDeadPasses(MP, Msg2);
Devang Patel05e1a972006-11-07 22:03:15 +00001057 }
1058 return Changed;
1059}
1060
Devang Patela1514cb2006-12-07 19:39:39 +00001061//===----------------------------------------------------------------------===//
1062// PassManagerImpl implementation
Devang Patelab97cf42006-12-13 00:09:23 +00001063//
Devang Patelc290c8a2006-11-07 22:23:34 +00001064/// run - Execute all of the passes scheduled for execution. Keep track of
1065/// whether any of the passes modifies the module, and if so, return true.
Devang Patel67d6a5e2006-12-19 19:46:59 +00001066bool PassManagerImpl::run(Module &M) {
Devang Patelc290c8a2006-11-07 22:23:34 +00001067
Devang Patelc290c8a2006-11-07 22:23:34 +00001068 bool Changed = false;
Devang Patelf1567a52006-12-13 20:03:48 +00001069
Devang Patelb8817b92006-12-14 00:59:42 +00001070 TimingInfo::createTheTimeInfo();
1071
Devang Patelcfd70c42006-12-13 22:10:00 +00001072 dumpArguments();
Devang Patel67d6a5e2006-12-19 19:46:59 +00001073 dumpPasses();
Devang Patelf1567a52006-12-13 20:03:48 +00001074
Devang Patele3068402006-12-21 00:16:50 +00001075 initializeAllAnalysisInfo();
Devang Patel67d6a5e2006-12-19 19:46:59 +00001076 for (unsigned Index = 0; Index < getNumContainedManagers(); ++Index) {
1077 MPPassManager *MP = getContainedManager(Index);
Devang Patel5bbeb492006-12-08 22:47:25 +00001078 Changed |= MP->runOnModule(M);
Devang Patelc290c8a2006-11-07 22:23:34 +00001079 }
1080 return Changed;
1081}
Devang Patel376fefa2006-11-08 10:29:57 +00001082
Devang Patela1514cb2006-12-07 19:39:39 +00001083//===----------------------------------------------------------------------===//
1084// PassManager implementation
1085
Devang Patel376fefa2006-11-08 10:29:57 +00001086/// Create new pass manager
Devang Patelb67904d2006-12-13 02:36:01 +00001087PassManager::PassManager() {
Devang Patel67d6a5e2006-12-19 19:46:59 +00001088 PM = new PassManagerImpl(0);
Devang Patel9c6290c2006-12-12 22:02:16 +00001089 // PM is the top level manager
1090 PM->setTopLevelManager(PM);
Devang Patel376fefa2006-11-08 10:29:57 +00001091}
1092
Devang Patelb67904d2006-12-13 02:36:01 +00001093PassManager::~PassManager() {
Devang Patelab97cf42006-12-13 00:09:23 +00001094 delete PM;
1095}
1096
Devang Patel376fefa2006-11-08 10:29:57 +00001097/// add - Add a pass to the queue of passes to run. This passes ownership of
1098/// the Pass to the PassManager. When the PassManager is destroyed, the pass
1099/// will be destroyed as well, so there is no need to delete the pass. This
1100/// implies that all passes MUST be allocated with 'new'.
1101void
Devang Patelb67904d2006-12-13 02:36:01 +00001102PassManager::add(Pass *P) {
Devang Patel376fefa2006-11-08 10:29:57 +00001103 PM->add(P);
1104}
1105
1106/// run - Execute all of the passes scheduled for execution. Keep track of
1107/// whether any of the passes modifies the module, and if so, return true.
1108bool
Devang Patelb67904d2006-12-13 02:36:01 +00001109PassManager::run(Module &M) {
Devang Patel376fefa2006-11-08 10:29:57 +00001110 return PM->run(M);
1111}
1112
Devang Patelb8817b92006-12-14 00:59:42 +00001113//===----------------------------------------------------------------------===//
1114// TimingInfo Class - This class is used to calculate information about the
1115// amount of time each pass takes to execute. This only happens with
1116// -time-passes is enabled on the command line.
1117//
1118bool llvm::TimePassesIsEnabled = false;
1119static cl::opt<bool,true>
1120EnableTiming("time-passes", cl::location(TimePassesIsEnabled),
1121 cl::desc("Time each pass, printing elapsed time for each on exit"));
1122
1123// createTheTimeInfo - This method either initializes the TheTimeInfo pointer to
1124// a non null value (if the -time-passes option is enabled) or it leaves it
1125// null. It may be called multiple times.
1126void TimingInfo::createTheTimeInfo() {
1127 if (!TimePassesIsEnabled || TheTimeInfo) return;
1128
1129 // Constructed the first time this is called, iff -time-passes is enabled.
1130 // This guarantees that the object will be constructed before static globals,
1131 // thus it will be destroyed before them.
1132 static ManagedStatic<TimingInfo> TTI;
1133 TheTimeInfo = &*TTI;
1134}
1135
Devang Patel1c56a632007-01-08 19:29:38 +00001136//===----------------------------------------------------------------------===//
1137// PMStack implementation
1138//
Devang Patelad98d232007-01-11 22:15:30 +00001139
Devang Patel1c56a632007-01-08 19:29:38 +00001140// Pop Pass Manager from the stack and clear its analysis info.
1141void PMStack::pop() {
1142
1143 PMDataManager *Top = this->top();
1144 Top->initializeAnalysisInfo();
1145
1146 S.pop_back();
1147}
1148
1149// Push PM on the stack and set its top level manager.
Devang Patel15701b52007-01-11 00:19:00 +00001150void PMStack::push(Pass *P) {
Devang Patel1c56a632007-01-08 19:29:38 +00001151
Devang Patel15701b52007-01-11 00:19:00 +00001152 PMDataManager *Top = NULL;
1153 PMDataManager *PM = dynamic_cast<PMDataManager *>(P);
1154 assert (PM && "Unable to push. Pass Manager expected");
Devang Patel1c56a632007-01-08 19:29:38 +00001155
Devang Patel15701b52007-01-11 00:19:00 +00001156 if (this->empty()) {
1157 Top = PM;
1158 }
1159 else {
1160 Top = this->top();
1161 PMTopLevelManager *TPM = Top->getTopLevelManager();
1162
1163 assert (TPM && "Unable to find top level manager");
1164 TPM->addIndirectPassManager(PM);
1165 PM->setTopLevelManager(TPM);
1166 }
1167
1168 AnalysisResolver *AR = new AnalysisResolver(*Top);
1169 P->setResolver(AR);
1170
1171 S.push_back(PM);
1172}
1173
1174// Dump content of the pass manager stack.
1175void PMStack::dump() {
1176 for(std::deque<PMDataManager *>::iterator I = S.begin(),
1177 E = S.end(); I != E; ++I) {
1178 Pass *P = dynamic_cast<Pass *>(*I);
1179 printf ("%s ", P->getPassName());
1180 }
1181 if (!S.empty())
1182 printf ("\n");
Devang Patel1c56a632007-01-08 19:29:38 +00001183}
1184
1185// Walk Pass Manager stack and set LastUse markers if any
1186// manager is transfering this priviledge to its parent manager
1187void PMStack::handleLastUserOverflow() {
1188
1189 for(PMStack::iterator I = this->begin(), E = this->end(); I != E;) {
1190
1191 PMDataManager *Child = *I++;
1192 if (I != E) {
1193 PMDataManager *Parent = *I++;
1194 PMTopLevelManager *TPM = Parent->getTopLevelManager();
1195 std::vector<Pass *> &TLU = Child->getTransferredLastUses();
1196 if (!TLU.empty()) {
1197 Pass *P = dynamic_cast<Pass *>(Parent);
1198 TPM->setLastUser(TLU, P);
1199 }
1200 }
1201 }
1202}
1203
1204/// Find appropriate Module Pass Manager in the PM Stack and
1205/// add self into that manager.
1206void ModulePass::assignPassManager(PMStack &PMS) {
1207
Devang Patel1c56a632007-01-08 19:29:38 +00001208 // Find Module Pass Manager
1209 while(!PMS.empty()) {
Devang Patelac99eca2007-01-11 19:59:06 +00001210 if (PMS.top()->getPassManagerType() > PMT_ModulePassManager)
Devang Patel1c56a632007-01-08 19:29:38 +00001211 PMS.pop(); // Pop children pass managers
Devang Patelac99eca2007-01-11 19:59:06 +00001212 else
1213 break;
Devang Patel1c56a632007-01-08 19:29:38 +00001214 }
Devang Patelac99eca2007-01-11 19:59:06 +00001215 MPPassManager *MPP = dynamic_cast<MPPassManager *>(PMS.top());
Devang Patel1c56a632007-01-08 19:29:38 +00001216
1217 assert(MPP && "Unable to find Module Pass Manager");
Devang Patelf85793d2007-01-12 20:07:16 +00001218 MPP->add(this);
Devang Patel1c56a632007-01-08 19:29:38 +00001219}
1220
1221/// Find appropriate Function Pass Manager or Call Graph Pass Manager
1222/// in the PM Stack and add self into that manager.
1223void FunctionPass::assignPassManager(PMStack &PMS) {
1224
Devang Patel15701b52007-01-11 00:19:00 +00001225 // Find Module Pass Manager (TODO : Or Call Graph Pass Manager)
Devang Patel1c56a632007-01-08 19:29:38 +00001226 while(!PMS.empty()) {
Devang Patelac99eca2007-01-11 19:59:06 +00001227 if (PMS.top()->getPassManagerType() > PMT_FunctionPassManager)
1228 PMS.pop();
Devang Patel1c56a632007-01-08 19:29:38 +00001229 else
Devang Patelac99eca2007-01-11 19:59:06 +00001230 break;
Devang Patel1c56a632007-01-08 19:29:38 +00001231 }
Devang Patelac99eca2007-01-11 19:59:06 +00001232 FPPassManager *FPP = dynamic_cast<FPPassManager *>(PMS.top());
Devang Patel1c56a632007-01-08 19:29:38 +00001233
Devang Patel15701b52007-01-11 00:19:00 +00001234 // Create new Function Pass Manager
Devang Patel1c56a632007-01-08 19:29:38 +00001235 if (!FPP) {
Devang Patel1c56a632007-01-08 19:29:38 +00001236 assert(!PMS.empty() && "Unable to create Function Pass Manager");
Devang Patel1c56a632007-01-08 19:29:38 +00001237 PMDataManager *PMD = PMS.top();
Devang Patel1c56a632007-01-08 19:29:38 +00001238
Devang Patel15701b52007-01-11 00:19:00 +00001239 // [1] Create new Function Pass Manager
Devang Patel1c56a632007-01-08 19:29:38 +00001240 FPP = new FPPassManager(PMD->getDepth() + 1);
Devang Patel15701b52007-01-11 00:19:00 +00001241
1242 // [2] Set up new manager's top level manager
1243 PMTopLevelManager *TPM = PMD->getTopLevelManager();
1244 TPM->addIndirectPassManager(FPP);
1245
1246 // [3] Assign manager to manage this new manager. This may create
1247 // and push new managers into PMS
1248 Pass *P = dynamic_cast<Pass *>(FPP);
1249 P->assignPassManager(PMS);
1250
1251 // [4] Push new manager into PMS
Devang Patel1c56a632007-01-08 19:29:38 +00001252 PMS.push(FPP);
1253 }
1254
Devang Patel15701b52007-01-11 00:19:00 +00001255 // Assign FPP as the manager of this pass.
Devang Patelf85793d2007-01-12 20:07:16 +00001256 FPP->add(this);
Devang Patel1c56a632007-01-08 19:29:38 +00001257}
1258
1259/// Find appropriate Basic Pass Manager or Call Graph Pass Manager
1260/// in the PM Stack and add self into that manager.
1261void BasicBlockPass::assignPassManager(PMStack &PMS) {
1262
1263 BBPassManager *BBP = NULL;
1264
Devang Patel15701b52007-01-11 00:19:00 +00001265 // Basic Pass Manager is a leaf pass manager. It does not handle
1266 // any other pass manager.
1267 if (!PMS.empty()) {
Devang Patel1c56a632007-01-08 19:29:38 +00001268 BBP = dynamic_cast<BBPassManager *>(PMS.top());
Devang Patel1c56a632007-01-08 19:29:38 +00001269 }
1270
Devang Patel15701b52007-01-11 00:19:00 +00001271 // If leaf manager is not Basic Block Pass manager then create new
1272 // basic Block Pass manager.
1273
Devang Patel1c56a632007-01-08 19:29:38 +00001274 if (!BBP) {
Devang Patel1c56a632007-01-08 19:29:38 +00001275 assert(!PMS.empty() && "Unable to create BasicBlock Pass Manager");
Devang Patel1c56a632007-01-08 19:29:38 +00001276 PMDataManager *PMD = PMS.top();
Devang Patel1c56a632007-01-08 19:29:38 +00001277
Devang Patel15701b52007-01-11 00:19:00 +00001278 // [1] Create new Basic Block Manager
Devang Patel1c56a632007-01-08 19:29:38 +00001279 BBP = new BBPassManager(PMD->getDepth() + 1);
Devang Patel15701b52007-01-11 00:19:00 +00001280
1281 // [2] Set up new manager's top level manager
1282 // Basic Block Pass Manager does not live by itself
1283 PMTopLevelManager *TPM = PMD->getTopLevelManager();
1284 TPM->addIndirectPassManager(BBP);
1285
1286 // [3] Assign manager to manage this new manager. This may create
1287 // and push new managers into PMS
1288 Pass *P = dynamic_cast<Pass *>(BBP);
1289 P->assignPassManager(PMS);
1290
1291 // [4] Push new manager into PMS
Devang Patel1c56a632007-01-08 19:29:38 +00001292 PMS.push(BBP);
1293 }
1294
Devang Patel15701b52007-01-11 00:19:00 +00001295 // Assign BBP as the manager of this pass.
Devang Patelf85793d2007-01-12 20:07:16 +00001296 BBP->add(this);
Devang Patel1c56a632007-01-08 19:29:38 +00001297}
1298
Devang Patelc6b5a552007-01-05 20:16:23 +00001299