PassManager.cpp revision c63592b19ecd54a1318a19d87b5c0bd85f172a4f
155fd43f90913676682487f89f27c756adb827f66Devang Patel//===- PassManager.cpp - LLVM Pass Infrastructure Implementation ----------===//
255fd43f90913676682487f89f27c756adb827f66Devang Patel//
355fd43f90913676682487f89f27c756adb827f66Devang Patel//                     The LLVM Compiler Infrastructure
455fd43f90913676682487f89f27c756adb827f66Devang Patel//
5c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel// This file was developed by Devang Patel and is distributed under
655fd43f90913676682487f89f27c756adb827f66Devang Patel// the University of Illinois Open Source License. See LICENSE.TXT for details.
755fd43f90913676682487f89f27c756adb827f66Devang Patel//
855fd43f90913676682487f89f27c756adb827f66Devang Patel//===----------------------------------------------------------------------===//
955fd43f90913676682487f89f27c756adb827f66Devang Patel//
1055fd43f90913676682487f89f27c756adb827f66Devang Patel// This file implements the LLVM Pass Manager infrastructure.
1155fd43f90913676682487f89f27c756adb827f66Devang Patel//
1255fd43f90913676682487f89f27c756adb827f66Devang Patel//===----------------------------------------------------------------------===//
1355fd43f90913676682487f89f27c756adb827f66Devang Patel
1455fd43f90913676682487f89f27c756adb827f66Devang Patel
1555fd43f90913676682487f89f27c756adb827f66Devang Patel#include "llvm/PassManager.h"
1655fd43f90913676682487f89f27c756adb827f66Devang Patel#include "llvm/Module.h"
1755fd43f90913676682487f89f27c756adb827f66Devang Patel
1855fd43f90913676682487f89f27c756adb827f66Devang Patelusing namespace llvm;
1955fd43f90913676682487f89f27c756adb827f66Devang Patel
20c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patelnamespace llvm {
21c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
22c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel/// BasicBlockPassManager_New manages BasicBlockPass. It batches all the
23c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel/// pass together and sequence them to process one basic block before
24c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel/// processing next basic block.
25c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patelclass BasicBlockPassManager_New : public Pass,
26c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel                                  public PassManagerAnalysisHelper {
27c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
28c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patelpublic:
29c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  BasicBlockPassManager_New() { }
30c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
31c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// Add a pass into a passmanager queue.
32c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  bool addPass(Pass *p);
33c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
34c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// Execute all of the passes scheduled for execution.  Keep track of
35c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// whether any of the passes modifies the function, and if so, return true.
36c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  bool runOnFunction(Function &F);
37c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
38c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patelprivate:
39c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  // Collection of pass that are managed by this manager
40c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  std::vector<Pass *> PassVector;
41c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel};
42c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
43c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// FunctionPassManagerImpl_New manages FunctionPasses and BasicBlockPassManagers.
44c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel/// It batches all function passes and basic block pass managers together and
45c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel/// sequence them to process one function at a time before processing next
46c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel/// function.
47c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patelclass FunctionPassManagerImpl_New : public Pass,
48c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel                                public PassManagerAnalysisHelper {
49c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patelpublic:
50c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel  FunctionPassManagerImpl_New(ModuleProvider *P) { /* TODO */ }
51c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel  FunctionPassManagerImpl_New() {
52c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel    activeBBPassManager = NULL;
53c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  }
54c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel  ~FunctionPassManagerImpl_New() { /* TODO */ };
55c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
56c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// add - Add a pass to the queue of passes to run.  This passes
57c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// ownership of the Pass to the PassManager.  When the
58c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// PassManager_X is destroyed, the pass will be destroyed as well, so
59c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// there is no need to delete the pass. (TODO delete passes.)
60c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// This implies that all passes MUST be allocated with 'new'.
61c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  void add(Pass *P) { /* TODO*/  }
62c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
63c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// Add pass into the pass manager queue.
64c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  bool addPass(Pass *P);
65c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
66c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// Execute all of the passes scheduled for execution.  Keep
67c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// track of whether any of the passes modifies the function, and if
68c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// so, return true.
69c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  bool runOnModule(Module &M);
70c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
71c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patelprivate:
72c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  // Collection of pass that are manged by this manager
73c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  std::vector<Pass *> PassVector;
74c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
75c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  // Active Pass Managers
76c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  BasicBlockPassManager_New *activeBBPassManager;
77c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel};
78c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
79c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel/// ModulePassManager_New manages ModulePasses and function pass managers.
80c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel/// It batches all Module passes  passes and function pass managers together and
81c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel/// sequence them to process one module.
82c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patelclass ModulePassManager_New : public Pass,
83c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel                              public PassManagerAnalysisHelper {
84c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
85c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patelpublic:
86c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  ModulePassManager_New() { activeFunctionPassManager = NULL; }
87c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
88c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// Add a pass into a passmanager queue.
89c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  bool addPass(Pass *p);
90c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
91c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// run - Execute all of the passes scheduled for execution.  Keep track of
92c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// whether any of the passes modifies the module, and if so, return true.
93c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  bool runOnModule(Module &M);
94c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
95c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patelprivate:
96c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  // Collection of pass that are managed by this manager
97c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  std::vector<Pass *> PassVector;
98c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
99c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  // Active Pass Manager
100c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel  FunctionPassManagerImpl_New *activeFunctionPassManager;
101c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel};
102c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
1035a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel/// PassManager_New manages ModulePassManagers
1045a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patelclass PassManagerImpl_New : public Pass,
1055a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel                            public PassManagerAnalysisHelper {
1065a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
1075a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patelpublic:
1085a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
1095a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  /// add - Add a pass to the queue of passes to run.  This passes ownership of
1105a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  /// the Pass to the PassManager.  When the PassManager is destroyed, the pass
1115a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  /// will be destroyed as well, so there is no need to delete the pass.  This
1125a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  /// implies that all passes MUST be allocated with 'new'.
1135a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  void add(Pass *P);
1145a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
1155a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  /// run - Execute all of the passes scheduled for execution.  Keep track of
1165a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  /// whether any of the passes modifies the module, and if so, return true.
1175a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  bool run(Module &M);
1185a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
1195a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patelprivate:
1205a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
1215a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  /// Add a pass into a passmanager queue. This is used by schedulePasses
1225a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  bool addPass(Pass *p);
1235a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
1245a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  /// Schedule all passes collected in pass queue using add(). Add all the
1255a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  /// schedule passes into various manager's queue using addPass().
1265a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  void schedulePasses();
1275a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
1285a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  // Collection of pass managers
1295a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  std::vector<ModulePassManager_New *> PassManagers;
1305a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
1315a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  // Collection of pass that are not yet scheduled
1325a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  std::vector<Pass *> PassVector;
1335a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
1345a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  // Active Pass Manager
1355a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  ModulePassManager_New *activeManager;
1365a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel};
1375a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
138c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel} // End of llvm namespace
139c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
140889739c4d188d28c167644bced9df0f3131317d7Devang Patel// PassManagerAnalysisHelper implementation
141889739c4d188d28c167644bced9df0f3131317d7Devang Patel
1422c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel/// Return true IFF pass P's required analysis set does not required new
143889739c4d188d28c167644bced9df0f3131317d7Devang Patel/// manager.
144889739c4d188d28c167644bced9df0f3131317d7Devang Patelbool PassManagerAnalysisHelper::manageablePass(Pass *P) {
145889739c4d188d28c167644bced9df0f3131317d7Devang Patel
146889739c4d188d28c167644bced9df0f3131317d7Devang Patel  AnalysisUsage AnUsage;
147889739c4d188d28c167644bced9df0f3131317d7Devang Patel  P->getAnalysisUsage(AnUsage);
148889739c4d188d28c167644bced9df0f3131317d7Devang Patel
149889739c4d188d28c167644bced9df0f3131317d7Devang Patel  // If this pass is not preserving information that is required by the other passes
150889739c4d188d28c167644bced9df0f3131317d7Devang Patel  // managed by this manager then use new manager
151889739c4d188d28c167644bced9df0f3131317d7Devang Patel  // TODO
152889739c4d188d28c167644bced9df0f3131317d7Devang Patel  return true;
153889739c4d188d28c167644bced9df0f3131317d7Devang Patel}
154889739c4d188d28c167644bced9df0f3131317d7Devang Patel
1552c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel/// Return true IFF AnalysisID AID is currently available.
156889739c4d188d28c167644bced9df0f3131317d7Devang Patelbool PassManagerAnalysisHelper::analysisCurrentlyAvailable(AnalysisID AID) {
157889739c4d188d28c167644bced9df0f3131317d7Devang Patel
158889739c4d188d28c167644bced9df0f3131317d7Devang Patel  // TODO
159889739c4d188d28c167644bced9df0f3131317d7Devang Patel  return false;
160889739c4d188d28c167644bced9df0f3131317d7Devang Patel}
161889739c4d188d28c167644bced9df0f3131317d7Devang Patel
162889739c4d188d28c167644bced9df0f3131317d7Devang Patel/// Augment RequiredSet by adding analysis required by pass P.
163889739c4d188d28c167644bced9df0f3131317d7Devang Patelvoid PassManagerAnalysisHelper::noteDownRequiredAnalysis(Pass *P) {
164889739c4d188d28c167644bced9df0f3131317d7Devang Patel
165889739c4d188d28c167644bced9df0f3131317d7Devang Patel  // TODO
166889739c4d188d28c167644bced9df0f3131317d7Devang Patel}
167889739c4d188d28c167644bced9df0f3131317d7Devang Patel
168889739c4d188d28c167644bced9df0f3131317d7Devang Patel/// Remove AnalysisID from the RequiredSet
169889739c4d188d28c167644bced9df0f3131317d7Devang Patelvoid PassManagerAnalysisHelper::removeAnalysis(AnalysisID AID) {
170889739c4d188d28c167644bced9df0f3131317d7Devang Patel
171889739c4d188d28c167644bced9df0f3131317d7Devang Patel  // TODO
172889739c4d188d28c167644bced9df0f3131317d7Devang Patel}
173889739c4d188d28c167644bced9df0f3131317d7Devang Patel
174889739c4d188d28c167644bced9df0f3131317d7Devang Patel/// Remove Analyss not preserved by Pass P
175889739c4d188d28c167644bced9df0f3131317d7Devang Patelvoid PassManagerAnalysisHelper::removeNotPreservedAnalysis(Pass *P) {
176889739c4d188d28c167644bced9df0f3131317d7Devang Patel
177889739c4d188d28c167644bced9df0f3131317d7Devang Patel  // TODO
178889739c4d188d28c167644bced9df0f3131317d7Devang Patel}
179889739c4d188d28c167644bced9df0f3131317d7Devang Patel
18055fd43f90913676682487f89f27c756adb827f66Devang Patel/// BasicBlockPassManager implementation
18155fd43f90913676682487f89f27c756adb827f66Devang Patel
1822c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel/// Add pass P into PassVector and return true. If this pass is not
1832c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel/// manageable by this manager then return false.
18455fd43f90913676682487f89f27c756adb827f66Devang Patelbool
1852c5d1851bbcb20adb79664ec16ab1f97b9142086Devang PatelBasicBlockPassManager_New::addPass(Pass *P) {
18655fd43f90913676682487f89f27c756adb827f66Devang Patel
18755fd43f90913676682487f89f27c756adb827f66Devang Patel  BasicBlockPass *BP = dynamic_cast<BasicBlockPass*>(P);
18855fd43f90913676682487f89f27c756adb827f66Devang Patel  if (!BP)
18955fd43f90913676682487f89f27c756adb827f66Devang Patel    return false;
19055fd43f90913676682487f89f27c756adb827f66Devang Patel
19153596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel  // If this pass does not preserve anlysis that is used by other passes
19253596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel  // managed by this manager than it is not a suiable pass for this manager.
1932c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel  if (!manageablePass(P))
19453596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel    return false;
19553596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel
19653596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel  // Take a note of analysis required by this pass.
19753596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel  noteDownRequiredAnalysis(P);
19855fd43f90913676682487f89f27c756adb827f66Devang Patel
19955fd43f90913676682487f89f27c756adb827f66Devang Patel  // Add pass
20055fd43f90913676682487f89f27c756adb827f66Devang Patel  PassVector.push_back(BP);
20155fd43f90913676682487f89f27c756adb827f66Devang Patel  return true;
20255fd43f90913676682487f89f27c756adb827f66Devang Patel}
20355fd43f90913676682487f89f27c756adb827f66Devang Patel
20455fd43f90913676682487f89f27c756adb827f66Devang Patel/// Execute all of the passes scheduled for execution by invoking
20555fd43f90913676682487f89f27c756adb827f66Devang Patel/// runOnBasicBlock method.  Keep track of whether any of the passes modifies
20655fd43f90913676682487f89f27c756adb827f66Devang Patel/// the function, and if so, return true.
20755fd43f90913676682487f89f27c756adb827f66Devang Patelbool
20855fd43f90913676682487f89f27c756adb827f66Devang PatelBasicBlockPassManager_New::runOnFunction(Function &F) {
20955fd43f90913676682487f89f27c756adb827f66Devang Patel
21055fd43f90913676682487f89f27c756adb827f66Devang Patel  bool Changed = false;
21155fd43f90913676682487f89f27c756adb827f66Devang Patel  for (Function::iterator I = F.begin(), E = F.end(); I != E; ++I)
21255fd43f90913676682487f89f27c756adb827f66Devang Patel    for (std::vector<Pass *>::iterator itr = PassVector.begin(),
21355fd43f90913676682487f89f27c756adb827f66Devang Patel           e = PassVector.end(); itr != e; ++itr) {
21455fd43f90913676682487f89f27c756adb827f66Devang Patel      Pass *P = *itr;
21555fd43f90913676682487f89f27c756adb827f66Devang Patel      BasicBlockPass *BP = dynamic_cast<BasicBlockPass*>(P);
21655fd43f90913676682487f89f27c756adb827f66Devang Patel      Changed |= BP->runOnBasicBlock(*I);
21755fd43f90913676682487f89f27c756adb827f66Devang Patel    }
21855fd43f90913676682487f89f27c756adb827f66Devang Patel  return Changed;
21955fd43f90913676682487f89f27c756adb827f66Devang Patel}
22055fd43f90913676682487f89f27c756adb827f66Devang Patel
221448d27cd795dc273249f123444509403f4fa4facDevang Patel// FunctionPassManager_New implementation
222c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// Create new Function pass manager
223c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang PatelFunctionPassManager_New::FunctionPassManager_New() {
224c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel  FPM = new FunctionPassManagerImpl_New();
225c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel}
226c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel
227c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// add - Add a pass to the queue of passes to run.  This passes
228c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// ownership of the Pass to the PassManager.  When the
229c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// PassManager_X is destroyed, the pass will be destroyed as well, so
230c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// there is no need to delete the pass. (TODO delete passes.)
231c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// This implies that all passes MUST be allocated with 'new'.
232c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patelvoid
233c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang PatelFunctionPassManager_New::add(Pass *P) {
234c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel  FPM->add(P);
235c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel}
236c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel
237c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// Execute all of the passes scheduled for execution.  Keep
238c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// track of whether any of the passes modifies the function, and if
239c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// so, return true.
240c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patelbool
241c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang PatelFunctionPassManager_New::runOnModule(Module &M) {
242c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel  return FPM->runOnModule(M);
243c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel}
244c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel
245c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel// FunctionPassManagerImpl_New implementation
246448d27cd795dc273249f123444509403f4fa4facDevang Patel
247448d27cd795dc273249f123444509403f4fa4facDevang Patel// FunctionPassManager
248448d27cd795dc273249f123444509403f4fa4facDevang Patel
249448d27cd795dc273249f123444509403f4fa4facDevang Patel/// Add pass P into the pass manager queue. If P is a BasicBlockPass then
250448d27cd795dc273249f123444509403f4fa4facDevang Patel/// either use it into active basic block pass manager or create new basic
251448d27cd795dc273249f123444509403f4fa4facDevang Patel/// block pass manager to handle pass P.
252448d27cd795dc273249f123444509403f4fa4facDevang Patelbool
253c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang PatelFunctionPassManagerImpl_New::addPass(Pass *P) {
254448d27cd795dc273249f123444509403f4fa4facDevang Patel
255448d27cd795dc273249f123444509403f4fa4facDevang Patel  // If P is a BasicBlockPass then use BasicBlockPassManager_New.
256448d27cd795dc273249f123444509403f4fa4facDevang Patel  if (BasicBlockPass *BP = dynamic_cast<BasicBlockPass*>(P)) {
257448d27cd795dc273249f123444509403f4fa4facDevang Patel
258448d27cd795dc273249f123444509403f4fa4facDevang Patel    if (!activeBBPassManager
259448d27cd795dc273249f123444509403f4fa4facDevang Patel        || !activeBBPassManager->addPass(BP)) {
260448d27cd795dc273249f123444509403f4fa4facDevang Patel
261448d27cd795dc273249f123444509403f4fa4facDevang Patel      activeBBPassManager = new BasicBlockPassManager_New();
262448d27cd795dc273249f123444509403f4fa4facDevang Patel
263448d27cd795dc273249f123444509403f4fa4facDevang Patel      PassVector.push_back(activeBBPassManager);
2642c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel      if (!activeBBPassManager->addPass(BP))
2652c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel        assert(0 && "Unable to add Pass");
266448d27cd795dc273249f123444509403f4fa4facDevang Patel    }
267448d27cd795dc273249f123444509403f4fa4facDevang Patel    return true;
268448d27cd795dc273249f123444509403f4fa4facDevang Patel  }
269448d27cd795dc273249f123444509403f4fa4facDevang Patel
270448d27cd795dc273249f123444509403f4fa4facDevang Patel  FunctionPass *FP = dynamic_cast<FunctionPass *>(P);
271448d27cd795dc273249f123444509403f4fa4facDevang Patel  if (!FP)
272448d27cd795dc273249f123444509403f4fa4facDevang Patel    return false;
273448d27cd795dc273249f123444509403f4fa4facDevang Patel
27453596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel  // If this pass does not preserve anlysis that is used by other passes
27553596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel  // managed by this manager than it is not a suiable pass for this manager.
2762c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel  if (!manageablePass(P))
27753596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel    return false;
27853596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel
27953596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel  // Take a note of analysis required by this pass.
28053596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel  noteDownRequiredAnalysis(P);
281448d27cd795dc273249f123444509403f4fa4facDevang Patel
282448d27cd795dc273249f123444509403f4fa4facDevang Patel  PassVector.push_back(FP);
283448d27cd795dc273249f123444509403f4fa4facDevang Patel  activeBBPassManager = NULL;
284448d27cd795dc273249f123444509403f4fa4facDevang Patel  return true;
285448d27cd795dc273249f123444509403f4fa4facDevang Patel}
286448d27cd795dc273249f123444509403f4fa4facDevang Patel
287448d27cd795dc273249f123444509403f4fa4facDevang Patel/// Execute all of the passes scheduled for execution by invoking
288448d27cd795dc273249f123444509403f4fa4facDevang Patel/// runOnFunction method.  Keep track of whether any of the passes modifies
289448d27cd795dc273249f123444509403f4fa4facDevang Patel/// the function, and if so, return true.
290448d27cd795dc273249f123444509403f4fa4facDevang Patelbool
291c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang PatelFunctionPassManagerImpl_New::runOnModule(Module &M) {
292448d27cd795dc273249f123444509403f4fa4facDevang Patel
293448d27cd795dc273249f123444509403f4fa4facDevang Patel  bool Changed = false;
294448d27cd795dc273249f123444509403f4fa4facDevang Patel  for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I)
295448d27cd795dc273249f123444509403f4fa4facDevang Patel    for (std::vector<Pass *>::iterator itr = PassVector.begin(),
296448d27cd795dc273249f123444509403f4fa4facDevang Patel           e = PassVector.end(); itr != e; ++itr) {
297448d27cd795dc273249f123444509403f4fa4facDevang Patel      Pass *P = *itr;
298448d27cd795dc273249f123444509403f4fa4facDevang Patel      FunctionPass *FP = dynamic_cast<FunctionPass*>(P);
299448d27cd795dc273249f123444509403f4fa4facDevang Patel      Changed |= FP->runOnFunction(*I);
300448d27cd795dc273249f123444509403f4fa4facDevang Patel    }
301448d27cd795dc273249f123444509403f4fa4facDevang Patel  return Changed;
302448d27cd795dc273249f123444509403f4fa4facDevang Patel}
303448d27cd795dc273249f123444509403f4fa4facDevang Patel
304448d27cd795dc273249f123444509403f4fa4facDevang Patel
30592c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel// ModulePassManager implementation
30692c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel
30792c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel/// Add P into pass vector if it is manageble. If P is a FunctionPass
308c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// then use FunctionPassManagerImpl_New to manage it. Return false if P
30992c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel/// is not manageable by this manager.
31092c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patelbool
3112c5d1851bbcb20adb79664ec16ab1f97b9142086Devang PatelModulePassManager_New::addPass(Pass *P) {
31292c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel
31392c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel  // If P is FunctionPass then use function pass maanager.
31492c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel  if (FunctionPass *FP = dynamic_cast<FunctionPass*>(P)) {
31592c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel
31692c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel    activeFunctionPassManager = NULL;
31792c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel
31892c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel    if (!activeFunctionPassManager
31992c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel        || !activeFunctionPassManager->addPass(P)) {
32092c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel
321c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel      activeFunctionPassManager = new FunctionPassManagerImpl_New();
32292c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel
32392c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel      PassVector.push_back(activeFunctionPassManager);
3242c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel      if (!activeFunctionPassManager->addPass(FP))
3252c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel        assert(0 && "Unable to add pass");
32692c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel    }
32792c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel    return true;
32892c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel  }
32992c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel
33092c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel  ModulePass *MP = dynamic_cast<ModulePass *>(P);
33192c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel  if (!MP)
33292c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel    return false;
33392c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel
33453596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel  // If this pass does not preserve anlysis that is used by other passes
33553596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel  // managed by this manager than it is not a suiable pass for this manager.
3362c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel  if (!manageablePass(P))
33753596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel    return false;
33853596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel
33953596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel  // Take a note of analysis required by this pass.
34053596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel  noteDownRequiredAnalysis(P);
34192c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel
34292c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel  PassVector.push_back(MP);
34392c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel  activeFunctionPassManager = NULL;
34492c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel  return true;
34592c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel}
34692c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel
34792c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel
34892c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel/// Execute all of the passes scheduled for execution by invoking
34992c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel/// runOnModule method.  Keep track of whether any of the passes modifies
35092c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel/// the module, and if so, return true.
35192c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patelbool
35292c45eebf77de5d6ee84a3f18f560b83cb68e720Devang PatelModulePassManager_New::runOnModule(Module &M) {
35392c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel  bool Changed = false;
35492c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel  for (std::vector<Pass *>::iterator itr = PassVector.begin(),
35592c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel         e = PassVector.end(); itr != e; ++itr) {
35692c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel    Pass *P = *itr;
35792c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel    ModulePass *MP = dynamic_cast<ModulePass*>(P);
35892c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel    Changed |= MP->runOnModule(M);
35992c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel  }
36092c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel  return Changed;
36192c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel}
36292c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel
363b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel/// Schedule all passes from the queue by adding them in their
364b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel/// respective manager's queue.
365b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patelvoid
3665a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang PatelPassManagerImpl_New::schedulePasses() {
367b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel  /* TODO */
368b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel}
369b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel
370b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel/// Add pass P to the queue of passes to run.
371b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patelvoid
3725a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang PatelPassManagerImpl_New::add(Pass *P) {
373b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel  /* TODO */
374b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel}
375b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel
376b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel// PassManager_New implementation
377b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel/// Add P into active pass manager or use new module pass manager to
378b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel/// manage it.
379b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patelbool
3805a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang PatelPassManagerImpl_New::addPass(Pass *P) {
381b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel
382b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel  if (!activeManager) {
383b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel    activeManager = new ModulePassManager_New();
384b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel    PassManagers.push_back(activeManager);
385b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel  }
386b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel
387b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel  return activeManager->addPass(P);
388b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel}
389b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel
390b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel/// run - Execute all of the passes scheduled for execution.  Keep track of
391b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel/// whether any of the passes modifies the module, and if so, return true.
392b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patelbool
3935a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang PatelPassManagerImpl_New::run(Module &M) {
394b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel
395b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel  schedulePasses();
396b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel  bool Changed = false;
397b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel  for (std::vector<ModulePassManager_New *>::iterator itr = PassManagers.begin(),
398b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel         e = PassManagers.end(); itr != e; ++itr) {
399b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel    ModulePassManager_New *pm = *itr;
400b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel    Changed |= pm->runOnModule(M);
401b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel  }
402b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel  return Changed;
403b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel}
4045a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
4055a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel/// Create new pass manager
4065a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang PatelPassManager_New::PassManager_New() {
4075a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  PM = new PassManagerImpl_New();
4085a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel}
4095a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
4105a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel/// add - Add a pass to the queue of passes to run.  This passes ownership of
4115a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel/// the Pass to the PassManager.  When the PassManager is destroyed, the pass
4125a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel/// will be destroyed as well, so there is no need to delete the pass.  This
4135a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel/// implies that all passes MUST be allocated with 'new'.
4145a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patelvoid
4155a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang PatelPassManager_New::add(Pass *P) {
4165a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  PM->add(P);
4175a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel}
4185a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
4195a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel/// run - Execute all of the passes scheduled for execution.  Keep track of
4205a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel/// whether any of the passes modifies the module, and if so, return true.
4215a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patelbool
4225a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang PatelPassManager_New::run(Module &M) {
4235a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  return PM->run(M);
4245a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel}
4255a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
426