PassManager.cpp revision c1d6e1fc9c3a47529f417026df652f466ce67851
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
56c1d6e1fc9c3a47529f417026df652f466ce67851Devang Patel  /// Clear analysis vectors RequiredAnalysis and AvailableAnalysis.
57c1d6e1fc9c3a47529f417026df652f466ce67851Devang Patel  /// This is used before running passes managed by the manager.
58c1d6e1fc9c3a47529f417026df652f466ce67851Devang Patel  void clearAnalysis() {
59c1d6e1fc9c3a47529f417026df652f466ce67851Devang Patel    RequiredAnalysis.clear();
60c1d6e1fc9c3a47529f417026df652f466ce67851Devang Patel    AvailableAnalysis.clear();
61c1d6e1fc9c3a47529f417026df652f466ce67851Devang Patel  }
62c1d6e1fc9c3a47529f417026df652f466ce67851Devang Patel
63e253385b108cd946b1ac150302f246d3b218be77Devang Patel  inline std::vector<Pass *>::iterator passVectorBegin() {
64e253385b108cd946b1ac150302f246d3b218be77Devang Patel    return PassVector.begin();
65e253385b108cd946b1ac150302f246d3b218be77Devang Patel  }
66e253385b108cd946b1ac150302f246d3b218be77Devang Patel
67e253385b108cd946b1ac150302f246d3b218be77Devang Patel  inline std::vector<Pass *>::iterator passVectorEnd() {
68e253385b108cd946b1ac150302f246d3b218be77Devang Patel    return PassVector.end();
69e253385b108cd946b1ac150302f246d3b218be77Devang Patel  }
70e253385b108cd946b1ac150302f246d3b218be77Devang Patel
7185d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patelprivate:
725770c7cd52d6a3dfd9a5815cc9153d94afc6dd31Devang Patel  // Analysis required by the passes managed by this manager. This information
735770c7cd52d6a3dfd9a5815cc9153d94afc6dd31Devang Patel  // used while selecting pass manager during addPass. If a pass does not
745770c7cd52d6a3dfd9a5815cc9153d94afc6dd31Devang Patel  // preserve any analysis required by other passes managed by current
755770c7cd52d6a3dfd9a5815cc9153d94afc6dd31Devang Patel  // pass manager then new pass manager is used.
7685d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel  std::vector<AnalysisID> RequiredAnalysis;
7785d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel
785770c7cd52d6a3dfd9a5815cc9153d94afc6dd31Devang Patel  // Set of available Analysis. This information is used while scheduling
795770c7cd52d6a3dfd9a5815cc9153d94afc6dd31Devang Patel  // pass. If a pass requires an analysis which is not not available then
805770c7cd52d6a3dfd9a5815cc9153d94afc6dd31Devang Patel  // equired analysis pass is scheduled to run before the pass itself is
815770c7cd52d6a3dfd9a5815cc9153d94afc6dd31Devang Patel  // scheduled to run.
8285d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel  std::set<AnalysisID> AvailableAnalysis;
83e253385b108cd946b1ac150302f246d3b218be77Devang Patel
84e253385b108cd946b1ac150302f246d3b218be77Devang Patel  // Collection of pass that are managed by this manager
85e253385b108cd946b1ac150302f246d3b218be77Devang Patel  std::vector<Pass *> PassVector;
8685d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel};
8785d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel
88c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel/// BasicBlockPassManager_New manages BasicBlockPass. It batches all the
89c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel/// pass together and sequence them to process one basic block before
90c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel/// processing next basic block.
9137a84c7d8bda439082b883e33be6ab88b4cce236Devang Patelclass BasicBlockPassManager_New : public CommonPassManagerImpl {
92c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
93c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patelpublic:
94c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  BasicBlockPassManager_New() { }
95c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
96c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// Add a pass into a passmanager queue.
97c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  bool addPass(Pass *p);
98c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
99c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// Execute all of the passes scheduled for execution.  Keep track of
100c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// whether any of the passes modifies the function, and if so, return true.
101c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  bool runOnFunction(Function &F);
102c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
103be6d515f481756ff549f355e32be1ac398e141d5Devang Patel  /// Return true IFF AnalysisID AID is currently available.
104be6d515f481756ff549f355e32be1ac398e141d5Devang Patel  bool analysisCurrentlyAvailable(AnalysisID AID);
105be6d515f481756ff549f355e32be1ac398e141d5Devang Patel
106c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patelprivate:
107c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel};
108c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
109c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// FunctionPassManagerImpl_New manages FunctionPasses and BasicBlockPassManagers.
110c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel/// It batches all function passes and basic block pass managers together and
111c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel/// sequence them to process one function at a time before processing next
112c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel/// function.
11337a84c7d8bda439082b883e33be6ab88b4cce236Devang Patelclass FunctionPassManagerImpl_New : public CommonPassManagerImpl {
114c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patelpublic:
115c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel  FunctionPassManagerImpl_New(ModuleProvider *P) { /* TODO */ }
116c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel  FunctionPassManagerImpl_New() {
117c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel    activeBBPassManager = NULL;
118c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  }
119c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel  ~FunctionPassManagerImpl_New() { /* TODO */ };
120c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
121c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// add - Add a pass to the queue of passes to run.  This passes
122c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// ownership of the Pass to the PassManager.  When the
123c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// PassManager_X is destroyed, the pass will be destroyed as well, so
124c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// there is no need to delete the pass. (TODO delete passes.)
125c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// This implies that all passes MUST be allocated with 'new'.
126c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  void add(Pass *P) { /* TODO*/  }
127c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
128c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// Add pass into the pass manager queue.
129c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  bool addPass(Pass *P);
130c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
131c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// Execute all of the passes scheduled for execution.  Keep
132c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// track of whether any of the passes modifies the function, and if
133c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// so, return true.
134c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  bool runOnModule(Module &M);
135c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
136be6d515f481756ff549f355e32be1ac398e141d5Devang Patel  /// Return true IFF AnalysisID AID is currently available.
137be6d515f481756ff549f355e32be1ac398e141d5Devang Patel  bool analysisCurrentlyAvailable(AnalysisID AID);
138be6d515f481756ff549f355e32be1ac398e141d5Devang Patel
139c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patelprivate:
140c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  // Active Pass Managers
141c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  BasicBlockPassManager_New *activeBBPassManager;
142c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel};
143c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
144c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel/// ModulePassManager_New manages ModulePasses and function pass managers.
145c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel/// It batches all Module passes  passes and function pass managers together and
146c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel/// sequence them to process one module.
14737a84c7d8bda439082b883e33be6ab88b4cce236Devang Patelclass ModulePassManager_New : public CommonPassManagerImpl {
148c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
149c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patelpublic:
150c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  ModulePassManager_New() { activeFunctionPassManager = NULL; }
151c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
152c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// Add a pass into a passmanager queue.
153c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  bool addPass(Pass *p);
154c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
155c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// run - Execute all of the passes scheduled for execution.  Keep track of
156c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// whether any of the passes modifies the module, and if so, return true.
157c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  bool runOnModule(Module &M);
158be6d515f481756ff549f355e32be1ac398e141d5Devang Patel
159be6d515f481756ff549f355e32be1ac398e141d5Devang Patel  /// Return true IFF AnalysisID AID is currently available.
160be6d515f481756ff549f355e32be1ac398e141d5Devang Patel  bool analysisCurrentlyAvailable(AnalysisID AID);
161c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
162c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patelprivate:
163c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  // Active Pass Manager
164c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel  FunctionPassManagerImpl_New *activeFunctionPassManager;
165c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel};
166c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
1675a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel/// PassManager_New manages ModulePassManagers
16837a84c7d8bda439082b883e33be6ab88b4cce236Devang Patelclass PassManagerImpl_New : public CommonPassManagerImpl {
1695a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
1705a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patelpublic:
1715a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
1725a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  /// add - Add a pass to the queue of passes to run.  This passes ownership of
1735a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  /// the Pass to the PassManager.  When the PassManager is destroyed, the pass
1745a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  /// will be destroyed as well, so there is no need to delete the pass.  This
1755a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  /// implies that all passes MUST be allocated with 'new'.
1765a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  void add(Pass *P);
1775a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
1785a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  /// run - Execute all of the passes scheduled for execution.  Keep track of
1795a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  /// whether any of the passes modifies the module, and if so, return true.
1805a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  bool run(Module &M);
1815a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
182be6d515f481756ff549f355e32be1ac398e141d5Devang Patel  /// Return true IFF AnalysisID AID is currently available.
183be6d515f481756ff549f355e32be1ac398e141d5Devang Patel  bool analysisCurrentlyAvailable(AnalysisID AID);
184be6d515f481756ff549f355e32be1ac398e141d5Devang Patel
1855a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patelprivate:
1865a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
1875a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  /// Add a pass into a passmanager queue. This is used by schedulePasses
1885a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  bool addPass(Pass *p);
1895a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
190f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel  /// Schedule pass P for execution. Make sure that passes required by
191f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel  /// P are run before P is run. Update analysis info maintained by
192f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel  /// the manager. Remove dead passes. This is a recursive function.
193f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel  void schedulePass(Pass *P);
194f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel
1955a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  /// Schedule all passes collected in pass queue using add(). Add all the
1965a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  /// schedule passes into various manager's queue using addPass().
1975a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  void schedulePasses();
1985a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
1995a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  // Collection of pass managers
2005a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  std::vector<ModulePassManager_New *> PassManagers;
2015a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
2025a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  // Active Pass Manager
2035a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  ModulePassManager_New *activeManager;
2045a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel};
2055a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
206c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel} // End of llvm namespace
207c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
20837a84c7d8bda439082b883e33be6ab88b4cce236Devang Patel// CommonPassManagerImpl implementation
209889739c4d188d28c167644bced9df0f3131317d7Devang Patel
2102c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel/// Return true IFF pass P's required analysis set does not required new
211889739c4d188d28c167644bced9df0f3131317d7Devang Patel/// manager.
21237a84c7d8bda439082b883e33be6ab88b4cce236Devang Patelbool CommonPassManagerImpl::manageablePass(Pass *P) {
213889739c4d188d28c167644bced9df0f3131317d7Devang Patel
214889739c4d188d28c167644bced9df0f3131317d7Devang Patel  AnalysisUsage AnUsage;
215889739c4d188d28c167644bced9df0f3131317d7Devang Patel  P->getAnalysisUsage(AnUsage);
216889739c4d188d28c167644bced9df0f3131317d7Devang Patel
217a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel  // If this pass is not preserving information that is required by the other
218a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel  // passes managed by this manager then use new manager
219a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel  if (!AnUsage.getPreservesAll()) {
220a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel    const std::vector<AnalysisID> &PreservedSet = AnUsage.getPreservedSet();
221a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel    for (std::vector<AnalysisID>::iterator I = RequiredAnalysis.begin(),
222a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel           E = RequiredAnalysis.end(); I != E; ++I) {
223a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel      if (std::find(PreservedSet.begin(), PreservedSet.end(), *I) ==
224a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel          PreservedSet.end())
225a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel        // This analysis is not preserved. Need new manager.
226a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel        return false;
227a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel    }
228a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel  }
229889739c4d188d28c167644bced9df0f3131317d7Devang Patel  return true;
230889739c4d188d28c167644bced9df0f3131317d7Devang Patel}
231889739c4d188d28c167644bced9df0f3131317d7Devang Patel
232b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel/// Augment RequiredAnalysis by adding analysis required by pass P.
23337a84c7d8bda439082b883e33be6ab88b4cce236Devang Patelvoid CommonPassManagerImpl::noteDownRequiredAnalysis(Pass *P) {
234a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel  AnalysisUsage AnUsage;
235a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel  P->getAnalysisUsage(AnUsage);
236a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel  const std::vector<AnalysisID> &RequiredSet = AnUsage.getRequiredSet();
237889739c4d188d28c167644bced9df0f3131317d7Devang Patel
238a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel  // FIXME: What about duplicates ?
23914d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel  RequiredAnalysis.insert(RequiredAnalysis.end(), RequiredSet.begin(),
24014d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel                          RequiredSet.end());
241889739c4d188d28c167644bced9df0f3131317d7Devang Patel}
242889739c4d188d28c167644bced9df0f3131317d7Devang Patel
243b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel/// Augement AvailableAnalysis by adding analysis made available by pass P.
244b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patelvoid CommonPassManagerImpl::noteDownAvailableAnalysis(Pass *P) {
245b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel
246b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel  if (const PassInfo *PI = P->getPassInfo()) {
247b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel    AvailableAnalysis.insert(PI);
248b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel
249b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel    //TODO This pass is the current implementation of all of the interfaces it
250b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel    //TODO implements as well.
251b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel    //TODO
252b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel    //TODO const std::vector<const PassInfo*> &II = PI->getInterfacesImplemented();
253b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel    //TODO for (unsigned i = 0, e = II.size(); i != e; ++i)
254b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel    //TODO CurrentAnalyses[II[i]] = P;
255b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel  }
256b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel}
257b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel
258889739c4d188d28c167644bced9df0f3131317d7Devang Patel/// Remove Analyss not preserved by Pass P
25937a84c7d8bda439082b883e33be6ab88b4cce236Devang Patelvoid CommonPassManagerImpl::removeNotPreservedAnalysis(Pass *P) {
26014d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel  AnalysisUsage AnUsage;
26114d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel  P->getAnalysisUsage(AnUsage);
26214d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel  const std::vector<AnalysisID> &PreservedSet = AnUsage.getPreservedSet();
26314d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel
26414d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel  for (std::set<AnalysisID>::iterator I = AvailableAnalysis.begin(),
26514d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel         E = AvailableAnalysis.end(); I != E; ++I ) {
26614d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel    if (std::find(PreservedSet.begin(), PreservedSet.end(), *I) ==
26714d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel        PreservedSet.end()) {
26814d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel      // Remove this analysis
26914d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel      std::set<AnalysisID>::iterator J = I++;
27014d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel      AvailableAnalysis.erase(J);
27114d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel    }
27214d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel  }
273889739c4d188d28c167644bced9df0f3131317d7Devang Patel}
274889739c4d188d28c167644bced9df0f3131317d7Devang Patel
275e253385b108cd946b1ac150302f246d3b218be77Devang Patel/// Add pass P into the PassVector. Update RequiredAnalysis and
276893a5a681585cdf3b5bfff7128ea522e8a47750aDevang Patel/// AvailableAnalysis appropriately if ProcessAnalysis is true.
277893a5a681585cdf3b5bfff7128ea522e8a47750aDevang Patelvoid CommonPassManagerImpl::addPassToManager (Pass *P,
278893a5a681585cdf3b5bfff7128ea522e8a47750aDevang Patel                                              bool ProcessAnalysis) {
279e253385b108cd946b1ac150302f246d3b218be77Devang Patel
280893a5a681585cdf3b5bfff7128ea522e8a47750aDevang Patel  if (ProcessAnalysis) {
281893a5a681585cdf3b5bfff7128ea522e8a47750aDevang Patel    // Take a note of analysis required and made available by this pass
282893a5a681585cdf3b5bfff7128ea522e8a47750aDevang Patel    noteDownRequiredAnalysis(P);
283893a5a681585cdf3b5bfff7128ea522e8a47750aDevang Patel    noteDownAvailableAnalysis(P);
284893a5a681585cdf3b5bfff7128ea522e8a47750aDevang Patel
285893a5a681585cdf3b5bfff7128ea522e8a47750aDevang Patel    // Remove the analysis not preserved by this pass
286893a5a681585cdf3b5bfff7128ea522e8a47750aDevang Patel    removeNotPreservedAnalysis(P);
287893a5a681585cdf3b5bfff7128ea522e8a47750aDevang Patel  }
288e253385b108cd946b1ac150302f246d3b218be77Devang Patel
289e253385b108cd946b1ac150302f246d3b218be77Devang Patel  // Add pass
290e253385b108cd946b1ac150302f246d3b218be77Devang Patel  PassVector.push_back(P);
291e253385b108cd946b1ac150302f246d3b218be77Devang Patel}
292e253385b108cd946b1ac150302f246d3b218be77Devang Patel
29355fd43f90913676682487f89f27c756adb827f66Devang Patel/// BasicBlockPassManager implementation
29455fd43f90913676682487f89f27c756adb827f66Devang Patel
2952c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel/// Add pass P into PassVector and return true. If this pass is not
2962c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel/// manageable by this manager then return false.
29755fd43f90913676682487f89f27c756adb827f66Devang Patelbool
2982c5d1851bbcb20adb79664ec16ab1f97b9142086Devang PatelBasicBlockPassManager_New::addPass(Pass *P) {
29955fd43f90913676682487f89f27c756adb827f66Devang Patel
30055fd43f90913676682487f89f27c756adb827f66Devang Patel  BasicBlockPass *BP = dynamic_cast<BasicBlockPass*>(P);
30155fd43f90913676682487f89f27c756adb827f66Devang Patel  if (!BP)
30255fd43f90913676682487f89f27c756adb827f66Devang Patel    return false;
30355fd43f90913676682487f89f27c756adb827f66Devang Patel
30453596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel  // If this pass does not preserve anlysis that is used by other passes
30553596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel  // managed by this manager than it is not a suiable pass for this manager.
3062c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel  if (!manageablePass(P))
30753596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel    return false;
30853596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel
309e253385b108cd946b1ac150302f246d3b218be77Devang Patel  addPassToManager (BP);
31014d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel
31155fd43f90913676682487f89f27c756adb827f66Devang Patel  return true;
31255fd43f90913676682487f89f27c756adb827f66Devang Patel}
31355fd43f90913676682487f89f27c756adb827f66Devang Patel
31455fd43f90913676682487f89f27c756adb827f66Devang Patel/// Execute all of the passes scheduled for execution by invoking
31555fd43f90913676682487f89f27c756adb827f66Devang Patel/// runOnBasicBlock method.  Keep track of whether any of the passes modifies
31655fd43f90913676682487f89f27c756adb827f66Devang Patel/// the function, and if so, return true.
31755fd43f90913676682487f89f27c756adb827f66Devang Patelbool
31855fd43f90913676682487f89f27c756adb827f66Devang PatelBasicBlockPassManager_New::runOnFunction(Function &F) {
31955fd43f90913676682487f89f27c756adb827f66Devang Patel
32055fd43f90913676682487f89f27c756adb827f66Devang Patel  bool Changed = false;
321c1d6e1fc9c3a47529f417026df652f466ce67851Devang Patel  clearAnalysis();
322c1d6e1fc9c3a47529f417026df652f466ce67851Devang Patel
32355fd43f90913676682487f89f27c756adb827f66Devang Patel  for (Function::iterator I = F.begin(), E = F.end(); I != E; ++I)
324e253385b108cd946b1ac150302f246d3b218be77Devang Patel    for (std::vector<Pass *>::iterator itr = passVectorBegin(),
325e253385b108cd946b1ac150302f246d3b218be77Devang Patel           e = passVectorEnd(); itr != e; ++itr) {
32655fd43f90913676682487f89f27c756adb827f66Devang Patel      Pass *P = *itr;
327c1d6e1fc9c3a47529f417026df652f466ce67851Devang Patel
328c1d6e1fc9c3a47529f417026df652f466ce67851Devang Patel      noteDownAvailableAnalysis(P);
32955fd43f90913676682487f89f27c756adb827f66Devang Patel      BasicBlockPass *BP = dynamic_cast<BasicBlockPass*>(P);
33055fd43f90913676682487f89f27c756adb827f66Devang Patel      Changed |= BP->runOnBasicBlock(*I);
331c1d6e1fc9c3a47529f417026df652f466ce67851Devang Patel      removeNotPreservedAnalysis(P);
332c1d6e1fc9c3a47529f417026df652f466ce67851Devang Patel      removeDeadPasses();
33355fd43f90913676682487f89f27c756adb827f66Devang Patel    }
33455fd43f90913676682487f89f27c756adb827f66Devang Patel  return Changed;
33555fd43f90913676682487f89f27c756adb827f66Devang Patel}
33655fd43f90913676682487f89f27c756adb827f66Devang Patel
337be6d515f481756ff549f355e32be1ac398e141d5Devang Patel/// Return true IFF AnalysisID AID is currently available.
338be6d515f481756ff549f355e32be1ac398e141d5Devang Patelbool BasicBlockPassManager_New::analysisCurrentlyAvailable(AnalysisID AID) {
339be6d515f481756ff549f355e32be1ac398e141d5Devang Patel  return isAnalysisAvailable(AID);
340be6d515f481756ff549f355e32be1ac398e141d5Devang Patel}
341be6d515f481756ff549f355e32be1ac398e141d5Devang Patel
342448d27cd795dc273249f123444509403f4fa4facDevang Patel// FunctionPassManager_New implementation
343c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// Create new Function pass manager
344c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang PatelFunctionPassManager_New::FunctionPassManager_New() {
345c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel  FPM = new FunctionPassManagerImpl_New();
346c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel}
347c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel
348c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// add - Add a pass to the queue of passes to run.  This passes
349c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// ownership of the Pass to the PassManager.  When the
350c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// PassManager_X is destroyed, the pass will be destroyed as well, so
351c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// there is no need to delete the pass. (TODO delete passes.)
352c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// This implies that all passes MUST be allocated with 'new'.
353c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patelvoid
354c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang PatelFunctionPassManager_New::add(Pass *P) {
355c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel  FPM->add(P);
356c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel}
357c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel
358c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// Execute all of the passes scheduled for execution.  Keep
359c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// track of whether any of the passes modifies the function, and if
360c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// so, return true.
361c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patelbool
362c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang PatelFunctionPassManager_New::runOnModule(Module &M) {
363c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel  return FPM->runOnModule(M);
364c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel}
365c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel
366c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel// FunctionPassManagerImpl_New implementation
367448d27cd795dc273249f123444509403f4fa4facDevang Patel
368448d27cd795dc273249f123444509403f4fa4facDevang Patel// FunctionPassManager
369448d27cd795dc273249f123444509403f4fa4facDevang Patel
370448d27cd795dc273249f123444509403f4fa4facDevang Patel/// Add pass P into the pass manager queue. If P is a BasicBlockPass then
371448d27cd795dc273249f123444509403f4fa4facDevang Patel/// either use it into active basic block pass manager or create new basic
372448d27cd795dc273249f123444509403f4fa4facDevang Patel/// block pass manager to handle pass P.
373448d27cd795dc273249f123444509403f4fa4facDevang Patelbool
374c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang PatelFunctionPassManagerImpl_New::addPass(Pass *P) {
375448d27cd795dc273249f123444509403f4fa4facDevang Patel
376448d27cd795dc273249f123444509403f4fa4facDevang Patel  // If P is a BasicBlockPass then use BasicBlockPassManager_New.
377448d27cd795dc273249f123444509403f4fa4facDevang Patel  if (BasicBlockPass *BP = dynamic_cast<BasicBlockPass*>(P)) {
378448d27cd795dc273249f123444509403f4fa4facDevang Patel
379448d27cd795dc273249f123444509403f4fa4facDevang Patel    if (!activeBBPassManager
380448d27cd795dc273249f123444509403f4fa4facDevang Patel        || !activeBBPassManager->addPass(BP)) {
381448d27cd795dc273249f123444509403f4fa4facDevang Patel
382448d27cd795dc273249f123444509403f4fa4facDevang Patel      activeBBPassManager = new BasicBlockPassManager_New();
383893a5a681585cdf3b5bfff7128ea522e8a47750aDevang Patel      addPassToManager(activeBBPassManager, false);
3842c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel      if (!activeBBPassManager->addPass(BP))
3852c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel        assert(0 && "Unable to add Pass");
386448d27cd795dc273249f123444509403f4fa4facDevang Patel    }
387448d27cd795dc273249f123444509403f4fa4facDevang Patel    return true;
388448d27cd795dc273249f123444509403f4fa4facDevang Patel  }
389448d27cd795dc273249f123444509403f4fa4facDevang Patel
390448d27cd795dc273249f123444509403f4fa4facDevang Patel  FunctionPass *FP = dynamic_cast<FunctionPass *>(P);
391448d27cd795dc273249f123444509403f4fa4facDevang Patel  if (!FP)
392448d27cd795dc273249f123444509403f4fa4facDevang Patel    return false;
393448d27cd795dc273249f123444509403f4fa4facDevang Patel
39453596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel  // If this pass does not preserve anlysis that is used by other passes
39553596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel  // managed by this manager than it is not a suiable pass for this manager.
3962c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel  if (!manageablePass(P))
39753596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel    return false;
39853596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel
399e253385b108cd946b1ac150302f246d3b218be77Devang Patel  addPassToManager (FP);
400448d27cd795dc273249f123444509403f4fa4facDevang Patel  activeBBPassManager = NULL;
401448d27cd795dc273249f123444509403f4fa4facDevang Patel  return true;
402448d27cd795dc273249f123444509403f4fa4facDevang Patel}
403448d27cd795dc273249f123444509403f4fa4facDevang Patel
404448d27cd795dc273249f123444509403f4fa4facDevang Patel/// Execute all of the passes scheduled for execution by invoking
405448d27cd795dc273249f123444509403f4fa4facDevang Patel/// runOnFunction method.  Keep track of whether any of the passes modifies
406448d27cd795dc273249f123444509403f4fa4facDevang Patel/// the function, and if so, return true.
407448d27cd795dc273249f123444509403f4fa4facDevang Patelbool
408c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang PatelFunctionPassManagerImpl_New::runOnModule(Module &M) {
409448d27cd795dc273249f123444509403f4fa4facDevang Patel
410448d27cd795dc273249f123444509403f4fa4facDevang Patel  bool Changed = false;
411c1d6e1fc9c3a47529f417026df652f466ce67851Devang Patel  clearAnalysis();
412c1d6e1fc9c3a47529f417026df652f466ce67851Devang Patel
413448d27cd795dc273249f123444509403f4fa4facDevang Patel  for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I)
414e253385b108cd946b1ac150302f246d3b218be77Devang Patel    for (std::vector<Pass *>::iterator itr = passVectorBegin(),
415e253385b108cd946b1ac150302f246d3b218be77Devang Patel           e = passVectorEnd(); itr != e; ++itr) {
416448d27cd795dc273249f123444509403f4fa4facDevang Patel      Pass *P = *itr;
417c1d6e1fc9c3a47529f417026df652f466ce67851Devang Patel
418c1d6e1fc9c3a47529f417026df652f466ce67851Devang Patel      noteDownAvailableAnalysis(P);
419448d27cd795dc273249f123444509403f4fa4facDevang Patel      FunctionPass *FP = dynamic_cast<FunctionPass*>(P);
420448d27cd795dc273249f123444509403f4fa4facDevang Patel      Changed |= FP->runOnFunction(*I);
421c1d6e1fc9c3a47529f417026df652f466ce67851Devang Patel      removeNotPreservedAnalysis(P);
422c1d6e1fc9c3a47529f417026df652f466ce67851Devang Patel      removeDeadPasses();
423448d27cd795dc273249f123444509403f4fa4facDevang Patel    }
424448d27cd795dc273249f123444509403f4fa4facDevang Patel  return Changed;
425448d27cd795dc273249f123444509403f4fa4facDevang Patel}
426448d27cd795dc273249f123444509403f4fa4facDevang Patel
427be6d515f481756ff549f355e32be1ac398e141d5Devang Patel/// Return true IFF AnalysisID AID is currently available.
428be6d515f481756ff549f355e32be1ac398e141d5Devang Patelbool FunctionPassManagerImpl_New::analysisCurrentlyAvailable(AnalysisID AID) {
429be6d515f481756ff549f355e32be1ac398e141d5Devang Patel
430be6d515f481756ff549f355e32be1ac398e141d5Devang Patel  if (isAnalysisAvailable(AID))
431be6d515f481756ff549f355e32be1ac398e141d5Devang Patel    return true;
432be6d515f481756ff549f355e32be1ac398e141d5Devang Patel
433be6d515f481756ff549f355e32be1ac398e141d5Devang Patel  if (activeBBPassManager &&
434be6d515f481756ff549f355e32be1ac398e141d5Devang Patel      activeBBPassManager->isAnalysisAvailable(AID))
435be6d515f481756ff549f355e32be1ac398e141d5Devang Patel    return true;
436be6d515f481756ff549f355e32be1ac398e141d5Devang Patel
437be6d515f481756ff549f355e32be1ac398e141d5Devang Patel  // TODO : Check inactive managers
438be6d515f481756ff549f355e32be1ac398e141d5Devang Patel  return false;
439be6d515f481756ff549f355e32be1ac398e141d5Devang Patel}
440448d27cd795dc273249f123444509403f4fa4facDevang Patel
44192c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel// ModulePassManager implementation
44292c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel
44392c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel/// Add P into pass vector if it is manageble. If P is a FunctionPass
444c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// then use FunctionPassManagerImpl_New to manage it. Return false if P
44592c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel/// is not manageable by this manager.
44692c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patelbool
4472c5d1851bbcb20adb79664ec16ab1f97b9142086Devang PatelModulePassManager_New::addPass(Pass *P) {
44892c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel
44992c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel  // If P is FunctionPass then use function pass maanager.
45092c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel  if (FunctionPass *FP = dynamic_cast<FunctionPass*>(P)) {
45192c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel
45292c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel    activeFunctionPassManager = NULL;
45392c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel
45492c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel    if (!activeFunctionPassManager
45592c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel        || !activeFunctionPassManager->addPass(P)) {
45692c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel
457c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel      activeFunctionPassManager = new FunctionPassManagerImpl_New();
458893a5a681585cdf3b5bfff7128ea522e8a47750aDevang Patel      addPassToManager(activeFunctionPassManager, false);
4592c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel      if (!activeFunctionPassManager->addPass(FP))
4602c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel        assert(0 && "Unable to add pass");
46192c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel    }
46292c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel    return true;
46392c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel  }
46492c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel
46592c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel  ModulePass *MP = dynamic_cast<ModulePass *>(P);
46692c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel  if (!MP)
46792c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel    return false;
46892c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel
46953596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel  // If this pass does not preserve anlysis that is used by other passes
47053596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel  // managed by this manager than it is not a suiable pass for this manager.
4712c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel  if (!manageablePass(P))
47253596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel    return false;
47353596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel
474e253385b108cd946b1ac150302f246d3b218be77Devang Patel  addPassToManager(MP);
47592c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel  activeFunctionPassManager = NULL;
47692c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel  return true;
47792c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel}
47892c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel
47992c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel
48092c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel/// Execute all of the passes scheduled for execution by invoking
48192c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel/// runOnModule method.  Keep track of whether any of the passes modifies
48292c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel/// the module, and if so, return true.
48392c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patelbool
48492c45eebf77de5d6ee84a3f18f560b83cb68e720Devang PatelModulePassManager_New::runOnModule(Module &M) {
48592c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel  bool Changed = false;
486c1d6e1fc9c3a47529f417026df652f466ce67851Devang Patel  clearAnalysis();
487c1d6e1fc9c3a47529f417026df652f466ce67851Devang Patel
488e253385b108cd946b1ac150302f246d3b218be77Devang Patel  for (std::vector<Pass *>::iterator itr = passVectorBegin(),
489e253385b108cd946b1ac150302f246d3b218be77Devang Patel         e = passVectorEnd(); itr != e; ++itr) {
49092c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel    Pass *P = *itr;
491c1d6e1fc9c3a47529f417026df652f466ce67851Devang Patel
492c1d6e1fc9c3a47529f417026df652f466ce67851Devang Patel    noteDownAvailableAnalysis(P);
49392c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel    ModulePass *MP = dynamic_cast<ModulePass*>(P);
49492c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel    Changed |= MP->runOnModule(M);
495c1d6e1fc9c3a47529f417026df652f466ce67851Devang Patel    removeNotPreservedAnalysis(P);
496c1d6e1fc9c3a47529f417026df652f466ce67851Devang Patel    removeDeadPasses();
49792c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel  }
49892c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel  return Changed;
49992c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel}
50092c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel
501be6d515f481756ff549f355e32be1ac398e141d5Devang Patel/// Return true IFF AnalysisID AID is currently available.
502be6d515f481756ff549f355e32be1ac398e141d5Devang Patelbool ModulePassManager_New::analysisCurrentlyAvailable(AnalysisID AID) {
503be6d515f481756ff549f355e32be1ac398e141d5Devang Patel
504be6d515f481756ff549f355e32be1ac398e141d5Devang Patel  if (isAnalysisAvailable(AID))
505be6d515f481756ff549f355e32be1ac398e141d5Devang Patel    return true;
506be6d515f481756ff549f355e32be1ac398e141d5Devang Patel
507be6d515f481756ff549f355e32be1ac398e141d5Devang Patel  if (activeFunctionPassManager &&
508be6d515f481756ff549f355e32be1ac398e141d5Devang Patel      activeFunctionPassManager->isAnalysisAvailable(AID))
509be6d515f481756ff549f355e32be1ac398e141d5Devang Patel    return true;
510be6d515f481756ff549f355e32be1ac398e141d5Devang Patel
511be6d515f481756ff549f355e32be1ac398e141d5Devang Patel  // TODO : Check inactive managers
512be6d515f481756ff549f355e32be1ac398e141d5Devang Patel  return false;
513be6d515f481756ff549f355e32be1ac398e141d5Devang Patel}
514be6d515f481756ff549f355e32be1ac398e141d5Devang Patel
515be6d515f481756ff549f355e32be1ac398e141d5Devang Patel/// Return true IFF AnalysisID AID is currently available.
516be6d515f481756ff549f355e32be1ac398e141d5Devang Patelbool PassManagerImpl_New::analysisCurrentlyAvailable(AnalysisID AID) {
517be6d515f481756ff549f355e32be1ac398e141d5Devang Patel
5182718bfbaa6a1ecb37bb34483b09010cbb3563f83Devang Patel  bool available = false;
5192718bfbaa6a1ecb37bb34483b09010cbb3563f83Devang Patel  for (std::vector<ModulePassManager_New *>::iterator itr = PassManagers.begin(),
5202718bfbaa6a1ecb37bb34483b09010cbb3563f83Devang Patel         e = PassManagers.end(); !available && itr != e; ++itr)
5212718bfbaa6a1ecb37bb34483b09010cbb3563f83Devang Patel    available  = (*itr)->analysisCurrentlyAvailable(AID);
5222718bfbaa6a1ecb37bb34483b09010cbb3563f83Devang Patel  return available;
523be6d515f481756ff549f355e32be1ac398e141d5Devang Patel}
524be6d515f481756ff549f355e32be1ac398e141d5Devang Patel
525f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel/// Schedule pass P for execution. Make sure that passes required by
526f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel/// P are run before P is run. Update analysis info maintained by
527f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel/// the manager. Remove dead passes. This is a recursive function.
528f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patelvoid PassManagerImpl_New::schedulePass(Pass *P) {
529f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel
530f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel  AnalysisUsage AnUsage;
531f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel  P->getAnalysisUsage(AnUsage);
532f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel  const std::vector<AnalysisID> &RequiredSet = AnUsage.getRequiredSet();
533f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel  for (std::vector<AnalysisID>::const_iterator I = RequiredSet.begin(),
534f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel         E = RequiredSet.end(); I != E; ++I) {
535f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel
536be6d515f481756ff549f355e32be1ac398e141d5Devang Patel    if (!analysisCurrentlyAvailable(*I)) {
537f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel      // Schedule this analysis run first.
538f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel      Pass *AP = (*I)->createPass();
539f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel      schedulePass(AP);
540f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel    }
541f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel  }
542f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel
543f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel  addPass(P);
544f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel}
545f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel
546b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel/// Schedule all passes from the queue by adding them in their
547b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel/// respective manager's queue.
548f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patelvoid PassManagerImpl_New::schedulePasses() {
549f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel  for (std::vector<Pass *>::iterator I = passVectorBegin(),
550f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel         E = passVectorEnd(); I != E; ++I)
551f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel    schedulePass (*I);
552b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel}
553b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel
554b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel/// Add pass P to the queue of passes to run.
555f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patelvoid PassManagerImpl_New::add(Pass *P) {
556f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel  // Do not process Analysis now. Analysis is process while scheduling
557f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel  // the pass vector.
558fcb2d940a0f0c471069a65c57c48b847d1b6762eDevang Patel  addPassToManager(P, false);
559b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel}
560b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel
561b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel// PassManager_New implementation
562b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel/// Add P into active pass manager or use new module pass manager to
563b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel/// manage it.
564f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patelbool PassManagerImpl_New::addPass(Pass *P) {
565b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel
566a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel  if (!activeManager || !activeManager->addPass(P)) {
567b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel    activeManager = new ModulePassManager_New();
568b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel    PassManagers.push_back(activeManager);
569b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel  }
570b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel
571b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel  return activeManager->addPass(P);
572b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel}
573b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel
574b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel/// run - Execute all of the passes scheduled for execution.  Keep track of
575b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel/// whether any of the passes modifies the module, and if so, return true.
576f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patelbool PassManagerImpl_New::run(Module &M) {
577b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel
578b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel  schedulePasses();
579b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel  bool Changed = false;
580b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel  for (std::vector<ModulePassManager_New *>::iterator itr = PassManagers.begin(),
581b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel         e = PassManagers.end(); itr != e; ++itr) {
582b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel    ModulePassManager_New *pm = *itr;
583b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel    Changed |= pm->runOnModule(M);
584b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel  }
585b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel  return Changed;
586b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel}
5875a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
5885a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel/// Create new pass manager
5895a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang PatelPassManager_New::PassManager_New() {
5905a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  PM = new PassManagerImpl_New();
5915a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel}
5925a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
5935a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel/// add - Add a pass to the queue of passes to run.  This passes ownership of
5945a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel/// the Pass to the PassManager.  When the PassManager is destroyed, the pass
5955a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel/// will be destroyed as well, so there is no need to delete the pass.  This
5965a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel/// implies that all passes MUST be allocated with 'new'.
5975a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patelvoid
5985a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang PatelPassManager_New::add(Pass *P) {
5995a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  PM->add(P);
6005a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel}
6015a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
6025a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel/// run - Execute all of the passes scheduled for execution.  Keep track of
6035a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel/// whether any of the passes modifies the module, and if so, return true.
6045a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patelbool
6055a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang PatelPassManager_New::run(Module &M) {
6065a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  return PM->run(M);
6075a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel}
6085a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
609