PassManager.cpp revision 2f42ed6b0b5161296cdd7e573b49fe631599fc97
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>
18b899eed1bc0a64f96fa7aff8d7c6f999cf85bdfeDevang Patel#include <map>
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
35b899eed1bc0a64f96fa7aff8d7c6f999cf85bdfeDevang Patel  Pass *getAnalysisPass(AnalysisID AID) const {
36b899eed1bc0a64f96fa7aff8d7c6f999cf85bdfeDevang Patel
37b899eed1bc0a64f96fa7aff8d7c6f999cf85bdfeDevang Patel    std::map<AnalysisID, Pass*>::const_iterator I =
38b899eed1bc0a64f96fa7aff8d7c6f999cf85bdfeDevang Patel      AvailableAnalysis.find(AID);
39b899eed1bc0a64f96fa7aff8d7c6f999cf85bdfeDevang Patel
40b899eed1bc0a64f96fa7aff8d7c6f999cf85bdfeDevang Patel    if (I != AvailableAnalysis.end())
41b899eed1bc0a64f96fa7aff8d7c6f999cf85bdfeDevang Patel      return NULL;
42b899eed1bc0a64f96fa7aff8d7c6f999cf85bdfeDevang Patel    else
43b899eed1bc0a64f96fa7aff8d7c6f999cf85bdfeDevang Patel      return I->second;
44be6d515f481756ff549f355e32be1ac398e141d5Devang Patel  }
4585d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel
4685d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel  /// Augment RequiredAnalysis by adding analysis required by pass P.
4785d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel  void noteDownRequiredAnalysis(Pass *P);
4885d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel
4985d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel  /// Augment AvailableAnalysis by adding analysis made available by pass P.
5085d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel  void noteDownAvailableAnalysis(Pass *P);
5185d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel
5285d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel  /// Remove Analysis that is not preserved by the pass
5385d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel  void removeNotPreservedAnalysis(Pass *P);
5485d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel
5585d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel  /// Remove dead passes
56df1a10ece6a75f230d98c6fb001349eede90387aDevang Patel  void removeDeadPasses(Pass *P);
5785d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel
58e253385b108cd946b1ac150302f246d3b218be77Devang Patel  /// Add pass P into the PassVector. Update RequiredAnalysis and
59893a5a681585cdf3b5bfff7128ea522e8a47750aDevang Patel  /// AvailableAnalysis appropriately if ProcessAnalysis is true.
60893a5a681585cdf3b5bfff7128ea522e8a47750aDevang Patel  void addPassToManager (Pass *P, bool ProcessAnalysis = true);
61e253385b108cd946b1ac150302f246d3b218be77Devang Patel
62c1d6e1fc9c3a47529f417026df652f466ce67851Devang Patel  /// Clear analysis vectors RequiredAnalysis and AvailableAnalysis.
63c1d6e1fc9c3a47529f417026df652f466ce67851Devang Patel  /// This is used before running passes managed by the manager.
64c1d6e1fc9c3a47529f417026df652f466ce67851Devang Patel  void clearAnalysis() {
65c1d6e1fc9c3a47529f417026df652f466ce67851Devang Patel    RequiredAnalysis.clear();
66c1d6e1fc9c3a47529f417026df652f466ce67851Devang Patel    AvailableAnalysis.clear();
6703153c70de080e4c184ad29f0d78e456019b9a4cDevang Patel    LastUser.clear();
68c1d6e1fc9c3a47529f417026df652f466ce67851Devang Patel  }
69c1d6e1fc9c3a47529f417026df652f466ce67851Devang Patel
70b899eed1bc0a64f96fa7aff8d7c6f999cf85bdfeDevang Patel  // All Required analyses should be available to the pass as it runs!  Here
71b899eed1bc0a64f96fa7aff8d7c6f999cf85bdfeDevang Patel  // we fill in the AnalysisImpls member of the pass so that it can
72b899eed1bc0a64f96fa7aff8d7c6f999cf85bdfeDevang Patel  // successfully use the getAnalysis() method to retrieve the
73b899eed1bc0a64f96fa7aff8d7c6f999cf85bdfeDevang Patel  // implementations it needs.
74b899eed1bc0a64f96fa7aff8d7c6f999cf85bdfeDevang Patel  //
752f42ed6b0b5161296cdd7e573b49fe631599fc97Devang Patel void initializeAnalysisImpl(Pass *P);
76b899eed1bc0a64f96fa7aff8d7c6f999cf85bdfeDevang Patel
77e253385b108cd946b1ac150302f246d3b218be77Devang Patel  inline std::vector<Pass *>::iterator passVectorBegin() {
78e253385b108cd946b1ac150302f246d3b218be77Devang Patel    return PassVector.begin();
79e253385b108cd946b1ac150302f246d3b218be77Devang Patel  }
80e253385b108cd946b1ac150302f246d3b218be77Devang Patel
81e253385b108cd946b1ac150302f246d3b218be77Devang Patel  inline std::vector<Pass *>::iterator passVectorEnd() {
82e253385b108cd946b1ac150302f246d3b218be77Devang Patel    return PassVector.end();
83e253385b108cd946b1ac150302f246d3b218be77Devang Patel  }
84e253385b108cd946b1ac150302f246d3b218be77Devang Patel
852f42ed6b0b5161296cdd7e573b49fe631599fc97Devang Patel  inline void setLastUser(Pass *P, Pass *LU) {
862f42ed6b0b5161296cdd7e573b49fe631599fc97Devang Patel    LastUser[P] = LU;
872f42ed6b0b5161296cdd7e573b49fe631599fc97Devang Patel    // TODO : Check if pass P is available.
882f42ed6b0b5161296cdd7e573b49fe631599fc97Devang Patel
892f42ed6b0b5161296cdd7e573b49fe631599fc97Devang Patel    // Prolong live range of analyses that are needed after an analysis pass
902f42ed6b0b5161296cdd7e573b49fe631599fc97Devang Patel    // is destroyed, for querying by subsequent passes
912f42ed6b0b5161296cdd7e573b49fe631599fc97Devang Patel    AnalysisUsage AnUsage;
922f42ed6b0b5161296cdd7e573b49fe631599fc97Devang Patel    P->getAnalysisUsage(AnUsage);
932f42ed6b0b5161296cdd7e573b49fe631599fc97Devang Patel    const std::vector<AnalysisID> &IDs = AnUsage.getRequiredTransitiveSet();
942f42ed6b0b5161296cdd7e573b49fe631599fc97Devang Patel    for (std::vector<AnalysisID>::const_iterator I = IDs.begin(),
952f42ed6b0b5161296cdd7e573b49fe631599fc97Devang Patel           E = IDs.end(); I != E; ++I) {
962f42ed6b0b5161296cdd7e573b49fe631599fc97Devang Patel      Pass *AnalysisPass = getAnalysisPass(*I); // getAnalysisPassFromManager(*I);
972f42ed6b0b5161296cdd7e573b49fe631599fc97Devang Patel      assert (AnalysisPass && "Analysis pass is not available");
982f42ed6b0b5161296cdd7e573b49fe631599fc97Devang Patel      setLastUser(AnalysisPass, LU);
992f42ed6b0b5161296cdd7e573b49fe631599fc97Devang Patel    }
1002f42ed6b0b5161296cdd7e573b49fe631599fc97Devang Patel
1012f42ed6b0b5161296cdd7e573b49fe631599fc97Devang Patel  }
10203153c70de080e4c184ad29f0d78e456019b9a4cDevang Patel
10385d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patelprivate:
1045770c7cd52d6a3dfd9a5815cc9153d94afc6dd31Devang Patel  // Analysis required by the passes managed by this manager. This information
1055770c7cd52d6a3dfd9a5815cc9153d94afc6dd31Devang Patel  // used while selecting pass manager during addPass. If a pass does not
1065770c7cd52d6a3dfd9a5815cc9153d94afc6dd31Devang Patel  // preserve any analysis required by other passes managed by current
1075770c7cd52d6a3dfd9a5815cc9153d94afc6dd31Devang Patel  // pass manager then new pass manager is used.
10885d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel  std::vector<AnalysisID> RequiredAnalysis;
10985d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel
1105770c7cd52d6a3dfd9a5815cc9153d94afc6dd31Devang Patel  // Set of available Analysis. This information is used while scheduling
1115770c7cd52d6a3dfd9a5815cc9153d94afc6dd31Devang Patel  // pass. If a pass requires an analysis which is not not available then
1125770c7cd52d6a3dfd9a5815cc9153d94afc6dd31Devang Patel  // equired analysis pass is scheduled to run before the pass itself is
1135770c7cd52d6a3dfd9a5815cc9153d94afc6dd31Devang Patel  // scheduled to run.
114b899eed1bc0a64f96fa7aff8d7c6f999cf85bdfeDevang Patel  std::map<AnalysisID, Pass*> AvailableAnalysis;
115e253385b108cd946b1ac150302f246d3b218be77Devang Patel
11603153c70de080e4c184ad29f0d78e456019b9a4cDevang Patel  // Map to keep track of last user of the analysis pass.
11703153c70de080e4c184ad29f0d78e456019b9a4cDevang Patel  // LastUser->second is the last user of Lastuser->first.
11803153c70de080e4c184ad29f0d78e456019b9a4cDevang Patel  std::map<Pass *, Pass *> LastUser;
11903153c70de080e4c184ad29f0d78e456019b9a4cDevang Patel
120e253385b108cd946b1ac150302f246d3b218be77Devang Patel  // Collection of pass that are managed by this manager
121e253385b108cd946b1ac150302f246d3b218be77Devang Patel  std::vector<Pass *> PassVector;
12285d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel};
12385d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel
124c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel/// BasicBlockPassManager_New manages BasicBlockPass. It batches all the
125c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel/// pass together and sequence them to process one basic block before
126c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel/// processing next basic block.
12737a84c7d8bda439082b883e33be6ab88b4cce236Devang Patelclass BasicBlockPassManager_New : public CommonPassManagerImpl {
128c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
129c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patelpublic:
130c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  BasicBlockPassManager_New() { }
131c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
132c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// Add a pass into a passmanager queue.
133c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  bool addPass(Pass *p);
134c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
135c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// Execute all of the passes scheduled for execution.  Keep track of
136c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// whether any of the passes modifies the function, and if so, return true.
137c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  bool runOnFunction(Function &F);
138c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
139be6d515f481756ff549f355e32be1ac398e141d5Devang Patel  /// Return true IFF AnalysisID AID is currently available.
14003153c70de080e4c184ad29f0d78e456019b9a4cDevang Patel  Pass *getAnalysisPassFromManager(AnalysisID AID);
141be6d515f481756ff549f355e32be1ac398e141d5Devang Patel
142c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patelprivate:
143c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel};
144c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
145c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// FunctionPassManagerImpl_New manages FunctionPasses and BasicBlockPassManagers.
146c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel/// It batches all function passes and basic block pass managers together and
147c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel/// sequence them to process one function at a time before processing next
148c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel/// function.
14937a84c7d8bda439082b883e33be6ab88b4cce236Devang Patelclass FunctionPassManagerImpl_New : public CommonPassManagerImpl {
150c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patelpublic:
151c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel  FunctionPassManagerImpl_New(ModuleProvider *P) { /* TODO */ }
152c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel  FunctionPassManagerImpl_New() {
153c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel    activeBBPassManager = NULL;
154c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  }
155c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel  ~FunctionPassManagerImpl_New() { /* TODO */ };
156c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
157c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// add - Add a pass to the queue of passes to run.  This passes
158c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// ownership of the Pass to the PassManager.  When the
159c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// PassManager_X is destroyed, the pass will be destroyed as well, so
160c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// there is no need to delete the pass. (TODO delete passes.)
161c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// This implies that all passes MUST be allocated with 'new'.
162c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  void add(Pass *P) { /* TODO*/  }
163c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
164c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// Add pass into the pass manager queue.
165c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  bool addPass(Pass *P);
166c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
167c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// Execute all of the passes scheduled for execution.  Keep
168c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// track of whether any of the passes modifies the function, and if
169c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// so, return true.
170c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  bool runOnModule(Module &M);
171c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
172be6d515f481756ff549f355e32be1ac398e141d5Devang Patel  /// Return true IFF AnalysisID AID is currently available.
17303153c70de080e4c184ad29f0d78e456019b9a4cDevang Patel  Pass *getAnalysisPassFromManager(AnalysisID AID);
174be6d515f481756ff549f355e32be1ac398e141d5Devang Patel
175c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patelprivate:
176c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  // Active Pass Managers
177c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  BasicBlockPassManager_New *activeBBPassManager;
178c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel};
179c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
180c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel/// ModulePassManager_New manages ModulePasses and function pass managers.
181c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel/// It batches all Module passes  passes and function pass managers together and
182c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel/// sequence them to process one module.
18337a84c7d8bda439082b883e33be6ab88b4cce236Devang Patelclass ModulePassManager_New : public CommonPassManagerImpl {
184c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
185c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patelpublic:
186c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  ModulePassManager_New() { activeFunctionPassManager = NULL; }
187c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
188c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// Add a pass into a passmanager queue.
189c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  bool addPass(Pass *p);
190c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
191c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// run - Execute all of the passes scheduled for execution.  Keep track of
192c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// whether any of the passes modifies the module, and if so, return true.
193c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  bool runOnModule(Module &M);
194be6d515f481756ff549f355e32be1ac398e141d5Devang Patel
195be6d515f481756ff549f355e32be1ac398e141d5Devang Patel  /// Return true IFF AnalysisID AID is currently available.
19603153c70de080e4c184ad29f0d78e456019b9a4cDevang Patel  Pass *getAnalysisPassFromManager(AnalysisID AID);
197c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
198c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patelprivate:
199c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  // Active Pass Manager
200c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel  FunctionPassManagerImpl_New *activeFunctionPassManager;
201c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel};
202c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
2035a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel/// PassManager_New manages ModulePassManagers
20437a84c7d8bda439082b883e33be6ab88b4cce236Devang Patelclass PassManagerImpl_New : public CommonPassManagerImpl {
2055a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
2065a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patelpublic:
2075a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
2085a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  /// add - Add a pass to the queue of passes to run.  This passes ownership of
2095a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  /// the Pass to the PassManager.  When the PassManager is destroyed, the pass
2105a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  /// will be destroyed as well, so there is no need to delete the pass.  This
2115a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  /// implies that all passes MUST be allocated with 'new'.
2125a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  void add(Pass *P);
2135a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
2145a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  /// run - Execute all of the passes scheduled for execution.  Keep track of
2155a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  /// whether any of the passes modifies the module, and if so, return true.
2165a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  bool run(Module &M);
2175a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
218be6d515f481756ff549f355e32be1ac398e141d5Devang Patel  /// Return true IFF AnalysisID AID is currently available.
21903153c70de080e4c184ad29f0d78e456019b9a4cDevang Patel  Pass *getAnalysisPassFromManager(AnalysisID AID);
220be6d515f481756ff549f355e32be1ac398e141d5Devang Patel
2215a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patelprivate:
2225a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
2235a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  /// Add a pass into a passmanager queue. This is used by schedulePasses
2245a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  bool addPass(Pass *p);
2255a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
226f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel  /// Schedule pass P for execution. Make sure that passes required by
227f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel  /// P are run before P is run. Update analysis info maintained by
228f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel  /// the manager. Remove dead passes. This is a recursive function.
229f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel  void schedulePass(Pass *P);
230f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel
2315a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  /// Schedule all passes collected in pass queue using add(). Add all the
2325a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  /// schedule passes into various manager's queue using addPass().
2335a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  void schedulePasses();
2345a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
2355a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  // Collection of pass managers
2365a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  std::vector<ModulePassManager_New *> PassManagers;
2375a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
2385a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  // Active Pass Manager
2395a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  ModulePassManager_New *activeManager;
2405a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel};
2415a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
242c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel} // End of llvm namespace
243c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
24437a84c7d8bda439082b883e33be6ab88b4cce236Devang Patel// CommonPassManagerImpl implementation
245889739c4d188d28c167644bced9df0f3131317d7Devang Patel
2462c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel/// Return true IFF pass P's required analysis set does not required new
247889739c4d188d28c167644bced9df0f3131317d7Devang Patel/// manager.
24837a84c7d8bda439082b883e33be6ab88b4cce236Devang Patelbool CommonPassManagerImpl::manageablePass(Pass *P) {
249889739c4d188d28c167644bced9df0f3131317d7Devang Patel
250889739c4d188d28c167644bced9df0f3131317d7Devang Patel  AnalysisUsage AnUsage;
251889739c4d188d28c167644bced9df0f3131317d7Devang Patel  P->getAnalysisUsage(AnUsage);
252889739c4d188d28c167644bced9df0f3131317d7Devang Patel
253a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel  // If this pass is not preserving information that is required by the other
254a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel  // passes managed by this manager then use new manager
255a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel  if (!AnUsage.getPreservesAll()) {
256a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel    const std::vector<AnalysisID> &PreservedSet = AnUsage.getPreservedSet();
257a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel    for (std::vector<AnalysisID>::iterator I = RequiredAnalysis.begin(),
258a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel           E = RequiredAnalysis.end(); I != E; ++I) {
259a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel      if (std::find(PreservedSet.begin(), PreservedSet.end(), *I) ==
260a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel          PreservedSet.end())
261a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel        // This analysis is not preserved. Need new manager.
262a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel        return false;
263a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel    }
264a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel  }
265889739c4d188d28c167644bced9df0f3131317d7Devang Patel  return true;
266889739c4d188d28c167644bced9df0f3131317d7Devang Patel}
267889739c4d188d28c167644bced9df0f3131317d7Devang Patel
268b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel/// Augment RequiredAnalysis by adding analysis required by pass P.
26937a84c7d8bda439082b883e33be6ab88b4cce236Devang Patelvoid CommonPassManagerImpl::noteDownRequiredAnalysis(Pass *P) {
270a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel  AnalysisUsage AnUsage;
271a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel  P->getAnalysisUsage(AnUsage);
272a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel  const std::vector<AnalysisID> &RequiredSet = AnUsage.getRequiredSet();
273889739c4d188d28c167644bced9df0f3131317d7Devang Patel
274a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel  // FIXME: What about duplicates ?
27514d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel  RequiredAnalysis.insert(RequiredAnalysis.end(), RequiredSet.begin(),
27614d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel                          RequiredSet.end());
2772f42ed6b0b5161296cdd7e573b49fe631599fc97Devang Patel
2782f42ed6b0b5161296cdd7e573b49fe631599fc97Devang Patel  initializeAnalysisImpl(P);
279889739c4d188d28c167644bced9df0f3131317d7Devang Patel}
280889739c4d188d28c167644bced9df0f3131317d7Devang Patel
281b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel/// Augement AvailableAnalysis by adding analysis made available by pass P.
282b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patelvoid CommonPassManagerImpl::noteDownAvailableAnalysis(Pass *P) {
283b899eed1bc0a64f96fa7aff8d7c6f999cf85bdfeDevang Patel
284b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel  if (const PassInfo *PI = P->getPassInfo()) {
285b899eed1bc0a64f96fa7aff8d7c6f999cf85bdfeDevang Patel    AvailableAnalysis[PI] = P;
286b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel
287b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel    //TODO This pass is the current implementation of all of the interfaces it
288b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel    //TODO implements as well.
289b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel    //TODO
290b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel    //TODO const std::vector<const PassInfo*> &II = PI->getInterfacesImplemented();
291b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel    //TODO for (unsigned i = 0, e = II.size(); i != e; ++i)
292b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel    //TODO CurrentAnalyses[II[i]] = P;
293b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel  }
294b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel}
295b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel
296889739c4d188d28c167644bced9df0f3131317d7Devang Patel/// Remove Analyss not preserved by Pass P
29737a84c7d8bda439082b883e33be6ab88b4cce236Devang Patelvoid CommonPassManagerImpl::removeNotPreservedAnalysis(Pass *P) {
29814d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel  AnalysisUsage AnUsage;
29914d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel  P->getAnalysisUsage(AnUsage);
30014d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel  const std::vector<AnalysisID> &PreservedSet = AnUsage.getPreservedSet();
30114d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel
302b899eed1bc0a64f96fa7aff8d7c6f999cf85bdfeDevang Patel  for (std::map<AnalysisID, Pass*>::iterator I = AvailableAnalysis.begin(),
30314d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel         E = AvailableAnalysis.end(); I != E; ++I ) {
304b899eed1bc0a64f96fa7aff8d7c6f999cf85bdfeDevang Patel    if (std::find(PreservedSet.begin(), PreservedSet.end(), I->first) ==
30514d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel        PreservedSet.end()) {
30614d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel      // Remove this analysis
307b899eed1bc0a64f96fa7aff8d7c6f999cf85bdfeDevang Patel      std::map<AnalysisID, Pass*>::iterator J = I++;
30814d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel      AvailableAnalysis.erase(J);
30914d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel    }
31014d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel  }
311889739c4d188d28c167644bced9df0f3131317d7Devang Patel}
312889739c4d188d28c167644bced9df0f3131317d7Devang Patel
313df1a10ece6a75f230d98c6fb001349eede90387aDevang Patel/// Remove analysis passes that are not used any longer
314df1a10ece6a75f230d98c6fb001349eede90387aDevang Patelvoid CommonPassManagerImpl::removeDeadPasses(Pass *P) {
315df1a10ece6a75f230d98c6fb001349eede90387aDevang Patel
316df1a10ece6a75f230d98c6fb001349eede90387aDevang Patel  for (std::map<Pass *, Pass *>::iterator I = LastUser.begin(),
317df1a10ece6a75f230d98c6fb001349eede90387aDevang Patel         E = LastUser.end(); I !=E; ++I) {
318df1a10ece6a75f230d98c6fb001349eede90387aDevang Patel    if (I->second == P) {
319df1a10ece6a75f230d98c6fb001349eede90387aDevang Patel      Pass *deadPass = I->first;
320df1a10ece6a75f230d98c6fb001349eede90387aDevang Patel      deadPass->releaseMemory();
321df1a10ece6a75f230d98c6fb001349eede90387aDevang Patel
322df1a10ece6a75f230d98c6fb001349eede90387aDevang Patel      std::map<AnalysisID, Pass*>::iterator Pos =
323df1a10ece6a75f230d98c6fb001349eede90387aDevang Patel        AvailableAnalysis.find(deadPass->getPassInfo());
324df1a10ece6a75f230d98c6fb001349eede90387aDevang Patel
325df1a10ece6a75f230d98c6fb001349eede90387aDevang Patel      assert (Pos != AvailableAnalysis.end() &&
326df1a10ece6a75f230d98c6fb001349eede90387aDevang Patel              "Pass is not available");
327df1a10ece6a75f230d98c6fb001349eede90387aDevang Patel      AvailableAnalysis.erase(Pos);
328df1a10ece6a75f230d98c6fb001349eede90387aDevang Patel    }
329df1a10ece6a75f230d98c6fb001349eede90387aDevang Patel  }
330df1a10ece6a75f230d98c6fb001349eede90387aDevang Patel}
331df1a10ece6a75f230d98c6fb001349eede90387aDevang Patel
332e253385b108cd946b1ac150302f246d3b218be77Devang Patel/// Add pass P into the PassVector. Update RequiredAnalysis and
333893a5a681585cdf3b5bfff7128ea522e8a47750aDevang Patel/// AvailableAnalysis appropriately if ProcessAnalysis is true.
334893a5a681585cdf3b5bfff7128ea522e8a47750aDevang Patelvoid CommonPassManagerImpl::addPassToManager (Pass *P,
335893a5a681585cdf3b5bfff7128ea522e8a47750aDevang Patel                                              bool ProcessAnalysis) {
336e253385b108cd946b1ac150302f246d3b218be77Devang Patel
337893a5a681585cdf3b5bfff7128ea522e8a47750aDevang Patel  if (ProcessAnalysis) {
338893a5a681585cdf3b5bfff7128ea522e8a47750aDevang Patel    // Take a note of analysis required and made available by this pass
339893a5a681585cdf3b5bfff7128ea522e8a47750aDevang Patel    noteDownRequiredAnalysis(P);
340893a5a681585cdf3b5bfff7128ea522e8a47750aDevang Patel    noteDownAvailableAnalysis(P);
341893a5a681585cdf3b5bfff7128ea522e8a47750aDevang Patel
342893a5a681585cdf3b5bfff7128ea522e8a47750aDevang Patel    // Remove the analysis not preserved by this pass
343893a5a681585cdf3b5bfff7128ea522e8a47750aDevang Patel    removeNotPreservedAnalysis(P);
344893a5a681585cdf3b5bfff7128ea522e8a47750aDevang Patel  }
345e253385b108cd946b1ac150302f246d3b218be77Devang Patel
346e253385b108cd946b1ac150302f246d3b218be77Devang Patel  // Add pass
347e253385b108cd946b1ac150302f246d3b218be77Devang Patel  PassVector.push_back(P);
348e253385b108cd946b1ac150302f246d3b218be77Devang Patel}
349e253385b108cd946b1ac150302f246d3b218be77Devang Patel
3502f42ed6b0b5161296cdd7e573b49fe631599fc97Devang Patel// All Required analyses should be available to the pass as it runs!  Here
3512f42ed6b0b5161296cdd7e573b49fe631599fc97Devang Patel// we fill in the AnalysisImpls member of the pass so that it can
3522f42ed6b0b5161296cdd7e573b49fe631599fc97Devang Patel// successfully use the getAnalysis() method to retrieve the
3532f42ed6b0b5161296cdd7e573b49fe631599fc97Devang Patel// implementations it needs.
3542f42ed6b0b5161296cdd7e573b49fe631599fc97Devang Patel//
3552f42ed6b0b5161296cdd7e573b49fe631599fc97Devang Patelvoid CommonPassManagerImpl::initializeAnalysisImpl(Pass *P) {
3562f42ed6b0b5161296cdd7e573b49fe631599fc97Devang Patel  AnalysisUsage AnUsage;
3572f42ed6b0b5161296cdd7e573b49fe631599fc97Devang Patel  P->getAnalysisUsage(AnUsage);
3582f42ed6b0b5161296cdd7e573b49fe631599fc97Devang Patel
3592f42ed6b0b5161296cdd7e573b49fe631599fc97Devang Patel  for (std::vector<const PassInfo *>::const_iterator
3602f42ed6b0b5161296cdd7e573b49fe631599fc97Devang Patel         I = AnUsage.getRequiredSet().begin(),
3612f42ed6b0b5161296cdd7e573b49fe631599fc97Devang Patel         E = AnUsage.getRequiredSet().end(); I != E; ++I) {
3622f42ed6b0b5161296cdd7e573b49fe631599fc97Devang Patel    Pass *Impl = getAnalysisPass(*I);
3632f42ed6b0b5161296cdd7e573b49fe631599fc97Devang Patel    if (Impl == 0)
3642f42ed6b0b5161296cdd7e573b49fe631599fc97Devang Patel      assert(0 && "Analysis used but not available!");
3652f42ed6b0b5161296cdd7e573b49fe631599fc97Devang Patel    // TODO:  P->AnalysisImpls.push_back(std::make_pair(*I, Impl));
3662f42ed6b0b5161296cdd7e573b49fe631599fc97Devang Patel  }
3672f42ed6b0b5161296cdd7e573b49fe631599fc97Devang Patel}
3682f42ed6b0b5161296cdd7e573b49fe631599fc97Devang Patel
36955fd43f90913676682487f89f27c756adb827f66Devang Patel/// BasicBlockPassManager implementation
37055fd43f90913676682487f89f27c756adb827f66Devang Patel
3712c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel/// Add pass P into PassVector and return true. If this pass is not
3722c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel/// manageable by this manager then return false.
37355fd43f90913676682487f89f27c756adb827f66Devang Patelbool
3742c5d1851bbcb20adb79664ec16ab1f97b9142086Devang PatelBasicBlockPassManager_New::addPass(Pass *P) {
37555fd43f90913676682487f89f27c756adb827f66Devang Patel
37655fd43f90913676682487f89f27c756adb827f66Devang Patel  BasicBlockPass *BP = dynamic_cast<BasicBlockPass*>(P);
37755fd43f90913676682487f89f27c756adb827f66Devang Patel  if (!BP)
37855fd43f90913676682487f89f27c756adb827f66Devang Patel    return false;
37955fd43f90913676682487f89f27c756adb827f66Devang Patel
38053596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel  // If this pass does not preserve anlysis that is used by other passes
38153596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel  // managed by this manager than it is not a suiable pass for this manager.
3822c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel  if (!manageablePass(P))
38353596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel    return false;
38453596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel
385e253385b108cd946b1ac150302f246d3b218be77Devang Patel  addPassToManager (BP);
38614d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel
38755fd43f90913676682487f89f27c756adb827f66Devang Patel  return true;
38855fd43f90913676682487f89f27c756adb827f66Devang Patel}
38955fd43f90913676682487f89f27c756adb827f66Devang Patel
39055fd43f90913676682487f89f27c756adb827f66Devang Patel/// Execute all of the passes scheduled for execution by invoking
39155fd43f90913676682487f89f27c756adb827f66Devang Patel/// runOnBasicBlock method.  Keep track of whether any of the passes modifies
39255fd43f90913676682487f89f27c756adb827f66Devang Patel/// the function, and if so, return true.
39355fd43f90913676682487f89f27c756adb827f66Devang Patelbool
39455fd43f90913676682487f89f27c756adb827f66Devang PatelBasicBlockPassManager_New::runOnFunction(Function &F) {
39555fd43f90913676682487f89f27c756adb827f66Devang Patel
39655fd43f90913676682487f89f27c756adb827f66Devang Patel  bool Changed = false;
397c1d6e1fc9c3a47529f417026df652f466ce67851Devang Patel  clearAnalysis();
398c1d6e1fc9c3a47529f417026df652f466ce67851Devang Patel
39955fd43f90913676682487f89f27c756adb827f66Devang Patel  for (Function::iterator I = F.begin(), E = F.end(); I != E; ++I)
400e253385b108cd946b1ac150302f246d3b218be77Devang Patel    for (std::vector<Pass *>::iterator itr = passVectorBegin(),
401e253385b108cd946b1ac150302f246d3b218be77Devang Patel           e = passVectorEnd(); itr != e; ++itr) {
40255fd43f90913676682487f89f27c756adb827f66Devang Patel      Pass *P = *itr;
403c1d6e1fc9c3a47529f417026df652f466ce67851Devang Patel
404c1d6e1fc9c3a47529f417026df652f466ce67851Devang Patel      noteDownAvailableAnalysis(P);
40555fd43f90913676682487f89f27c756adb827f66Devang Patel      BasicBlockPass *BP = dynamic_cast<BasicBlockPass*>(P);
40655fd43f90913676682487f89f27c756adb827f66Devang Patel      Changed |= BP->runOnBasicBlock(*I);
407c1d6e1fc9c3a47529f417026df652f466ce67851Devang Patel      removeNotPreservedAnalysis(P);
408df1a10ece6a75f230d98c6fb001349eede90387aDevang Patel      removeDeadPasses(P);
40955fd43f90913676682487f89f27c756adb827f66Devang Patel    }
41055fd43f90913676682487f89f27c756adb827f66Devang Patel  return Changed;
41155fd43f90913676682487f89f27c756adb827f66Devang Patel}
41255fd43f90913676682487f89f27c756adb827f66Devang Patel
413be6d515f481756ff549f355e32be1ac398e141d5Devang Patel/// Return true IFF AnalysisID AID is currently available.
41403153c70de080e4c184ad29f0d78e456019b9a4cDevang PatelPass * BasicBlockPassManager_New::getAnalysisPassFromManager(AnalysisID AID) {
41503153c70de080e4c184ad29f0d78e456019b9a4cDevang Patel  return getAnalysisPass(AID);
416be6d515f481756ff549f355e32be1ac398e141d5Devang Patel}
417be6d515f481756ff549f355e32be1ac398e141d5Devang Patel
418448d27cd795dc273249f123444509403f4fa4facDevang Patel// FunctionPassManager_New implementation
419c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// Create new Function pass manager
420c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang PatelFunctionPassManager_New::FunctionPassManager_New() {
421c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel  FPM = new FunctionPassManagerImpl_New();
422c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel}
423c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel
424c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// add - Add a pass to the queue of passes to run.  This passes
425c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// ownership of the Pass to the PassManager.  When the
426c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// PassManager_X is destroyed, the pass will be destroyed as well, so
427c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// there is no need to delete the pass. (TODO delete passes.)
428c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// This implies that all passes MUST be allocated with 'new'.
429c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patelvoid
430c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang PatelFunctionPassManager_New::add(Pass *P) {
431c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel  FPM->add(P);
432c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel}
433c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel
434c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// Execute all of the passes scheduled for execution.  Keep
435c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// track of whether any of the passes modifies the function, and if
436c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// so, return true.
437c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patelbool
438c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang PatelFunctionPassManager_New::runOnModule(Module &M) {
439c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel  return FPM->runOnModule(M);
440c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel}
441c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel
442c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel// FunctionPassManagerImpl_New implementation
443448d27cd795dc273249f123444509403f4fa4facDevang Patel
444448d27cd795dc273249f123444509403f4fa4facDevang Patel// FunctionPassManager
445448d27cd795dc273249f123444509403f4fa4facDevang Patel
446448d27cd795dc273249f123444509403f4fa4facDevang Patel/// Add pass P into the pass manager queue. If P is a BasicBlockPass then
447448d27cd795dc273249f123444509403f4fa4facDevang Patel/// either use it into active basic block pass manager or create new basic
448448d27cd795dc273249f123444509403f4fa4facDevang Patel/// block pass manager to handle pass P.
449448d27cd795dc273249f123444509403f4fa4facDevang Patelbool
450c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang PatelFunctionPassManagerImpl_New::addPass(Pass *P) {
451448d27cd795dc273249f123444509403f4fa4facDevang Patel
452448d27cd795dc273249f123444509403f4fa4facDevang Patel  // If P is a BasicBlockPass then use BasicBlockPassManager_New.
453448d27cd795dc273249f123444509403f4fa4facDevang Patel  if (BasicBlockPass *BP = dynamic_cast<BasicBlockPass*>(P)) {
454448d27cd795dc273249f123444509403f4fa4facDevang Patel
455448d27cd795dc273249f123444509403f4fa4facDevang Patel    if (!activeBBPassManager
456448d27cd795dc273249f123444509403f4fa4facDevang Patel        || !activeBBPassManager->addPass(BP)) {
457448d27cd795dc273249f123444509403f4fa4facDevang Patel
458448d27cd795dc273249f123444509403f4fa4facDevang Patel      activeBBPassManager = new BasicBlockPassManager_New();
459893a5a681585cdf3b5bfff7128ea522e8a47750aDevang Patel      addPassToManager(activeBBPassManager, false);
4602c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel      if (!activeBBPassManager->addPass(BP))
4612c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel        assert(0 && "Unable to add Pass");
462448d27cd795dc273249f123444509403f4fa4facDevang Patel    }
463448d27cd795dc273249f123444509403f4fa4facDevang Patel    return true;
464448d27cd795dc273249f123444509403f4fa4facDevang Patel  }
465448d27cd795dc273249f123444509403f4fa4facDevang Patel
466448d27cd795dc273249f123444509403f4fa4facDevang Patel  FunctionPass *FP = dynamic_cast<FunctionPass *>(P);
467448d27cd795dc273249f123444509403f4fa4facDevang Patel  if (!FP)
468448d27cd795dc273249f123444509403f4fa4facDevang Patel    return false;
469448d27cd795dc273249f123444509403f4fa4facDevang Patel
47053596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel  // If this pass does not preserve anlysis that is used by other passes
47153596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel  // managed by this manager than it is not a suiable pass for this manager.
4722c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel  if (!manageablePass(P))
47353596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel    return false;
47453596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel
475e253385b108cd946b1ac150302f246d3b218be77Devang Patel  addPassToManager (FP);
476448d27cd795dc273249f123444509403f4fa4facDevang Patel  activeBBPassManager = NULL;
477448d27cd795dc273249f123444509403f4fa4facDevang Patel  return true;
478448d27cd795dc273249f123444509403f4fa4facDevang Patel}
479448d27cd795dc273249f123444509403f4fa4facDevang Patel
480448d27cd795dc273249f123444509403f4fa4facDevang Patel/// Execute all of the passes scheduled for execution by invoking
481448d27cd795dc273249f123444509403f4fa4facDevang Patel/// runOnFunction method.  Keep track of whether any of the passes modifies
482448d27cd795dc273249f123444509403f4fa4facDevang Patel/// the function, and if so, return true.
483448d27cd795dc273249f123444509403f4fa4facDevang Patelbool
484c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang PatelFunctionPassManagerImpl_New::runOnModule(Module &M) {
485448d27cd795dc273249f123444509403f4fa4facDevang Patel
486448d27cd795dc273249f123444509403f4fa4facDevang Patel  bool Changed = false;
487c1d6e1fc9c3a47529f417026df652f466ce67851Devang Patel  clearAnalysis();
488c1d6e1fc9c3a47529f417026df652f466ce67851Devang Patel
489448d27cd795dc273249f123444509403f4fa4facDevang Patel  for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I)
490e253385b108cd946b1ac150302f246d3b218be77Devang Patel    for (std::vector<Pass *>::iterator itr = passVectorBegin(),
491e253385b108cd946b1ac150302f246d3b218be77Devang Patel           e = passVectorEnd(); itr != e; ++itr) {
492448d27cd795dc273249f123444509403f4fa4facDevang Patel      Pass *P = *itr;
493c1d6e1fc9c3a47529f417026df652f466ce67851Devang Patel
494c1d6e1fc9c3a47529f417026df652f466ce67851Devang Patel      noteDownAvailableAnalysis(P);
495448d27cd795dc273249f123444509403f4fa4facDevang Patel      FunctionPass *FP = dynamic_cast<FunctionPass*>(P);
496448d27cd795dc273249f123444509403f4fa4facDevang Patel      Changed |= FP->runOnFunction(*I);
497c1d6e1fc9c3a47529f417026df652f466ce67851Devang Patel      removeNotPreservedAnalysis(P);
498df1a10ece6a75f230d98c6fb001349eede90387aDevang Patel      removeDeadPasses(P);
499448d27cd795dc273249f123444509403f4fa4facDevang Patel    }
500448d27cd795dc273249f123444509403f4fa4facDevang Patel  return Changed;
501448d27cd795dc273249f123444509403f4fa4facDevang Patel}
502448d27cd795dc273249f123444509403f4fa4facDevang Patel
503be6d515f481756ff549f355e32be1ac398e141d5Devang Patel/// Return true IFF AnalysisID AID is currently available.
50403153c70de080e4c184ad29f0d78e456019b9a4cDevang PatelPass *FunctionPassManagerImpl_New::getAnalysisPassFromManager(AnalysisID AID) {
505be6d515f481756ff549f355e32be1ac398e141d5Devang Patel
50603153c70de080e4c184ad29f0d78e456019b9a4cDevang Patel  Pass *P = getAnalysisPass(AID);
50703153c70de080e4c184ad29f0d78e456019b9a4cDevang Patel  if (P)
50803153c70de080e4c184ad29f0d78e456019b9a4cDevang Patel    return P;
509be6d515f481756ff549f355e32be1ac398e141d5Devang Patel
510be6d515f481756ff549f355e32be1ac398e141d5Devang Patel  if (activeBBPassManager &&
511b899eed1bc0a64f96fa7aff8d7c6f999cf85bdfeDevang Patel      activeBBPassManager->getAnalysisPass(AID) != 0)
51203153c70de080e4c184ad29f0d78e456019b9a4cDevang Patel    return activeBBPassManager->getAnalysisPass(AID);
513be6d515f481756ff549f355e32be1ac398e141d5Devang Patel
514be6d515f481756ff549f355e32be1ac398e141d5Devang Patel  // TODO : Check inactive managers
51503153c70de080e4c184ad29f0d78e456019b9a4cDevang Patel  return NULL;
516be6d515f481756ff549f355e32be1ac398e141d5Devang Patel}
517448d27cd795dc273249f123444509403f4fa4facDevang Patel
51892c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel// ModulePassManager implementation
51992c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel
52092c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel/// Add P into pass vector if it is manageble. If P is a FunctionPass
521c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// then use FunctionPassManagerImpl_New to manage it. Return false if P
52292c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel/// is not manageable by this manager.
52392c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patelbool
5242c5d1851bbcb20adb79664ec16ab1f97b9142086Devang PatelModulePassManager_New::addPass(Pass *P) {
52592c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel
52692c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel  // If P is FunctionPass then use function pass maanager.
52792c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel  if (FunctionPass *FP = dynamic_cast<FunctionPass*>(P)) {
52892c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel
52992c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel    activeFunctionPassManager = NULL;
53092c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel
53192c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel    if (!activeFunctionPassManager
53292c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel        || !activeFunctionPassManager->addPass(P)) {
53392c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel
534c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel      activeFunctionPassManager = new FunctionPassManagerImpl_New();
535893a5a681585cdf3b5bfff7128ea522e8a47750aDevang Patel      addPassToManager(activeFunctionPassManager, false);
5362c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel      if (!activeFunctionPassManager->addPass(FP))
5372c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel        assert(0 && "Unable to add pass");
53892c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel    }
53992c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel    return true;
54092c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel  }
54192c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel
54292c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel  ModulePass *MP = dynamic_cast<ModulePass *>(P);
54392c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel  if (!MP)
54492c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel    return false;
54592c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel
54653596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel  // If this pass does not preserve anlysis that is used by other passes
54753596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel  // managed by this manager than it is not a suiable pass for this manager.
5482c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel  if (!manageablePass(P))
54953596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel    return false;
55053596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel
551e253385b108cd946b1ac150302f246d3b218be77Devang Patel  addPassToManager(MP);
55292c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel  activeFunctionPassManager = NULL;
55392c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel  return true;
55492c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel}
55592c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel
55692c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel
55792c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel/// Execute all of the passes scheduled for execution by invoking
55892c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel/// runOnModule method.  Keep track of whether any of the passes modifies
55992c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel/// the module, and if so, return true.
56092c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patelbool
56192c45eebf77de5d6ee84a3f18f560b83cb68e720Devang PatelModulePassManager_New::runOnModule(Module &M) {
56292c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel  bool Changed = false;
563c1d6e1fc9c3a47529f417026df652f466ce67851Devang Patel  clearAnalysis();
564c1d6e1fc9c3a47529f417026df652f466ce67851Devang Patel
565e253385b108cd946b1ac150302f246d3b218be77Devang Patel  for (std::vector<Pass *>::iterator itr = passVectorBegin(),
566e253385b108cd946b1ac150302f246d3b218be77Devang Patel         e = passVectorEnd(); itr != e; ++itr) {
56792c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel    Pass *P = *itr;
568c1d6e1fc9c3a47529f417026df652f466ce67851Devang Patel
569c1d6e1fc9c3a47529f417026df652f466ce67851Devang Patel    noteDownAvailableAnalysis(P);
57092c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel    ModulePass *MP = dynamic_cast<ModulePass*>(P);
57192c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel    Changed |= MP->runOnModule(M);
572c1d6e1fc9c3a47529f417026df652f466ce67851Devang Patel    removeNotPreservedAnalysis(P);
573df1a10ece6a75f230d98c6fb001349eede90387aDevang Patel    removeDeadPasses(P);
57492c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel  }
57592c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel  return Changed;
57692c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel}
57792c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel
578be6d515f481756ff549f355e32be1ac398e141d5Devang Patel/// Return true IFF AnalysisID AID is currently available.
57903153c70de080e4c184ad29f0d78e456019b9a4cDevang PatelPass *ModulePassManager_New::getAnalysisPassFromManager(AnalysisID AID) {
580be6d515f481756ff549f355e32be1ac398e141d5Devang Patel
58103153c70de080e4c184ad29f0d78e456019b9a4cDevang Patel
58203153c70de080e4c184ad29f0d78e456019b9a4cDevang Patel  Pass *P = getAnalysisPass(AID);
58303153c70de080e4c184ad29f0d78e456019b9a4cDevang Patel  if (P)
58403153c70de080e4c184ad29f0d78e456019b9a4cDevang Patel    return P;
585be6d515f481756ff549f355e32be1ac398e141d5Devang Patel
586be6d515f481756ff549f355e32be1ac398e141d5Devang Patel  if (activeFunctionPassManager &&
587b899eed1bc0a64f96fa7aff8d7c6f999cf85bdfeDevang Patel      activeFunctionPassManager->getAnalysisPass(AID) != 0)
58803153c70de080e4c184ad29f0d78e456019b9a4cDevang Patel    return activeFunctionPassManager->getAnalysisPass(AID);
589be6d515f481756ff549f355e32be1ac398e141d5Devang Patel
590be6d515f481756ff549f355e32be1ac398e141d5Devang Patel  // TODO : Check inactive managers
59103153c70de080e4c184ad29f0d78e456019b9a4cDevang Patel  return NULL;
592be6d515f481756ff549f355e32be1ac398e141d5Devang Patel}
593be6d515f481756ff549f355e32be1ac398e141d5Devang Patel
594be6d515f481756ff549f355e32be1ac398e141d5Devang Patel/// Return true IFF AnalysisID AID is currently available.
59503153c70de080e4c184ad29f0d78e456019b9a4cDevang PatelPass *PassManagerImpl_New::getAnalysisPassFromManager(AnalysisID AID) {
596be6d515f481756ff549f355e32be1ac398e141d5Devang Patel
59703153c70de080e4c184ad29f0d78e456019b9a4cDevang Patel  Pass *P = NULL;
5982718bfbaa6a1ecb37bb34483b09010cbb3563f83Devang Patel  for (std::vector<ModulePassManager_New *>::iterator itr = PassManagers.begin(),
59903153c70de080e4c184ad29f0d78e456019b9a4cDevang Patel         e = PassManagers.end(); !P && itr != e; ++itr)
60003153c70de080e4c184ad29f0d78e456019b9a4cDevang Patel    P  = (*itr)->getAnalysisPassFromManager(AID);
60103153c70de080e4c184ad29f0d78e456019b9a4cDevang Patel  return P;
602be6d515f481756ff549f355e32be1ac398e141d5Devang Patel}
603be6d515f481756ff549f355e32be1ac398e141d5Devang Patel
604f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel/// Schedule pass P for execution. Make sure that passes required by
605f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel/// P are run before P is run. Update analysis info maintained by
606f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel/// the manager. Remove dead passes. This is a recursive function.
607f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patelvoid PassManagerImpl_New::schedulePass(Pass *P) {
608f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel
609f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel  AnalysisUsage AnUsage;
610f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel  P->getAnalysisUsage(AnUsage);
611f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel  const std::vector<AnalysisID> &RequiredSet = AnUsage.getRequiredSet();
612f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel  for (std::vector<AnalysisID>::const_iterator I = RequiredSet.begin(),
613f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel         E = RequiredSet.end(); I != E; ++I) {
614f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel
61503153c70de080e4c184ad29f0d78e456019b9a4cDevang Patel    Pass *AnalysisPass = getAnalysisPassFromManager(*I);
61603153c70de080e4c184ad29f0d78e456019b9a4cDevang Patel    if (!AnalysisPass) {
617f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel      // Schedule this analysis run first.
61803153c70de080e4c184ad29f0d78e456019b9a4cDevang Patel      AnalysisPass = (*I)->createPass();
61903153c70de080e4c184ad29f0d78e456019b9a4cDevang Patel      schedulePass(AnalysisPass);
620f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel    }
62103153c70de080e4c184ad29f0d78e456019b9a4cDevang Patel    setLastUser (AnalysisPass, P);
622f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel  }
623f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel
624f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel  addPass(P);
625f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel}
626f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel
627b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel/// Schedule all passes from the queue by adding them in their
628b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel/// respective manager's queue.
629f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patelvoid PassManagerImpl_New::schedulePasses() {
630f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel  for (std::vector<Pass *>::iterator I = passVectorBegin(),
631f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel         E = passVectorEnd(); I != E; ++I)
632f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel    schedulePass (*I);
633b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel}
634b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel
635b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel/// Add pass P to the queue of passes to run.
636f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patelvoid PassManagerImpl_New::add(Pass *P) {
637f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel  // Do not process Analysis now. Analysis is process while scheduling
638f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel  // the pass vector.
639fcb2d940a0f0c471069a65c57c48b847d1b6762eDevang Patel  addPassToManager(P, false);
640b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel}
641b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel
642b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel// PassManager_New implementation
643b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel/// Add P into active pass manager or use new module pass manager to
644b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel/// manage it.
645f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patelbool PassManagerImpl_New::addPass(Pass *P) {
646b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel
647a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel  if (!activeManager || !activeManager->addPass(P)) {
648b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel    activeManager = new ModulePassManager_New();
649b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel    PassManagers.push_back(activeManager);
650b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel  }
651b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel
652b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel  return activeManager->addPass(P);
653b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel}
654b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel
655b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel/// run - Execute all of the passes scheduled for execution.  Keep track of
656b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel/// whether any of the passes modifies the module, and if so, return true.
657f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patelbool PassManagerImpl_New::run(Module &M) {
658b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel
659b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel  schedulePasses();
660b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel  bool Changed = false;
661b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel  for (std::vector<ModulePassManager_New *>::iterator itr = PassManagers.begin(),
662b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel         e = PassManagers.end(); itr != e; ++itr) {
663b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel    ModulePassManager_New *pm = *itr;
664b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel    Changed |= pm->runOnModule(M);
665b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel  }
666b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel  return Changed;
667b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel}
6685a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
6695a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel/// Create new pass manager
6705a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang PatelPassManager_New::PassManager_New() {
6715a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  PM = new PassManagerImpl_New();
6725a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel}
6735a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
6745a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel/// add - Add a pass to the queue of passes to run.  This passes ownership of
6755a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel/// the Pass to the PassManager.  When the PassManager is destroyed, the pass
6765a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel/// will be destroyed as well, so there is no need to delete the pass.  This
6775a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel/// implies that all passes MUST be allocated with 'new'.
6785a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patelvoid
6795a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang PatelPassManager_New::add(Pass *P) {
6805a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  PM->add(P);
6815a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel}
6825a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
6835a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel/// run - Execute all of the passes scheduled for execution.  Keep track of
6845a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel/// whether any of the passes modifies the module, and if so, return true.
6855a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patelbool
6865a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang PatelPassManager_New::run(Module &M) {
6875a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  return PM->run(M);
6885a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel}
6895a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
690