blob: 157a9aa56e6a9737f8d1842c69140efaf38db583 [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
15#include "llvm/PassManager.h"
Devang Patel6e5a1132006-11-07 21:31:57 +000016#include "llvm/Module.h"
17
18using namespace llvm;
19
Devang Patelca58e352006-11-08 10:05:38 +000020namespace llvm {
21
22/// BasicBlockPassManager_New manages BasicBlockPass. It batches all the
23/// pass together and sequence them to process one basic block before
24/// processing next basic block.
Devang Patel0ed47792006-11-10 21:33:13 +000025class BasicBlockPassManager_New : public CommonPassManagerImpl {
Devang Patelca58e352006-11-08 10:05:38 +000026
27public:
28 BasicBlockPassManager_New() { }
29
30 /// Add a pass into a passmanager queue.
31 bool addPass(Pass *p);
32
33 /// Execute all of the passes scheduled for execution. Keep track of
34 /// whether any of the passes modifies the function, and if so, return true.
35 bool runOnFunction(Function &F);
36
37private:
38 // Collection of pass that are managed by this manager
39 std::vector<Pass *> PassVector;
40};
41
Devang Patel4e12f862006-11-08 10:44:40 +000042/// FunctionPassManagerImpl_New manages FunctionPasses and BasicBlockPassManagers.
Devang Patelca58e352006-11-08 10:05:38 +000043/// It batches all function passes and basic block pass managers together and
44/// sequence them to process one function at a time before processing next
45/// function.
Devang Patel0ed47792006-11-10 21:33:13 +000046class FunctionPassManagerImpl_New : public CommonPassManagerImpl {
Devang Patelca58e352006-11-08 10:05:38 +000047public:
Devang Patel4e12f862006-11-08 10:44:40 +000048 FunctionPassManagerImpl_New(ModuleProvider *P) { /* TODO */ }
49 FunctionPassManagerImpl_New() {
Devang Patelca58e352006-11-08 10:05:38 +000050 activeBBPassManager = NULL;
51 }
Devang Patel4e12f862006-11-08 10:44:40 +000052 ~FunctionPassManagerImpl_New() { /* TODO */ };
Devang Patelca58e352006-11-08 10:05:38 +000053
54 /// add - Add a pass to the queue of passes to run. This passes
55 /// ownership of the Pass to the PassManager. When the
56 /// PassManager_X is destroyed, the pass will be destroyed as well, so
57 /// there is no need to delete the pass. (TODO delete passes.)
58 /// This implies that all passes MUST be allocated with 'new'.
59 void add(Pass *P) { /* TODO*/ }
60
61 /// Add pass into the pass manager queue.
62 bool addPass(Pass *P);
63
64 /// Execute all of the passes scheduled for execution. Keep
65 /// track of whether any of the passes modifies the function, and if
66 /// so, return true.
67 bool runOnModule(Module &M);
68
69private:
70 // Collection of pass that are manged by this manager
71 std::vector<Pass *> PassVector;
72
73 // Active Pass Managers
74 BasicBlockPassManager_New *activeBBPassManager;
75};
76
77/// ModulePassManager_New manages ModulePasses and function pass managers.
78/// It batches all Module passes passes and function pass managers together and
79/// sequence them to process one module.
Devang Patel0ed47792006-11-10 21:33:13 +000080class ModulePassManager_New : public CommonPassManagerImpl {
Devang Patelca58e352006-11-08 10:05:38 +000081
82public:
83 ModulePassManager_New() { activeFunctionPassManager = NULL; }
84
85 /// Add a pass into a passmanager queue.
86 bool addPass(Pass *p);
87
88 /// run - Execute all of the passes scheduled for execution. Keep track of
89 /// whether any of the passes modifies the module, and if so, return true.
90 bool runOnModule(Module &M);
91
92private:
93 // Collection of pass that are managed by this manager
94 std::vector<Pass *> PassVector;
95
96 // Active Pass Manager
Devang Patel4e12f862006-11-08 10:44:40 +000097 FunctionPassManagerImpl_New *activeFunctionPassManager;
Devang Patelca58e352006-11-08 10:05:38 +000098};
99
Devang Patel376fefa2006-11-08 10:29:57 +0000100/// PassManager_New manages ModulePassManagers
Devang Patel0ed47792006-11-10 21:33:13 +0000101class PassManagerImpl_New : public CommonPassManagerImpl {
Devang Patel376fefa2006-11-08 10:29:57 +0000102
103public:
104
105 /// add - Add a pass to the queue of passes to run. This passes ownership of
106 /// the Pass to the PassManager. When the PassManager is destroyed, the pass
107 /// will be destroyed as well, so there is no need to delete the pass. This
108 /// implies that all passes MUST be allocated with 'new'.
109 void add(Pass *P);
110
111 /// run - Execute all of the passes scheduled for execution. Keep track of
112 /// whether any of the passes modifies the module, and if so, return true.
113 bool run(Module &M);
114
115private:
116
117 /// Add a pass into a passmanager queue. This is used by schedulePasses
118 bool addPass(Pass *p);
119
120 /// Schedule all passes collected in pass queue using add(). Add all the
121 /// schedule passes into various manager's queue using addPass().
122 void schedulePasses();
123
124 // Collection of pass managers
125 std::vector<ModulePassManager_New *> PassManagers;
126
127 // Collection of pass that are not yet scheduled
128 std::vector<Pass *> PassVector;
129
130 // Active Pass Manager
131 ModulePassManager_New *activeManager;
132};
133
Devang Patelca58e352006-11-08 10:05:38 +0000134} // End of llvm namespace
135
Devang Patel0ed47792006-11-10 21:33:13 +0000136// CommonPassManagerImpl implementation
Devang Patelf68a3492006-11-07 22:35:17 +0000137
Devang Pateld65e9e92006-11-08 01:31:28 +0000138/// Return true IFF pass P's required analysis set does not required new
Devang Patelf68a3492006-11-07 22:35:17 +0000139/// manager.
Devang Patel0ed47792006-11-10 21:33:13 +0000140bool CommonPassManagerImpl::manageablePass(Pass *P) {
Devang Patelf68a3492006-11-07 22:35:17 +0000141
142 AnalysisUsage AnUsage;
143 P->getAnalysisUsage(AnUsage);
144
Devang Patel6c9f5482006-11-11 00:42:16 +0000145 // If this pass is not preserving information that is required by the other
146 // passes managed by this manager then use new manager
147 if (!AnUsage.getPreservesAll()) {
148 const std::vector<AnalysisID> &PreservedSet = AnUsage.getPreservedSet();
149 for (std::vector<AnalysisID>::iterator I = RequiredAnalysis.begin(),
150 E = RequiredAnalysis.end(); I != E; ++I) {
151 if (std::find(PreservedSet.begin(), PreservedSet.end(), *I) ==
152 PreservedSet.end())
153 // This analysis is not preserved. Need new manager.
154 return false;
155 }
156 }
Devang Patelf68a3492006-11-07 22:35:17 +0000157 return true;
158}
159
Devang Pateld65e9e92006-11-08 01:31:28 +0000160/// Return true IFF AnalysisID AID is currently available.
Devang Patel0ed47792006-11-10 21:33:13 +0000161bool CommonPassManagerImpl::analysisCurrentlyAvailable(AnalysisID AID) {
Devang Patelf68a3492006-11-07 22:35:17 +0000162
163 // TODO
164 return false;
165}
166
Devang Patel643676c2006-11-11 01:10:19 +0000167/// Augment RequiredAnalysis by adding analysis required by pass P.
Devang Patel0ed47792006-11-10 21:33:13 +0000168void CommonPassManagerImpl::noteDownRequiredAnalysis(Pass *P) {
Devang Patel6c9f5482006-11-11 00:42:16 +0000169 AnalysisUsage AnUsage;
170 P->getAnalysisUsage(AnUsage);
171 const std::vector<AnalysisID> &RequiredSet = AnUsage.getRequiredSet();
Devang Patelf68a3492006-11-07 22:35:17 +0000172
Devang Patel6c9f5482006-11-11 00:42:16 +0000173 // FIXME: What about duplicates ?
174 RequiredAnalysis.insert(RequiredAnalysis.end(), RequiredSet.begin(), RequiredSet.end());
Devang Patelf68a3492006-11-07 22:35:17 +0000175}
176
Devang Patel643676c2006-11-11 01:10:19 +0000177/// Augement AvailableAnalysis by adding analysis made available by pass P.
178void CommonPassManagerImpl::noteDownAvailableAnalysis(Pass *P) {
179
180 if (const PassInfo *PI = P->getPassInfo()) {
181 AvailableAnalysis.insert(PI);
182
183 //TODO This pass is the current implementation of all of the interfaces it
184 //TODO implements as well.
185 //TODO
186 //TODO const std::vector<const PassInfo*> &II = PI->getInterfacesImplemented();
187 //TODO for (unsigned i = 0, e = II.size(); i != e; ++i)
188 //TODO CurrentAnalyses[II[i]] = P;
189 }
190}
191
Devang Patelf68a3492006-11-07 22:35:17 +0000192/// Remove AnalysisID from the RequiredSet
Devang Patel0ed47792006-11-10 21:33:13 +0000193void CommonPassManagerImpl::removeAnalysis(AnalysisID AID) {
Devang Patelf68a3492006-11-07 22:35:17 +0000194
195 // TODO
196}
197
198/// Remove Analyss not preserved by Pass P
Devang Patel0ed47792006-11-10 21:33:13 +0000199void CommonPassManagerImpl::removeNotPreservedAnalysis(Pass *P) {
Devang Patelf68a3492006-11-07 22:35:17 +0000200
201 // TODO
202}
203
Devang Patel6e5a1132006-11-07 21:31:57 +0000204/// BasicBlockPassManager implementation
205
Devang Pateld65e9e92006-11-08 01:31:28 +0000206/// Add pass P into PassVector and return true. If this pass is not
207/// manageable by this manager then return false.
Devang Patel6e5a1132006-11-07 21:31:57 +0000208bool
Devang Pateld65e9e92006-11-08 01:31:28 +0000209BasicBlockPassManager_New::addPass(Pass *P) {
Devang Patel6e5a1132006-11-07 21:31:57 +0000210
211 BasicBlockPass *BP = dynamic_cast<BasicBlockPass*>(P);
212 if (!BP)
213 return false;
214
Devang Patel3c8eb622006-11-07 22:56:50 +0000215 // If this pass does not preserve anlysis that is used by other passes
216 // managed by this manager than it is not a suiable pass for this manager.
Devang Pateld65e9e92006-11-08 01:31:28 +0000217 if (!manageablePass(P))
Devang Patel3c8eb622006-11-07 22:56:50 +0000218 return false;
219
Devang Patel643676c2006-11-11 01:10:19 +0000220 // Take a note of analysis required and made available by this pass
Devang Patel3c8eb622006-11-07 22:56:50 +0000221 noteDownRequiredAnalysis(P);
Devang Patel643676c2006-11-11 01:10:19 +0000222 noteDownAvailableAnalysis(P);
Devang Patel6e5a1132006-11-07 21:31:57 +0000223
224 // Add pass
225 PassVector.push_back(BP);
226 return true;
227}
228
229/// Execute all of the passes scheduled for execution by invoking
230/// runOnBasicBlock method. Keep track of whether any of the passes modifies
231/// the function, and if so, return true.
232bool
233BasicBlockPassManager_New::runOnFunction(Function &F) {
234
235 bool Changed = false;
236 for (Function::iterator I = F.begin(), E = F.end(); I != E; ++I)
237 for (std::vector<Pass *>::iterator itr = PassVector.begin(),
238 e = PassVector.end(); itr != e; ++itr) {
239 Pass *P = *itr;
240 BasicBlockPass *BP = dynamic_cast<BasicBlockPass*>(P);
241 Changed |= BP->runOnBasicBlock(*I);
242 }
243 return Changed;
244}
245
Devang Patel0c2012f2006-11-07 21:49:50 +0000246// FunctionPassManager_New implementation
Devang Patel4e12f862006-11-08 10:44:40 +0000247/// Create new Function pass manager
248FunctionPassManager_New::FunctionPassManager_New() {
249 FPM = new FunctionPassManagerImpl_New();
250}
251
252/// add - Add a pass to the queue of passes to run. This passes
253/// ownership of the Pass to the PassManager. When the
254/// PassManager_X is destroyed, the pass will be destroyed as well, so
255/// there is no need to delete the pass. (TODO delete passes.)
256/// This implies that all passes MUST be allocated with 'new'.
257void
258FunctionPassManager_New::add(Pass *P) {
259 FPM->add(P);
260}
261
262/// Execute all of the passes scheduled for execution. Keep
263/// track of whether any of the passes modifies the function, and if
264/// so, return true.
265bool
266FunctionPassManager_New::runOnModule(Module &M) {
267 return FPM->runOnModule(M);
268}
269
270// FunctionPassManagerImpl_New implementation
Devang Patel0c2012f2006-11-07 21:49:50 +0000271
Devang Patel0c2012f2006-11-07 21:49:50 +0000272// FunctionPassManager
273
274/// Add pass P into the pass manager queue. If P is a BasicBlockPass then
275/// either use it into active basic block pass manager or create new basic
276/// block pass manager to handle pass P.
277bool
Devang Patel4e12f862006-11-08 10:44:40 +0000278FunctionPassManagerImpl_New::addPass(Pass *P) {
Devang Patel0c2012f2006-11-07 21:49:50 +0000279
280 // If P is a BasicBlockPass then use BasicBlockPassManager_New.
281 if (BasicBlockPass *BP = dynamic_cast<BasicBlockPass*>(P)) {
282
283 if (!activeBBPassManager
284 || !activeBBPassManager->addPass(BP)) {
285
286 activeBBPassManager = new BasicBlockPassManager_New();
287
288 PassVector.push_back(activeBBPassManager);
Devang Pateld65e9e92006-11-08 01:31:28 +0000289 if (!activeBBPassManager->addPass(BP))
290 assert(0 && "Unable to add Pass");
Devang Patel0c2012f2006-11-07 21:49:50 +0000291 }
292 return true;
293 }
294
295 FunctionPass *FP = dynamic_cast<FunctionPass *>(P);
296 if (!FP)
297 return false;
298
Devang Patel3c8eb622006-11-07 22:56:50 +0000299 // If this pass does not preserve anlysis that is used by other passes
300 // managed by this manager than it is not a suiable pass for this manager.
Devang Pateld65e9e92006-11-08 01:31:28 +0000301 if (!manageablePass(P))
Devang Patel3c8eb622006-11-07 22:56:50 +0000302 return false;
303
Devang Patel643676c2006-11-11 01:10:19 +0000304 // Take a note of analysis required and made available by this pass
Devang Patel3c8eb622006-11-07 22:56:50 +0000305 noteDownRequiredAnalysis(P);
Devang Patel643676c2006-11-11 01:10:19 +0000306 noteDownAvailableAnalysis(P);
Devang Patel0c2012f2006-11-07 21:49:50 +0000307
308 PassVector.push_back(FP);
309 activeBBPassManager = NULL;
310 return true;
311}
312
313/// Execute all of the passes scheduled for execution by invoking
314/// runOnFunction method. Keep track of whether any of the passes modifies
315/// the function, and if so, return true.
316bool
Devang Patel4e12f862006-11-08 10:44:40 +0000317FunctionPassManagerImpl_New::runOnModule(Module &M) {
Devang Patel0c2012f2006-11-07 21:49:50 +0000318
319 bool Changed = false;
320 for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I)
321 for (std::vector<Pass *>::iterator itr = PassVector.begin(),
322 e = PassVector.end(); itr != e; ++itr) {
323 Pass *P = *itr;
324 FunctionPass *FP = dynamic_cast<FunctionPass*>(P);
325 Changed |= FP->runOnFunction(*I);
326 }
327 return Changed;
328}
329
330
Devang Patel05e1a972006-11-07 22:03:15 +0000331// ModulePassManager implementation
332
333/// Add P into pass vector if it is manageble. If P is a FunctionPass
Devang Patel4e12f862006-11-08 10:44:40 +0000334/// then use FunctionPassManagerImpl_New to manage it. Return false if P
Devang Patel05e1a972006-11-07 22:03:15 +0000335/// is not manageable by this manager.
336bool
Devang Pateld65e9e92006-11-08 01:31:28 +0000337ModulePassManager_New::addPass(Pass *P) {
Devang Patel05e1a972006-11-07 22:03:15 +0000338
339 // If P is FunctionPass then use function pass maanager.
340 if (FunctionPass *FP = dynamic_cast<FunctionPass*>(P)) {
341
342 activeFunctionPassManager = NULL;
343
344 if (!activeFunctionPassManager
345 || !activeFunctionPassManager->addPass(P)) {
346
Devang Patel4e12f862006-11-08 10:44:40 +0000347 activeFunctionPassManager = new FunctionPassManagerImpl_New();
Devang Patel05e1a972006-11-07 22:03:15 +0000348
349 PassVector.push_back(activeFunctionPassManager);
Devang Pateld65e9e92006-11-08 01:31:28 +0000350 if (!activeFunctionPassManager->addPass(FP))
351 assert(0 && "Unable to add pass");
Devang Patel05e1a972006-11-07 22:03:15 +0000352 }
353 return true;
354 }
355
356 ModulePass *MP = dynamic_cast<ModulePass *>(P);
357 if (!MP)
358 return false;
359
Devang Patel3c8eb622006-11-07 22:56:50 +0000360 // If this pass does not preserve anlysis that is used by other passes
361 // managed by this manager than it is not a suiable pass for this manager.
Devang Pateld65e9e92006-11-08 01:31:28 +0000362 if (!manageablePass(P))
Devang Patel3c8eb622006-11-07 22:56:50 +0000363 return false;
364
Devang Patel643676c2006-11-11 01:10:19 +0000365 // Take a note of analysis required and made available by this pass
Devang Patel3c8eb622006-11-07 22:56:50 +0000366 noteDownRequiredAnalysis(P);
Devang Patel643676c2006-11-11 01:10:19 +0000367 noteDownAvailableAnalysis(P);
Devang Patel05e1a972006-11-07 22:03:15 +0000368
369 PassVector.push_back(MP);
370 activeFunctionPassManager = NULL;
371 return true;
372}
373
374
375/// Execute all of the passes scheduled for execution by invoking
376/// runOnModule method. Keep track of whether any of the passes modifies
377/// the module, and if so, return true.
378bool
379ModulePassManager_New::runOnModule(Module &M) {
380 bool Changed = false;
381 for (std::vector<Pass *>::iterator itr = PassVector.begin(),
382 e = PassVector.end(); itr != e; ++itr) {
383 Pass *P = *itr;
384 ModulePass *MP = dynamic_cast<ModulePass*>(P);
385 Changed |= MP->runOnModule(M);
386 }
387 return Changed;
388}
389
Devang Patelc290c8a2006-11-07 22:23:34 +0000390/// Schedule all passes from the queue by adding them in their
391/// respective manager's queue.
392void
Devang Patel376fefa2006-11-08 10:29:57 +0000393PassManagerImpl_New::schedulePasses() {
Devang Patelc290c8a2006-11-07 22:23:34 +0000394 /* TODO */
395}
396
397/// Add pass P to the queue of passes to run.
398void
Devang Patel376fefa2006-11-08 10:29:57 +0000399PassManagerImpl_New::add(Pass *P) {
Devang Patelc290c8a2006-11-07 22:23:34 +0000400 /* TODO */
401}
402
403// PassManager_New implementation
404/// Add P into active pass manager or use new module pass manager to
405/// manage it.
406bool
Devang Patel376fefa2006-11-08 10:29:57 +0000407PassManagerImpl_New::addPass(Pass *P) {
Devang Patelc290c8a2006-11-07 22:23:34 +0000408
Devang Patel6c9f5482006-11-11 00:42:16 +0000409 if (!activeManager || !activeManager->addPass(P)) {
Devang Patelc290c8a2006-11-07 22:23:34 +0000410 activeManager = new ModulePassManager_New();
411 PassManagers.push_back(activeManager);
412 }
413
414 return activeManager->addPass(P);
415}
416
417/// run - Execute all of the passes scheduled for execution. Keep track of
418/// whether any of the passes modifies the module, and if so, return true.
419bool
Devang Patel376fefa2006-11-08 10:29:57 +0000420PassManagerImpl_New::run(Module &M) {
Devang Patelc290c8a2006-11-07 22:23:34 +0000421
422 schedulePasses();
423 bool Changed = false;
424 for (std::vector<ModulePassManager_New *>::iterator itr = PassManagers.begin(),
425 e = PassManagers.end(); itr != e; ++itr) {
426 ModulePassManager_New *pm = *itr;
427 Changed |= pm->runOnModule(M);
428 }
429 return Changed;
430}
Devang Patel376fefa2006-11-08 10:29:57 +0000431
432/// Create new pass manager
433PassManager_New::PassManager_New() {
434 PM = new PassManagerImpl_New();
435}
436
437/// add - Add a pass to the queue of passes to run. This passes ownership of
438/// the Pass to the PassManager. When the PassManager is destroyed, the pass
439/// will be destroyed as well, so there is no need to delete the pass. This
440/// implies that all passes MUST be allocated with 'new'.
441void
442PassManager_New::add(Pass *P) {
443 PM->add(P);
444}
445
446/// run - Execute all of the passes scheduled for execution. Keep track of
447/// whether any of the passes modifies the module, and if so, return true.
448bool
449PassManager_New::run(Module &M) {
450 return PM->run(M);
451}
452