PassManager.cpp revision be6d515f481756ff549f355e32be1ac398e141d5
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"
1785d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel#include <vector>
1885d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel#include <set>
1955fd43f90913676682487f89f27c756adb827f66Devang Patel
2055fd43f90913676682487f89f27c756adb827f66Devang Patelusing namespace llvm;
2155fd43f90913676682487f89f27c756adb827f66Devang Patel
22c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patelnamespace llvm {
23c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
2485d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel/// CommonPassManagerImpl helps pass manager analysis required by
2585d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel/// the managed passes. It provides methods to add/remove analysis
2685d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel/// available and query if certain analysis is available or not.
2785d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patelclass CommonPassManagerImpl : public Pass {
2885d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel
2985d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patelpublic:
3085d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel
3185d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel  /// Return true IFF pass P's required analysis set does not required new
3285d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel  /// manager.
3385d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel  bool manageablePass(Pass *P);
3485d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel
3585d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel  /// Return true IFF AnalysisID AID is currently available.
36be6d515f481756ff549f355e32be1ac398e141d5Devang Patel  bool isAnalysisAvailable(AnalysisID AID) {
37be6d515f481756ff549f355e32be1ac398e141d5Devang Patel    return (AvailableAnalysis.count(AID) != 0);
38be6d515f481756ff549f355e32be1ac398e141d5Devang Patel  }
3985d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel
4085d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel  /// Augment RequiredAnalysis by adding analysis required by pass P.
4185d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel  void noteDownRequiredAnalysis(Pass *P);
4285d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel
4385d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel  /// Augment AvailableAnalysis by adding analysis made available by pass P.
4485d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel  void noteDownAvailableAnalysis(Pass *P);
4585d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel
4685d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel  /// Remove Analysis that is not preserved by the pass
4785d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel  void removeNotPreservedAnalysis(Pass *P);
4885d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel
4985d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel  /// Remove dead passes
5085d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel  void removeDeadPasses() { /* TODO : Implement */ }
5185d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel
52e253385b108cd946b1ac150302f246d3b218be77Devang Patel  /// Add pass P into the PassVector. Update RequiredAnalysis and
53893a5a681585cdf3b5bfff7128ea522e8a47750aDevang Patel  /// AvailableAnalysis appropriately if ProcessAnalysis is true.
54893a5a681585cdf3b5bfff7128ea522e8a47750aDevang Patel  void addPassToManager (Pass *P, bool ProcessAnalysis = true);
55e253385b108cd946b1ac150302f246d3b218be77Devang Patel
56e253385b108cd946b1ac150302f246d3b218be77Devang Patel  inline std::vector<Pass *>::iterator passVectorBegin() {
57e253385b108cd946b1ac150302f246d3b218be77Devang Patel    return PassVector.begin();
58e253385b108cd946b1ac150302f246d3b218be77Devang Patel  }
59e253385b108cd946b1ac150302f246d3b218be77Devang Patel
60e253385b108cd946b1ac150302f246d3b218be77Devang Patel  inline std::vector<Pass *>::iterator passVectorEnd() {
61e253385b108cd946b1ac150302f246d3b218be77Devang Patel    return PassVector.end();
62e253385b108cd946b1ac150302f246d3b218be77Devang Patel  }
63e253385b108cd946b1ac150302f246d3b218be77Devang Patel
6485d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patelprivate:
6585d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel   // Analysis required by the passes managed by this manager
6685d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel  std::vector<AnalysisID> RequiredAnalysis;
6785d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel
6885d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel  // set of available Analysis
6985d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel  std::set<AnalysisID> AvailableAnalysis;
70e253385b108cd946b1ac150302f246d3b218be77Devang Patel
71e253385b108cd946b1ac150302f246d3b218be77Devang Patel  // Collection of pass that are managed by this manager
72e253385b108cd946b1ac150302f246d3b218be77Devang Patel  std::vector<Pass *> PassVector;
7385d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel};
7485d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel
75c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel/// BasicBlockPassManager_New manages BasicBlockPass. It batches all the
76c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel/// pass together and sequence them to process one basic block before
77c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel/// processing next basic block.
7837a84c7d8bda439082b883e33be6ab88b4cce236Devang Patelclass BasicBlockPassManager_New : public CommonPassManagerImpl {
79c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
80c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patelpublic:
81c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  BasicBlockPassManager_New() { }
82c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
83c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// Add a pass into a passmanager queue.
84c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  bool addPass(Pass *p);
85c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
86c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// Execute all of the passes scheduled for execution.  Keep track of
87c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// whether any of the passes modifies the function, and if so, return true.
88c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  bool runOnFunction(Function &F);
89c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
90be6d515f481756ff549f355e32be1ac398e141d5Devang Patel  /// Return true IFF AnalysisID AID is currently available.
91be6d515f481756ff549f355e32be1ac398e141d5Devang Patel  bool analysisCurrentlyAvailable(AnalysisID AID);
92be6d515f481756ff549f355e32be1ac398e141d5Devang Patel
93c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patelprivate:
94c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel};
95c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
96c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// FunctionPassManagerImpl_New manages FunctionPasses and BasicBlockPassManagers.
97c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel/// It batches all function passes and basic block pass managers together and
98c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel/// sequence them to process one function at a time before processing next
99c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel/// function.
10037a84c7d8bda439082b883e33be6ab88b4cce236Devang Patelclass FunctionPassManagerImpl_New : public CommonPassManagerImpl {
101c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patelpublic:
102c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel  FunctionPassManagerImpl_New(ModuleProvider *P) { /* TODO */ }
103c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel  FunctionPassManagerImpl_New() {
104c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel    activeBBPassManager = NULL;
105c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  }
106c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel  ~FunctionPassManagerImpl_New() { /* TODO */ };
107c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
108c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// add - Add a pass to the queue of passes to run.  This passes
109c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// ownership of the Pass to the PassManager.  When the
110c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// PassManager_X is destroyed, the pass will be destroyed as well, so
111c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// there is no need to delete the pass. (TODO delete passes.)
112c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// This implies that all passes MUST be allocated with 'new'.
113c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  void add(Pass *P) { /* TODO*/  }
114c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
115c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// Add pass into the pass manager queue.
116c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  bool addPass(Pass *P);
117c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
118c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// Execute all of the passes scheduled for execution.  Keep
119c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// track of whether any of the passes modifies the function, and if
120c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// so, return true.
121c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  bool runOnModule(Module &M);
122c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
123be6d515f481756ff549f355e32be1ac398e141d5Devang Patel  /// Return true IFF AnalysisID AID is currently available.
124be6d515f481756ff549f355e32be1ac398e141d5Devang Patel  bool analysisCurrentlyAvailable(AnalysisID AID);
125be6d515f481756ff549f355e32be1ac398e141d5Devang Patel
126c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patelprivate:
127c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  // Active Pass Managers
128c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  BasicBlockPassManager_New *activeBBPassManager;
129c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel};
130c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
131c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel/// ModulePassManager_New manages ModulePasses and function pass managers.
132c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel/// It batches all Module passes  passes and function pass managers together and
133c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel/// sequence them to process one module.
13437a84c7d8bda439082b883e33be6ab88b4cce236Devang Patelclass ModulePassManager_New : public CommonPassManagerImpl {
135c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
136c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patelpublic:
137c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  ModulePassManager_New() { activeFunctionPassManager = NULL; }
138c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
139c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// Add a pass into a passmanager queue.
140c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  bool addPass(Pass *p);
141c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
142c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// run - Execute all of the passes scheduled for execution.  Keep track of
143c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// whether any of the passes modifies the module, and if so, return true.
144c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  bool runOnModule(Module &M);
145be6d515f481756ff549f355e32be1ac398e141d5Devang Patel
146be6d515f481756ff549f355e32be1ac398e141d5Devang Patel  /// Return true IFF AnalysisID AID is currently available.
147be6d515f481756ff549f355e32be1ac398e141d5Devang Patel  bool analysisCurrentlyAvailable(AnalysisID AID);
148c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
149c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patelprivate:
150c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  // Active Pass Manager
151c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel  FunctionPassManagerImpl_New *activeFunctionPassManager;
152c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel};
153c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
1545a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel/// PassManager_New manages ModulePassManagers
15537a84c7d8bda439082b883e33be6ab88b4cce236Devang Patelclass PassManagerImpl_New : public CommonPassManagerImpl {
1565a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
1575a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patelpublic:
1585a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
1595a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  /// add - Add a pass to the queue of passes to run.  This passes ownership of
1605a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  /// the Pass to the PassManager.  When the PassManager is destroyed, the pass
1615a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  /// will be destroyed as well, so there is no need to delete the pass.  This
1625a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  /// implies that all passes MUST be allocated with 'new'.
1635a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  void add(Pass *P);
1645a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
1655a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  /// run - Execute all of the passes scheduled for execution.  Keep track of
1665a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  /// whether any of the passes modifies the module, and if so, return true.
1675a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  bool run(Module &M);
1685a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
169be6d515f481756ff549f355e32be1ac398e141d5Devang Patel  /// Return true IFF AnalysisID AID is currently available.
170be6d515f481756ff549f355e32be1ac398e141d5Devang Patel  bool analysisCurrentlyAvailable(AnalysisID AID);
171be6d515f481756ff549f355e32be1ac398e141d5Devang Patel
1725a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patelprivate:
1735a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
1745a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  /// Add a pass into a passmanager queue. This is used by schedulePasses
1755a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  bool addPass(Pass *p);
1765a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
177f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel  /// Schedule pass P for execution. Make sure that passes required by
178f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel  /// P are run before P is run. Update analysis info maintained by
179f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel  /// the manager. Remove dead passes. This is a recursive function.
180f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel  void schedulePass(Pass *P);
181f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel
1825a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  /// Schedule all passes collected in pass queue using add(). Add all the
1835a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  /// schedule passes into various manager's queue using addPass().
1845a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  void schedulePasses();
1855a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
1865a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  // Collection of pass managers
1875a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  std::vector<ModulePassManager_New *> PassManagers;
1885a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
1895a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  // Active Pass Manager
1905a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  ModulePassManager_New *activeManager;
1915a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel};
1925a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
193c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel} // End of llvm namespace
194c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
19537a84c7d8bda439082b883e33be6ab88b4cce236Devang Patel// CommonPassManagerImpl implementation
196889739c4d188d28c167644bced9df0f3131317d7Devang Patel
1972c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel/// Return true IFF pass P's required analysis set does not required new
198889739c4d188d28c167644bced9df0f3131317d7Devang Patel/// manager.
19937a84c7d8bda439082b883e33be6ab88b4cce236Devang Patelbool CommonPassManagerImpl::manageablePass(Pass *P) {
200889739c4d188d28c167644bced9df0f3131317d7Devang Patel
201889739c4d188d28c167644bced9df0f3131317d7Devang Patel  AnalysisUsage AnUsage;
202889739c4d188d28c167644bced9df0f3131317d7Devang Patel  P->getAnalysisUsage(AnUsage);
203889739c4d188d28c167644bced9df0f3131317d7Devang Patel
204a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel  // If this pass is not preserving information that is required by the other
205a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel  // passes managed by this manager then use new manager
206a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel  if (!AnUsage.getPreservesAll()) {
207a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel    const std::vector<AnalysisID> &PreservedSet = AnUsage.getPreservedSet();
208a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel    for (std::vector<AnalysisID>::iterator I = RequiredAnalysis.begin(),
209a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel           E = RequiredAnalysis.end(); I != E; ++I) {
210a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel      if (std::find(PreservedSet.begin(), PreservedSet.end(), *I) ==
211a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel          PreservedSet.end())
212a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel        // This analysis is not preserved. Need new manager.
213a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel        return false;
214a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel    }
215a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel  }
216889739c4d188d28c167644bced9df0f3131317d7Devang Patel  return true;
217889739c4d188d28c167644bced9df0f3131317d7Devang Patel}
218889739c4d188d28c167644bced9df0f3131317d7Devang Patel
219b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel/// Augment RequiredAnalysis by adding analysis required by pass P.
22037a84c7d8bda439082b883e33be6ab88b4cce236Devang Patelvoid CommonPassManagerImpl::noteDownRequiredAnalysis(Pass *P) {
221a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel  AnalysisUsage AnUsage;
222a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel  P->getAnalysisUsage(AnUsage);
223a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel  const std::vector<AnalysisID> &RequiredSet = AnUsage.getRequiredSet();
224889739c4d188d28c167644bced9df0f3131317d7Devang Patel
225a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel  // FIXME: What about duplicates ?
22614d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel  RequiredAnalysis.insert(RequiredAnalysis.end(), RequiredSet.begin(),
22714d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel                          RequiredSet.end());
228889739c4d188d28c167644bced9df0f3131317d7Devang Patel}
229889739c4d188d28c167644bced9df0f3131317d7Devang Patel
230b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel/// Augement AvailableAnalysis by adding analysis made available by pass P.
231b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patelvoid CommonPassManagerImpl::noteDownAvailableAnalysis(Pass *P) {
232b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel
233b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel  if (const PassInfo *PI = P->getPassInfo()) {
234b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel    AvailableAnalysis.insert(PI);
235b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel
236b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel    //TODO This pass is the current implementation of all of the interfaces it
237b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel    //TODO implements as well.
238b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel    //TODO
239b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel    //TODO const std::vector<const PassInfo*> &II = PI->getInterfacesImplemented();
240b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel    //TODO for (unsigned i = 0, e = II.size(); i != e; ++i)
241b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel    //TODO CurrentAnalyses[II[i]] = P;
242b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel  }
243b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel}
244b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel
245889739c4d188d28c167644bced9df0f3131317d7Devang Patel/// Remove Analyss not preserved by Pass P
24637a84c7d8bda439082b883e33be6ab88b4cce236Devang Patelvoid CommonPassManagerImpl::removeNotPreservedAnalysis(Pass *P) {
24714d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel  AnalysisUsage AnUsage;
24814d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel  P->getAnalysisUsage(AnUsage);
24914d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel  const std::vector<AnalysisID> &PreservedSet = AnUsage.getPreservedSet();
25014d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel
25114d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel  for (std::set<AnalysisID>::iterator I = AvailableAnalysis.begin(),
25214d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel         E = AvailableAnalysis.end(); I != E; ++I ) {
25314d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel    if (std::find(PreservedSet.begin(), PreservedSet.end(), *I) ==
25414d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel        PreservedSet.end()) {
25514d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel      // Remove this analysis
25614d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel      std::set<AnalysisID>::iterator J = I++;
25714d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel      AvailableAnalysis.erase(J);
25814d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel    }
25914d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel  }
260889739c4d188d28c167644bced9df0f3131317d7Devang Patel}
261889739c4d188d28c167644bced9df0f3131317d7Devang Patel
262e253385b108cd946b1ac150302f246d3b218be77Devang Patel/// Add pass P into the PassVector. Update RequiredAnalysis and
263893a5a681585cdf3b5bfff7128ea522e8a47750aDevang Patel/// AvailableAnalysis appropriately if ProcessAnalysis is true.
264893a5a681585cdf3b5bfff7128ea522e8a47750aDevang Patelvoid CommonPassManagerImpl::addPassToManager (Pass *P,
265893a5a681585cdf3b5bfff7128ea522e8a47750aDevang Patel                                              bool ProcessAnalysis) {
266e253385b108cd946b1ac150302f246d3b218be77Devang Patel
267893a5a681585cdf3b5bfff7128ea522e8a47750aDevang Patel  if (ProcessAnalysis) {
268893a5a681585cdf3b5bfff7128ea522e8a47750aDevang Patel    // Take a note of analysis required and made available by this pass
269893a5a681585cdf3b5bfff7128ea522e8a47750aDevang Patel    noteDownRequiredAnalysis(P);
270893a5a681585cdf3b5bfff7128ea522e8a47750aDevang Patel    noteDownAvailableAnalysis(P);
271893a5a681585cdf3b5bfff7128ea522e8a47750aDevang Patel
272893a5a681585cdf3b5bfff7128ea522e8a47750aDevang Patel    // Remove the analysis not preserved by this pass
273893a5a681585cdf3b5bfff7128ea522e8a47750aDevang Patel    removeNotPreservedAnalysis(P);
274893a5a681585cdf3b5bfff7128ea522e8a47750aDevang Patel  }
275e253385b108cd946b1ac150302f246d3b218be77Devang Patel
276e253385b108cd946b1ac150302f246d3b218be77Devang Patel  // Add pass
277e253385b108cd946b1ac150302f246d3b218be77Devang Patel  PassVector.push_back(P);
278e253385b108cd946b1ac150302f246d3b218be77Devang Patel}
279e253385b108cd946b1ac150302f246d3b218be77Devang Patel
28055fd43f90913676682487f89f27c756adb827f66Devang Patel/// BasicBlockPassManager implementation
28155fd43f90913676682487f89f27c756adb827f66Devang Patel
2822c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel/// Add pass P into PassVector and return true. If this pass is not
2832c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel/// manageable by this manager then return false.
28455fd43f90913676682487f89f27c756adb827f66Devang Patelbool
2852c5d1851bbcb20adb79664ec16ab1f97b9142086Devang PatelBasicBlockPassManager_New::addPass(Pass *P) {
28655fd43f90913676682487f89f27c756adb827f66Devang Patel
28755fd43f90913676682487f89f27c756adb827f66Devang Patel  BasicBlockPass *BP = dynamic_cast<BasicBlockPass*>(P);
28855fd43f90913676682487f89f27c756adb827f66Devang Patel  if (!BP)
28955fd43f90913676682487f89f27c756adb827f66Devang Patel    return false;
29055fd43f90913676682487f89f27c756adb827f66Devang Patel
29153596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel  // If this pass does not preserve anlysis that is used by other passes
29253596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel  // managed by this manager than it is not a suiable pass for this manager.
2932c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel  if (!manageablePass(P))
29453596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel    return false;
29553596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel
296e253385b108cd946b1ac150302f246d3b218be77Devang Patel  addPassToManager (BP);
29714d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel
29855fd43f90913676682487f89f27c756adb827f66Devang Patel  return true;
29955fd43f90913676682487f89f27c756adb827f66Devang Patel}
30055fd43f90913676682487f89f27c756adb827f66Devang Patel
30155fd43f90913676682487f89f27c756adb827f66Devang Patel/// Execute all of the passes scheduled for execution by invoking
30255fd43f90913676682487f89f27c756adb827f66Devang Patel/// runOnBasicBlock method.  Keep track of whether any of the passes modifies
30355fd43f90913676682487f89f27c756adb827f66Devang Patel/// the function, and if so, return true.
30455fd43f90913676682487f89f27c756adb827f66Devang Patelbool
30555fd43f90913676682487f89f27c756adb827f66Devang PatelBasicBlockPassManager_New::runOnFunction(Function &F) {
30655fd43f90913676682487f89f27c756adb827f66Devang Patel
30755fd43f90913676682487f89f27c756adb827f66Devang Patel  bool Changed = false;
30855fd43f90913676682487f89f27c756adb827f66Devang Patel  for (Function::iterator I = F.begin(), E = F.end(); I != E; ++I)
309e253385b108cd946b1ac150302f246d3b218be77Devang Patel    for (std::vector<Pass *>::iterator itr = passVectorBegin(),
310e253385b108cd946b1ac150302f246d3b218be77Devang Patel           e = passVectorEnd(); itr != e; ++itr) {
31155fd43f90913676682487f89f27c756adb827f66Devang Patel      Pass *P = *itr;
31255fd43f90913676682487f89f27c756adb827f66Devang Patel      BasicBlockPass *BP = dynamic_cast<BasicBlockPass*>(P);
31355fd43f90913676682487f89f27c756adb827f66Devang Patel      Changed |= BP->runOnBasicBlock(*I);
31455fd43f90913676682487f89f27c756adb827f66Devang Patel    }
31555fd43f90913676682487f89f27c756adb827f66Devang Patel  return Changed;
31655fd43f90913676682487f89f27c756adb827f66Devang Patel}
31755fd43f90913676682487f89f27c756adb827f66Devang Patel
318be6d515f481756ff549f355e32be1ac398e141d5Devang Patel/// Return true IFF AnalysisID AID is currently available.
319be6d515f481756ff549f355e32be1ac398e141d5Devang Patelbool BasicBlockPassManager_New::analysisCurrentlyAvailable(AnalysisID AID) {
320be6d515f481756ff549f355e32be1ac398e141d5Devang Patel  return isAnalysisAvailable(AID);
321be6d515f481756ff549f355e32be1ac398e141d5Devang Patel}
322be6d515f481756ff549f355e32be1ac398e141d5Devang Patel
323448d27cd795dc273249f123444509403f4fa4facDevang Patel// FunctionPassManager_New implementation
324c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// Create new Function pass manager
325c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang PatelFunctionPassManager_New::FunctionPassManager_New() {
326c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel  FPM = new FunctionPassManagerImpl_New();
327c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel}
328c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel
329c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// add - Add a pass to the queue of passes to run.  This passes
330c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// ownership of the Pass to the PassManager.  When the
331c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// PassManager_X is destroyed, the pass will be destroyed as well, so
332c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// there is no need to delete the pass. (TODO delete passes.)
333c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// This implies that all passes MUST be allocated with 'new'.
334c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patelvoid
335c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang PatelFunctionPassManager_New::add(Pass *P) {
336c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel  FPM->add(P);
337c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel}
338c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel
339c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// Execute all of the passes scheduled for execution.  Keep
340c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// track of whether any of the passes modifies the function, and if
341c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// so, return true.
342c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patelbool
343c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang PatelFunctionPassManager_New::runOnModule(Module &M) {
344c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel  return FPM->runOnModule(M);
345c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel}
346c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel
347c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel// FunctionPassManagerImpl_New implementation
348448d27cd795dc273249f123444509403f4fa4facDevang Patel
349448d27cd795dc273249f123444509403f4fa4facDevang Patel// FunctionPassManager
350448d27cd795dc273249f123444509403f4fa4facDevang Patel
351448d27cd795dc273249f123444509403f4fa4facDevang Patel/// Add pass P into the pass manager queue. If P is a BasicBlockPass then
352448d27cd795dc273249f123444509403f4fa4facDevang Patel/// either use it into active basic block pass manager or create new basic
353448d27cd795dc273249f123444509403f4fa4facDevang Patel/// block pass manager to handle pass P.
354448d27cd795dc273249f123444509403f4fa4facDevang Patelbool
355c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang PatelFunctionPassManagerImpl_New::addPass(Pass *P) {
356448d27cd795dc273249f123444509403f4fa4facDevang Patel
357448d27cd795dc273249f123444509403f4fa4facDevang Patel  // If P is a BasicBlockPass then use BasicBlockPassManager_New.
358448d27cd795dc273249f123444509403f4fa4facDevang Patel  if (BasicBlockPass *BP = dynamic_cast<BasicBlockPass*>(P)) {
359448d27cd795dc273249f123444509403f4fa4facDevang Patel
360448d27cd795dc273249f123444509403f4fa4facDevang Patel    if (!activeBBPassManager
361448d27cd795dc273249f123444509403f4fa4facDevang Patel        || !activeBBPassManager->addPass(BP)) {
362448d27cd795dc273249f123444509403f4fa4facDevang Patel
363448d27cd795dc273249f123444509403f4fa4facDevang Patel      activeBBPassManager = new BasicBlockPassManager_New();
364893a5a681585cdf3b5bfff7128ea522e8a47750aDevang Patel      addPassToManager(activeBBPassManager, false);
3652c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel      if (!activeBBPassManager->addPass(BP))
3662c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel        assert(0 && "Unable to add Pass");
367448d27cd795dc273249f123444509403f4fa4facDevang Patel    }
368448d27cd795dc273249f123444509403f4fa4facDevang Patel    return true;
369448d27cd795dc273249f123444509403f4fa4facDevang Patel  }
370448d27cd795dc273249f123444509403f4fa4facDevang Patel
371448d27cd795dc273249f123444509403f4fa4facDevang Patel  FunctionPass *FP = dynamic_cast<FunctionPass *>(P);
372448d27cd795dc273249f123444509403f4fa4facDevang Patel  if (!FP)
373448d27cd795dc273249f123444509403f4fa4facDevang Patel    return false;
374448d27cd795dc273249f123444509403f4fa4facDevang Patel
37553596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel  // If this pass does not preserve anlysis that is used by other passes
37653596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel  // managed by this manager than it is not a suiable pass for this manager.
3772c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel  if (!manageablePass(P))
37853596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel    return false;
37953596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel
380e253385b108cd946b1ac150302f246d3b218be77Devang Patel  addPassToManager (FP);
381448d27cd795dc273249f123444509403f4fa4facDevang Patel  activeBBPassManager = NULL;
382448d27cd795dc273249f123444509403f4fa4facDevang Patel  return true;
383448d27cd795dc273249f123444509403f4fa4facDevang Patel}
384448d27cd795dc273249f123444509403f4fa4facDevang Patel
385448d27cd795dc273249f123444509403f4fa4facDevang Patel/// Execute all of the passes scheduled for execution by invoking
386448d27cd795dc273249f123444509403f4fa4facDevang Patel/// runOnFunction method.  Keep track of whether any of the passes modifies
387448d27cd795dc273249f123444509403f4fa4facDevang Patel/// the function, and if so, return true.
388448d27cd795dc273249f123444509403f4fa4facDevang Patelbool
389c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang PatelFunctionPassManagerImpl_New::runOnModule(Module &M) {
390448d27cd795dc273249f123444509403f4fa4facDevang Patel
391448d27cd795dc273249f123444509403f4fa4facDevang Patel  bool Changed = false;
392448d27cd795dc273249f123444509403f4fa4facDevang Patel  for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I)
393e253385b108cd946b1ac150302f246d3b218be77Devang Patel    for (std::vector<Pass *>::iterator itr = passVectorBegin(),
394e253385b108cd946b1ac150302f246d3b218be77Devang Patel           e = passVectorEnd(); itr != e; ++itr) {
395448d27cd795dc273249f123444509403f4fa4facDevang Patel      Pass *P = *itr;
396448d27cd795dc273249f123444509403f4fa4facDevang Patel      FunctionPass *FP = dynamic_cast<FunctionPass*>(P);
397448d27cd795dc273249f123444509403f4fa4facDevang Patel      Changed |= FP->runOnFunction(*I);
398448d27cd795dc273249f123444509403f4fa4facDevang Patel    }
399448d27cd795dc273249f123444509403f4fa4facDevang Patel  return Changed;
400448d27cd795dc273249f123444509403f4fa4facDevang Patel}
401448d27cd795dc273249f123444509403f4fa4facDevang Patel
402be6d515f481756ff549f355e32be1ac398e141d5Devang Patel/// Return true IFF AnalysisID AID is currently available.
403be6d515f481756ff549f355e32be1ac398e141d5Devang Patelbool FunctionPassManagerImpl_New::analysisCurrentlyAvailable(AnalysisID AID) {
404be6d515f481756ff549f355e32be1ac398e141d5Devang Patel
405be6d515f481756ff549f355e32be1ac398e141d5Devang Patel  if (isAnalysisAvailable(AID))
406be6d515f481756ff549f355e32be1ac398e141d5Devang Patel    return true;
407be6d515f481756ff549f355e32be1ac398e141d5Devang Patel
408be6d515f481756ff549f355e32be1ac398e141d5Devang Patel  if (activeBBPassManager &&
409be6d515f481756ff549f355e32be1ac398e141d5Devang Patel      activeBBPassManager->isAnalysisAvailable(AID))
410be6d515f481756ff549f355e32be1ac398e141d5Devang Patel    return true;
411be6d515f481756ff549f355e32be1ac398e141d5Devang Patel
412be6d515f481756ff549f355e32be1ac398e141d5Devang Patel  // TODO : Check inactive managers
413be6d515f481756ff549f355e32be1ac398e141d5Devang Patel  return false;
414be6d515f481756ff549f355e32be1ac398e141d5Devang Patel}
415448d27cd795dc273249f123444509403f4fa4facDevang Patel
41692c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel// ModulePassManager implementation
41792c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel
41892c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel/// Add P into pass vector if it is manageble. If P is a FunctionPass
419c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// then use FunctionPassManagerImpl_New to manage it. Return false if P
42092c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel/// is not manageable by this manager.
42192c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patelbool
4222c5d1851bbcb20adb79664ec16ab1f97b9142086Devang PatelModulePassManager_New::addPass(Pass *P) {
42392c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel
42492c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel  // If P is FunctionPass then use function pass maanager.
42592c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel  if (FunctionPass *FP = dynamic_cast<FunctionPass*>(P)) {
42692c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel
42792c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel    activeFunctionPassManager = NULL;
42892c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel
42992c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel    if (!activeFunctionPassManager
43092c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel        || !activeFunctionPassManager->addPass(P)) {
43192c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel
432c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel      activeFunctionPassManager = new FunctionPassManagerImpl_New();
433893a5a681585cdf3b5bfff7128ea522e8a47750aDevang Patel      addPassToManager(activeFunctionPassManager, false);
4342c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel      if (!activeFunctionPassManager->addPass(FP))
4352c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel        assert(0 && "Unable to add pass");
43692c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel    }
43792c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel    return true;
43892c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel  }
43992c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel
44092c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel  ModulePass *MP = dynamic_cast<ModulePass *>(P);
44192c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel  if (!MP)
44292c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel    return false;
44392c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel
44453596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel  // If this pass does not preserve anlysis that is used by other passes
44553596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel  // managed by this manager than it is not a suiable pass for this manager.
4462c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel  if (!manageablePass(P))
44753596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel    return false;
44853596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel
449e253385b108cd946b1ac150302f246d3b218be77Devang Patel  addPassToManager(MP);
45092c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel  activeFunctionPassManager = NULL;
45192c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel  return true;
45292c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel}
45392c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel
45492c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel
45592c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel/// Execute all of the passes scheduled for execution by invoking
45692c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel/// runOnModule method.  Keep track of whether any of the passes modifies
45792c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel/// the module, and if so, return true.
45892c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patelbool
45992c45eebf77de5d6ee84a3f18f560b83cb68e720Devang PatelModulePassManager_New::runOnModule(Module &M) {
46092c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel  bool Changed = false;
461e253385b108cd946b1ac150302f246d3b218be77Devang Patel  for (std::vector<Pass *>::iterator itr = passVectorBegin(),
462e253385b108cd946b1ac150302f246d3b218be77Devang Patel         e = passVectorEnd(); itr != e; ++itr) {
46392c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel    Pass *P = *itr;
46492c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel    ModulePass *MP = dynamic_cast<ModulePass*>(P);
46592c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel    Changed |= MP->runOnModule(M);
46692c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel  }
46792c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel  return Changed;
46892c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel}
46992c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel
470be6d515f481756ff549f355e32be1ac398e141d5Devang Patel/// Return true IFF AnalysisID AID is currently available.
471be6d515f481756ff549f355e32be1ac398e141d5Devang Patelbool ModulePassManager_New::analysisCurrentlyAvailable(AnalysisID AID) {
472be6d515f481756ff549f355e32be1ac398e141d5Devang Patel
473be6d515f481756ff549f355e32be1ac398e141d5Devang Patel  if (isAnalysisAvailable(AID))
474be6d515f481756ff549f355e32be1ac398e141d5Devang Patel    return true;
475be6d515f481756ff549f355e32be1ac398e141d5Devang Patel
476be6d515f481756ff549f355e32be1ac398e141d5Devang Patel  if (activeFunctionPassManager &&
477be6d515f481756ff549f355e32be1ac398e141d5Devang Patel      activeFunctionPassManager->isAnalysisAvailable(AID))
478be6d515f481756ff549f355e32be1ac398e141d5Devang Patel    return true;
479be6d515f481756ff549f355e32be1ac398e141d5Devang Patel
480be6d515f481756ff549f355e32be1ac398e141d5Devang Patel  // TODO : Check inactive managers
481be6d515f481756ff549f355e32be1ac398e141d5Devang Patel  return false;
482be6d515f481756ff549f355e32be1ac398e141d5Devang Patel}
483be6d515f481756ff549f355e32be1ac398e141d5Devang Patel
484be6d515f481756ff549f355e32be1ac398e141d5Devang Patel/// Return true IFF AnalysisID AID is currently available.
485be6d515f481756ff549f355e32be1ac398e141d5Devang Patelbool PassManagerImpl_New::analysisCurrentlyAvailable(AnalysisID AID) {
486be6d515f481756ff549f355e32be1ac398e141d5Devang Patel
487be6d515f481756ff549f355e32be1ac398e141d5Devang Patel  // TODO : Check inactive managers
488be6d515f481756ff549f355e32be1ac398e141d5Devang Patel  return activeManager->analysisCurrentlyAvailable(AID);
489be6d515f481756ff549f355e32be1ac398e141d5Devang Patel}
490be6d515f481756ff549f355e32be1ac398e141d5Devang Patel
491f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel/// Schedule pass P for execution. Make sure that passes required by
492f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel/// P are run before P is run. Update analysis info maintained by
493f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel/// the manager. Remove dead passes. This is a recursive function.
494f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patelvoid PassManagerImpl_New::schedulePass(Pass *P) {
495f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel
496f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel  AnalysisUsage AnUsage;
497f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel  P->getAnalysisUsage(AnUsage);
498f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel  const std::vector<AnalysisID> &RequiredSet = AnUsage.getRequiredSet();
499f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel  for (std::vector<AnalysisID>::const_iterator I = RequiredSet.begin(),
500f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel         E = RequiredSet.end(); I != E; ++I) {
501f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel
502be6d515f481756ff549f355e32be1ac398e141d5Devang Patel    if (!analysisCurrentlyAvailable(*I)) {
503f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel      // Schedule this analysis run first.
504f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel      Pass *AP = (*I)->createPass();
505f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel      schedulePass(AP);
506f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel    }
507f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel  }
508f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel
509f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel  addPass(P);
510f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel
511f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel  // TODO : Walk through all managers and remove not preserved analysis
512f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel  // TODO : remove dead passes
513f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel}
514f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel
515b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel/// Schedule all passes from the queue by adding them in their
516b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel/// respective manager's queue.
517f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patelvoid PassManagerImpl_New::schedulePasses() {
518f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel  for (std::vector<Pass *>::iterator I = passVectorBegin(),
519f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel         E = passVectorEnd(); I != E; ++I)
520f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel    schedulePass (*I);
521b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel}
522b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel
523b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel/// Add pass P to the queue of passes to run.
524f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patelvoid PassManagerImpl_New::add(Pass *P) {
525f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel  // Do not process Analysis now. Analysis is process while scheduling
526f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel  // the pass vector.
527fcb2d940a0f0c471069a65c57c48b847d1b6762eDevang Patel  addPassToManager(P, false);
528b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel}
529b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel
530b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel// PassManager_New implementation
531b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel/// Add P into active pass manager or use new module pass manager to
532b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel/// manage it.
533f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patelbool PassManagerImpl_New::addPass(Pass *P) {
534b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel
535a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel  if (!activeManager || !activeManager->addPass(P)) {
536b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel    activeManager = new ModulePassManager_New();
537b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel    PassManagers.push_back(activeManager);
538b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel  }
539b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel
540b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel  return activeManager->addPass(P);
541b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel}
542b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel
543b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel/// run - Execute all of the passes scheduled for execution.  Keep track of
544b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel/// whether any of the passes modifies the module, and if so, return true.
545f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patelbool PassManagerImpl_New::run(Module &M) {
546b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel
547b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel  schedulePasses();
548b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel  bool Changed = false;
549b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel  for (std::vector<ModulePassManager_New *>::iterator itr = PassManagers.begin(),
550b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel         e = PassManagers.end(); itr != e; ++itr) {
551b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel    ModulePassManager_New *pm = *itr;
552b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel    Changed |= pm->runOnModule(M);
553b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel  }
554b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel  return Changed;
555b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel}
5565a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
5575a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel/// Create new pass manager
5585a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang PatelPassManager_New::PassManager_New() {
5595a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  PM = new PassManagerImpl_New();
5605a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel}
5615a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
5625a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel/// add - Add a pass to the queue of passes to run.  This passes ownership of
5635a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel/// the Pass to the PassManager.  When the PassManager is destroyed, the pass
5645a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel/// will be destroyed as well, so there is no need to delete the pass.  This
5655a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel/// implies that all passes MUST be allocated with 'new'.
5665a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patelvoid
5675a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang PatelPassManager_New::add(Pass *P) {
5685a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  PM->add(P);
5695a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel}
5705a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
5715a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel/// run - Execute all of the passes scheduled for execution.  Keep track of
5725a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel/// whether any of the passes modifies the module, and if so, return true.
5735a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patelbool
5745a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang PatelPassManager_New::run(Module &M) {
5755a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  return PM->run(M);
5765a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel}
5775a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
578