PassManager.cpp revision 14d6581a7374bdb4a66ef6c30250efdc324f6dde
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.
2537a84c7d8bda439082b883e33be6ab88b4cce236Devang Patelclass BasicBlockPassManager_New : public CommonPassManagerImpl {
26c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
27c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patelpublic:
28c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  BasicBlockPassManager_New() { }
29c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
30c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// Add a pass into a passmanager queue.
31c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  bool addPass(Pass *p);
32c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
33c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// Execute all of the passes scheduled for execution.  Keep track of
34c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// whether any of the passes modifies the function, and if so, return true.
35c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  bool runOnFunction(Function &F);
36c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
37c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patelprivate:
38c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  // Collection of pass that are managed by this manager
39c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  std::vector<Pass *> PassVector;
40c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel};
41c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
42c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// FunctionPassManagerImpl_New manages FunctionPasses and BasicBlockPassManagers.
43c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel/// It batches all function passes and basic block pass managers together and
44c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel/// sequence them to process one function at a time before processing next
45c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel/// function.
4637a84c7d8bda439082b883e33be6ab88b4cce236Devang Patelclass FunctionPassManagerImpl_New : public CommonPassManagerImpl {
47c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patelpublic:
48c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel  FunctionPassManagerImpl_New(ModuleProvider *P) { /* TODO */ }
49c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel  FunctionPassManagerImpl_New() {
50c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel    activeBBPassManager = NULL;
51c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  }
52c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel  ~FunctionPassManagerImpl_New() { /* TODO */ };
53c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
54c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// add - Add a pass to the queue of passes to run.  This passes
55c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// ownership of the Pass to the PassManager.  When the
56c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// PassManager_X is destroyed, the pass will be destroyed as well, so
57c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// there is no need to delete the pass. (TODO delete passes.)
58c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// This implies that all passes MUST be allocated with 'new'.
59c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  void add(Pass *P) { /* TODO*/  }
60c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
61c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// Add pass into the pass manager queue.
62c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  bool addPass(Pass *P);
63c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
64c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// Execute all of the passes scheduled for execution.  Keep
65c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// track of whether any of the passes modifies the function, and if
66c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// so, return true.
67c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  bool runOnModule(Module &M);
68c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
69c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patelprivate:
70c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  // Collection of pass that are manged by this manager
71c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  std::vector<Pass *> PassVector;
72c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
73c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  // Active Pass Managers
74c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  BasicBlockPassManager_New *activeBBPassManager;
75c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel};
76c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
77c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel/// ModulePassManager_New manages ModulePasses and function pass managers.
78c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel/// It batches all Module passes  passes and function pass managers together and
79c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel/// sequence them to process one module.
8037a84c7d8bda439082b883e33be6ab88b4cce236Devang Patelclass ModulePassManager_New : public CommonPassManagerImpl {
81c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
82c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patelpublic:
83c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  ModulePassManager_New() { activeFunctionPassManager = NULL; }
84c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
85c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// Add a pass into a passmanager queue.
86c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  bool addPass(Pass *p);
87c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
88c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// run - Execute all of the passes scheduled for execution.  Keep track of
89c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// whether any of the passes modifies the module, and if so, return true.
90c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  bool runOnModule(Module &M);
91c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
92c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patelprivate:
93c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  // Collection of pass that are managed by this manager
94c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  std::vector<Pass *> PassVector;
95c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
96c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  // Active Pass Manager
97c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel  FunctionPassManagerImpl_New *activeFunctionPassManager;
98c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel};
99c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
1005a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel/// PassManager_New manages ModulePassManagers
10137a84c7d8bda439082b883e33be6ab88b4cce236Devang Patelclass PassManagerImpl_New : public CommonPassManagerImpl {
1025a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
1035a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patelpublic:
1045a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
1055a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  /// add - Add a pass to the queue of passes to run.  This passes ownership of
1065a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  /// the Pass to the PassManager.  When the PassManager is destroyed, the pass
1075a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  /// will be destroyed as well, so there is no need to delete the pass.  This
1085a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  /// implies that all passes MUST be allocated with 'new'.
1095a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  void add(Pass *P);
1105a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
1115a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  /// run - Execute all of the passes scheduled for execution.  Keep track of
1125a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  /// whether any of the passes modifies the module, and if so, return true.
1135a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  bool run(Module &M);
1145a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
1155a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patelprivate:
1165a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
1175a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  /// Add a pass into a passmanager queue. This is used by schedulePasses
1185a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  bool addPass(Pass *p);
1195a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
1205a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  /// Schedule all passes collected in pass queue using add(). Add all the
1215a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  /// schedule passes into various manager's queue using addPass().
1225a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  void schedulePasses();
1235a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
1245a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  // Collection of pass managers
1255a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  std::vector<ModulePassManager_New *> PassManagers;
1265a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
1275a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  // Collection of pass that are not yet scheduled
1285a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  std::vector<Pass *> PassVector;
1295a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
1305a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  // Active Pass Manager
1315a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  ModulePassManager_New *activeManager;
1325a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel};
1335a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
134c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel} // End of llvm namespace
135c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
13637a84c7d8bda439082b883e33be6ab88b4cce236Devang Patel// CommonPassManagerImpl implementation
137889739c4d188d28c167644bced9df0f3131317d7Devang Patel
1382c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel/// Return true IFF pass P's required analysis set does not required new
139889739c4d188d28c167644bced9df0f3131317d7Devang Patel/// manager.
14037a84c7d8bda439082b883e33be6ab88b4cce236Devang Patelbool CommonPassManagerImpl::manageablePass(Pass *P) {
141889739c4d188d28c167644bced9df0f3131317d7Devang Patel
142889739c4d188d28c167644bced9df0f3131317d7Devang Patel  AnalysisUsage AnUsage;
143889739c4d188d28c167644bced9df0f3131317d7Devang Patel  P->getAnalysisUsage(AnUsage);
144889739c4d188d28c167644bced9df0f3131317d7Devang Patel
145a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel  // If this pass is not preserving information that is required by the other
146a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel  // passes managed by this manager then use new manager
147a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel  if (!AnUsage.getPreservesAll()) {
148a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel    const std::vector<AnalysisID> &PreservedSet = AnUsage.getPreservedSet();
149a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel    for (std::vector<AnalysisID>::iterator I = RequiredAnalysis.begin(),
150a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel           E = RequiredAnalysis.end(); I != E; ++I) {
151a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel      if (std::find(PreservedSet.begin(), PreservedSet.end(), *I) ==
152a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel          PreservedSet.end())
153a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel        // This analysis is not preserved. Need new manager.
154a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel        return false;
155a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel    }
156a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel  }
157889739c4d188d28c167644bced9df0f3131317d7Devang Patel  return true;
158889739c4d188d28c167644bced9df0f3131317d7Devang Patel}
159889739c4d188d28c167644bced9df0f3131317d7Devang Patel
1602c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel/// Return true IFF AnalysisID AID is currently available.
16137a84c7d8bda439082b883e33be6ab88b4cce236Devang Patelbool CommonPassManagerImpl::analysisCurrentlyAvailable(AnalysisID AID) {
162889739c4d188d28c167644bced9df0f3131317d7Devang Patel
163889739c4d188d28c167644bced9df0f3131317d7Devang Patel  // TODO
164889739c4d188d28c167644bced9df0f3131317d7Devang Patel  return false;
165889739c4d188d28c167644bced9df0f3131317d7Devang Patel}
166889739c4d188d28c167644bced9df0f3131317d7Devang Patel
167b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel/// Augment RequiredAnalysis by adding analysis required by pass P.
16837a84c7d8bda439082b883e33be6ab88b4cce236Devang Patelvoid CommonPassManagerImpl::noteDownRequiredAnalysis(Pass *P) {
169a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel  AnalysisUsage AnUsage;
170a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel  P->getAnalysisUsage(AnUsage);
171a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel  const std::vector<AnalysisID> &RequiredSet = AnUsage.getRequiredSet();
172889739c4d188d28c167644bced9df0f3131317d7Devang Patel
173a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel  // FIXME: What about duplicates ?
17414d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel  RequiredAnalysis.insert(RequiredAnalysis.end(), RequiredSet.begin(),
17514d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel                          RequiredSet.end());
176889739c4d188d28c167644bced9df0f3131317d7Devang Patel}
177889739c4d188d28c167644bced9df0f3131317d7Devang Patel
178b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel/// Augement AvailableAnalysis by adding analysis made available by pass P.
179b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patelvoid CommonPassManagerImpl::noteDownAvailableAnalysis(Pass *P) {
180b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel
181b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel  if (const PassInfo *PI = P->getPassInfo()) {
182b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel    AvailableAnalysis.insert(PI);
183b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel
184b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel    //TODO This pass is the current implementation of all of the interfaces it
185b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel    //TODO implements as well.
186b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel    //TODO
187b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel    //TODO const std::vector<const PassInfo*> &II = PI->getInterfacesImplemented();
188b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel    //TODO for (unsigned i = 0, e = II.size(); i != e; ++i)
189b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel    //TODO CurrentAnalyses[II[i]] = P;
190b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel  }
191b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel}
192b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel
193889739c4d188d28c167644bced9df0f3131317d7Devang Patel/// Remove AnalysisID from the RequiredSet
19437a84c7d8bda439082b883e33be6ab88b4cce236Devang Patelvoid CommonPassManagerImpl::removeAnalysis(AnalysisID AID) {
195889739c4d188d28c167644bced9df0f3131317d7Devang Patel
196889739c4d188d28c167644bced9df0f3131317d7Devang Patel  // TODO
197889739c4d188d28c167644bced9df0f3131317d7Devang Patel}
198889739c4d188d28c167644bced9df0f3131317d7Devang Patel
199889739c4d188d28c167644bced9df0f3131317d7Devang Patel/// Remove Analyss not preserved by Pass P
20037a84c7d8bda439082b883e33be6ab88b4cce236Devang Patelvoid CommonPassManagerImpl::removeNotPreservedAnalysis(Pass *P) {
20114d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel  AnalysisUsage AnUsage;
20214d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel  P->getAnalysisUsage(AnUsage);
20314d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel  const std::vector<AnalysisID> &PreservedSet = AnUsage.getPreservedSet();
20414d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel
20514d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel  for (std::set<AnalysisID>::iterator I = AvailableAnalysis.begin(),
20614d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel         E = AvailableAnalysis.end(); I != E; ++I ) {
20714d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel    AnalysisID AID = *I;
20814d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel    if (std::find(PreservedSet.begin(), PreservedSet.end(), *I) ==
20914d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel        PreservedSet.end()) {
21014d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel      // Remove this analysis
21114d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel      std::set<AnalysisID>::iterator J = I++;
21214d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel      AvailableAnalysis.erase(J);
21314d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel    }
21414d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel  }
215889739c4d188d28c167644bced9df0f3131317d7Devang Patel}
216889739c4d188d28c167644bced9df0f3131317d7Devang Patel
21755fd43f90913676682487f89f27c756adb827f66Devang Patel/// BasicBlockPassManager implementation
21855fd43f90913676682487f89f27c756adb827f66Devang Patel
2192c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel/// Add pass P into PassVector and return true. If this pass is not
2202c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel/// manageable by this manager then return false.
22155fd43f90913676682487f89f27c756adb827f66Devang Patelbool
2222c5d1851bbcb20adb79664ec16ab1f97b9142086Devang PatelBasicBlockPassManager_New::addPass(Pass *P) {
22355fd43f90913676682487f89f27c756adb827f66Devang Patel
22455fd43f90913676682487f89f27c756adb827f66Devang Patel  BasicBlockPass *BP = dynamic_cast<BasicBlockPass*>(P);
22555fd43f90913676682487f89f27c756adb827f66Devang Patel  if (!BP)
22655fd43f90913676682487f89f27c756adb827f66Devang Patel    return false;
22755fd43f90913676682487f89f27c756adb827f66Devang Patel
22853596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel  // If this pass does not preserve anlysis that is used by other passes
22953596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel  // managed by this manager than it is not a suiable pass for this manager.
2302c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel  if (!manageablePass(P))
23153596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel    return false;
23253596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel
233b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel  // Take a note of analysis required and made available by this pass
23453596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel  noteDownRequiredAnalysis(P);
235b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel  noteDownAvailableAnalysis(P);
23655fd43f90913676682487f89f27c756adb827f66Devang Patel
23755fd43f90913676682487f89f27c756adb827f66Devang Patel  // Add pass
23855fd43f90913676682487f89f27c756adb827f66Devang Patel  PassVector.push_back(BP);
23914d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel
24014d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel  // Remove the analysis not preserved by this pass
24114d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel  removeNotPreservedAnalysis(P);
24214d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel
24355fd43f90913676682487f89f27c756adb827f66Devang Patel  return true;
24455fd43f90913676682487f89f27c756adb827f66Devang Patel}
24555fd43f90913676682487f89f27c756adb827f66Devang Patel
24655fd43f90913676682487f89f27c756adb827f66Devang Patel/// Execute all of the passes scheduled for execution by invoking
24755fd43f90913676682487f89f27c756adb827f66Devang Patel/// runOnBasicBlock method.  Keep track of whether any of the passes modifies
24855fd43f90913676682487f89f27c756adb827f66Devang Patel/// the function, and if so, return true.
24955fd43f90913676682487f89f27c756adb827f66Devang Patelbool
25055fd43f90913676682487f89f27c756adb827f66Devang PatelBasicBlockPassManager_New::runOnFunction(Function &F) {
25155fd43f90913676682487f89f27c756adb827f66Devang Patel
25255fd43f90913676682487f89f27c756adb827f66Devang Patel  bool Changed = false;
25355fd43f90913676682487f89f27c756adb827f66Devang Patel  for (Function::iterator I = F.begin(), E = F.end(); I != E; ++I)
25455fd43f90913676682487f89f27c756adb827f66Devang Patel    for (std::vector<Pass *>::iterator itr = PassVector.begin(),
25555fd43f90913676682487f89f27c756adb827f66Devang Patel           e = PassVector.end(); itr != e; ++itr) {
25655fd43f90913676682487f89f27c756adb827f66Devang Patel      Pass *P = *itr;
25755fd43f90913676682487f89f27c756adb827f66Devang Patel      BasicBlockPass *BP = dynamic_cast<BasicBlockPass*>(P);
25855fd43f90913676682487f89f27c756adb827f66Devang Patel      Changed |= BP->runOnBasicBlock(*I);
25955fd43f90913676682487f89f27c756adb827f66Devang Patel    }
26055fd43f90913676682487f89f27c756adb827f66Devang Patel  return Changed;
26155fd43f90913676682487f89f27c756adb827f66Devang Patel}
26255fd43f90913676682487f89f27c756adb827f66Devang Patel
263448d27cd795dc273249f123444509403f4fa4facDevang Patel// FunctionPassManager_New implementation
264c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// Create new Function pass manager
265c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang PatelFunctionPassManager_New::FunctionPassManager_New() {
266c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel  FPM = new FunctionPassManagerImpl_New();
267c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel}
268c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel
269c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// add - Add a pass to the queue of passes to run.  This passes
270c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// ownership of the Pass to the PassManager.  When the
271c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// PassManager_X is destroyed, the pass will be destroyed as well, so
272c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// there is no need to delete the pass. (TODO delete passes.)
273c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// This implies that all passes MUST be allocated with 'new'.
274c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patelvoid
275c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang PatelFunctionPassManager_New::add(Pass *P) {
276c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel  FPM->add(P);
277c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel}
278c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel
279c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// Execute all of the passes scheduled for execution.  Keep
280c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// track of whether any of the passes modifies the function, and if
281c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// so, return true.
282c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patelbool
283c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang PatelFunctionPassManager_New::runOnModule(Module &M) {
284c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel  return FPM->runOnModule(M);
285c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel}
286c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel
287c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel// FunctionPassManagerImpl_New implementation
288448d27cd795dc273249f123444509403f4fa4facDevang Patel
289448d27cd795dc273249f123444509403f4fa4facDevang Patel// FunctionPassManager
290448d27cd795dc273249f123444509403f4fa4facDevang Patel
291448d27cd795dc273249f123444509403f4fa4facDevang Patel/// Add pass P into the pass manager queue. If P is a BasicBlockPass then
292448d27cd795dc273249f123444509403f4fa4facDevang Patel/// either use it into active basic block pass manager or create new basic
293448d27cd795dc273249f123444509403f4fa4facDevang Patel/// block pass manager to handle pass P.
294448d27cd795dc273249f123444509403f4fa4facDevang Patelbool
295c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang PatelFunctionPassManagerImpl_New::addPass(Pass *P) {
296448d27cd795dc273249f123444509403f4fa4facDevang Patel
297448d27cd795dc273249f123444509403f4fa4facDevang Patel  // If P is a BasicBlockPass then use BasicBlockPassManager_New.
298448d27cd795dc273249f123444509403f4fa4facDevang Patel  if (BasicBlockPass *BP = dynamic_cast<BasicBlockPass*>(P)) {
299448d27cd795dc273249f123444509403f4fa4facDevang Patel
300448d27cd795dc273249f123444509403f4fa4facDevang Patel    if (!activeBBPassManager
301448d27cd795dc273249f123444509403f4fa4facDevang Patel        || !activeBBPassManager->addPass(BP)) {
302448d27cd795dc273249f123444509403f4fa4facDevang Patel
303448d27cd795dc273249f123444509403f4fa4facDevang Patel      activeBBPassManager = new BasicBlockPassManager_New();
304448d27cd795dc273249f123444509403f4fa4facDevang Patel
305448d27cd795dc273249f123444509403f4fa4facDevang Patel      PassVector.push_back(activeBBPassManager);
3062c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel      if (!activeBBPassManager->addPass(BP))
3072c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel        assert(0 && "Unable to add Pass");
308448d27cd795dc273249f123444509403f4fa4facDevang Patel    }
309448d27cd795dc273249f123444509403f4fa4facDevang Patel    return true;
310448d27cd795dc273249f123444509403f4fa4facDevang Patel  }
311448d27cd795dc273249f123444509403f4fa4facDevang Patel
312448d27cd795dc273249f123444509403f4fa4facDevang Patel  FunctionPass *FP = dynamic_cast<FunctionPass *>(P);
313448d27cd795dc273249f123444509403f4fa4facDevang Patel  if (!FP)
314448d27cd795dc273249f123444509403f4fa4facDevang Patel    return false;
315448d27cd795dc273249f123444509403f4fa4facDevang Patel
31653596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel  // If this pass does not preserve anlysis that is used by other passes
31753596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel  // managed by this manager than it is not a suiable pass for this manager.
3182c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel  if (!manageablePass(P))
31953596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel    return false;
32053596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel
321b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel  // Take a note of analysis required and made available by this pass
32253596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel  noteDownRequiredAnalysis(P);
323b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel  noteDownAvailableAnalysis(P);
324448d27cd795dc273249f123444509403f4fa4facDevang Patel
325448d27cd795dc273249f123444509403f4fa4facDevang Patel  PassVector.push_back(FP);
32614d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel
32714d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel  // Remove the analysis not preserved by this pass
32814d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel  removeNotPreservedAnalysis(P);
32914d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel
330448d27cd795dc273249f123444509403f4fa4facDevang Patel  activeBBPassManager = NULL;
331448d27cd795dc273249f123444509403f4fa4facDevang Patel  return true;
332448d27cd795dc273249f123444509403f4fa4facDevang Patel}
333448d27cd795dc273249f123444509403f4fa4facDevang Patel
334448d27cd795dc273249f123444509403f4fa4facDevang Patel/// Execute all of the passes scheduled for execution by invoking
335448d27cd795dc273249f123444509403f4fa4facDevang Patel/// runOnFunction method.  Keep track of whether any of the passes modifies
336448d27cd795dc273249f123444509403f4fa4facDevang Patel/// the function, and if so, return true.
337448d27cd795dc273249f123444509403f4fa4facDevang Patelbool
338c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang PatelFunctionPassManagerImpl_New::runOnModule(Module &M) {
339448d27cd795dc273249f123444509403f4fa4facDevang Patel
340448d27cd795dc273249f123444509403f4fa4facDevang Patel  bool Changed = false;
341448d27cd795dc273249f123444509403f4fa4facDevang Patel  for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I)
342448d27cd795dc273249f123444509403f4fa4facDevang Patel    for (std::vector<Pass *>::iterator itr = PassVector.begin(),
343448d27cd795dc273249f123444509403f4fa4facDevang Patel           e = PassVector.end(); itr != e; ++itr) {
344448d27cd795dc273249f123444509403f4fa4facDevang Patel      Pass *P = *itr;
345448d27cd795dc273249f123444509403f4fa4facDevang Patel      FunctionPass *FP = dynamic_cast<FunctionPass*>(P);
346448d27cd795dc273249f123444509403f4fa4facDevang Patel      Changed |= FP->runOnFunction(*I);
347448d27cd795dc273249f123444509403f4fa4facDevang Patel    }
348448d27cd795dc273249f123444509403f4fa4facDevang Patel  return Changed;
349448d27cd795dc273249f123444509403f4fa4facDevang Patel}
350448d27cd795dc273249f123444509403f4fa4facDevang Patel
351448d27cd795dc273249f123444509403f4fa4facDevang Patel
35292c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel// ModulePassManager implementation
35392c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel
35492c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel/// Add P into pass vector if it is manageble. If P is a FunctionPass
355c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// then use FunctionPassManagerImpl_New to manage it. Return false if P
35692c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel/// is not manageable by this manager.
35792c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patelbool
3582c5d1851bbcb20adb79664ec16ab1f97b9142086Devang PatelModulePassManager_New::addPass(Pass *P) {
35992c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel
36092c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel  // If P is FunctionPass then use function pass maanager.
36192c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel  if (FunctionPass *FP = dynamic_cast<FunctionPass*>(P)) {
36292c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel
36392c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel    activeFunctionPassManager = NULL;
36492c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel
36592c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel    if (!activeFunctionPassManager
36692c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel        || !activeFunctionPassManager->addPass(P)) {
36792c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel
368c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel      activeFunctionPassManager = new FunctionPassManagerImpl_New();
36992c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel
37092c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel      PassVector.push_back(activeFunctionPassManager);
3712c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel      if (!activeFunctionPassManager->addPass(FP))
3722c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel        assert(0 && "Unable to add pass");
37392c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel    }
37492c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel    return true;
37592c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel  }
37692c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel
37792c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel  ModulePass *MP = dynamic_cast<ModulePass *>(P);
37892c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel  if (!MP)
37992c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel    return false;
38092c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel
38153596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel  // If this pass does not preserve anlysis that is used by other passes
38253596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel  // managed by this manager than it is not a suiable pass for this manager.
3832c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel  if (!manageablePass(P))
38453596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel    return false;
38553596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel
386b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel  // Take a note of analysis required and made available by this pass
38753596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel  noteDownRequiredAnalysis(P);
388b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel  noteDownAvailableAnalysis(P);
38992c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel
39092c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel  PassVector.push_back(MP);
39114d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel
39214d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel  // Remove the analysis not preserved by this pass
39314d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel  removeNotPreservedAnalysis(P);
39414d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel
39592c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel  activeFunctionPassManager = NULL;
39692c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel  return true;
39792c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel}
39892c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel
39992c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel
40092c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel/// Execute all of the passes scheduled for execution by invoking
40192c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel/// runOnModule method.  Keep track of whether any of the passes modifies
40292c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel/// the module, and if so, return true.
40392c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patelbool
40492c45eebf77de5d6ee84a3f18f560b83cb68e720Devang PatelModulePassManager_New::runOnModule(Module &M) {
40592c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel  bool Changed = false;
40692c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel  for (std::vector<Pass *>::iterator itr = PassVector.begin(),
40792c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel         e = PassVector.end(); itr != e; ++itr) {
40892c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel    Pass *P = *itr;
40992c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel    ModulePass *MP = dynamic_cast<ModulePass*>(P);
41092c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel    Changed |= MP->runOnModule(M);
41192c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel  }
41292c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel  return Changed;
41392c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel}
41492c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel
415b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel/// Schedule all passes from the queue by adding them in their
416b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel/// respective manager's queue.
417b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patelvoid
4185a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang PatelPassManagerImpl_New::schedulePasses() {
419b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel  /* TODO */
420b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel}
421b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel
422b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel/// Add pass P to the queue of passes to run.
423b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patelvoid
4245a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang PatelPassManagerImpl_New::add(Pass *P) {
425b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel  /* TODO */
426b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel}
427b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel
428b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel// PassManager_New implementation
429b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel/// Add P into active pass manager or use new module pass manager to
430b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel/// manage it.
431b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patelbool
4325a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang PatelPassManagerImpl_New::addPass(Pass *P) {
433b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel
434a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel  if (!activeManager || !activeManager->addPass(P)) {
435b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel    activeManager = new ModulePassManager_New();
436b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel    PassManagers.push_back(activeManager);
437b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel  }
438b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel
439b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel  return activeManager->addPass(P);
440b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel}
441b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel
442b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel/// run - Execute all of the passes scheduled for execution.  Keep track of
443b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel/// whether any of the passes modifies the module, and if so, return true.
444b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patelbool
4455a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang PatelPassManagerImpl_New::run(Module &M) {
446b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel
447b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel  schedulePasses();
448b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel  bool Changed = false;
449b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel  for (std::vector<ModulePassManager_New *>::iterator itr = PassManagers.begin(),
450b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel         e = PassManagers.end(); itr != e; ++itr) {
451b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel    ModulePassManager_New *pm = *itr;
452b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel    Changed |= pm->runOnModule(M);
453b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel  }
454b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel  return Changed;
455b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel}
4565a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
4575a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel/// Create new pass manager
4585a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang PatelPassManager_New::PassManager_New() {
4595a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  PM = new PassManagerImpl_New();
4605a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel}
4615a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
4625a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel/// add - Add a pass to the queue of passes to run.  This passes ownership of
4635a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel/// the Pass to the PassManager.  When the PassManager is destroyed, the pass
4645a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel/// will be destroyed as well, so there is no need to delete the pass.  This
4655a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel/// implies that all passes MUST be allocated with 'new'.
4665a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patelvoid
4675a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang PatelPassManager_New::add(Pass *P) {
4685a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  PM->add(P);
4695a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel}
4705a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
4715a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel/// run - Execute all of the passes scheduled for execution.  Keep track of
4725a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel/// whether any of the passes modifies the module, and if so, return true.
4735a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patelbool
4745a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang PatelPassManager_New::run(Module &M) {
4755a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  return PM->run(M);
4765a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel}
4775a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
478