PassManager.cpp revision 09e6e4303f1aac10fea6860e7736c234fcbf56cc
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"
1645dc02d6f97447785ee7ffe08c36a34bc8921b0bDevang Patel#include "llvm/Support/CommandLine.h"
178e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel#include "llvm/Support/Timer.h"
1855fd43f90913676682487f89f27c756adb827f66Devang Patel#include "llvm/Module.h"
193799f97d539f6c288d169063e1b335917fafcffbDevang Patel#include "llvm/ModuleProvider.h"
208f487662869d10c866b9ebdccb8f6a7509d3ab56Bill Wendling#include "llvm/Support/Streams.h"
218e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel#include "llvm/Support/ManagedStatic.h"
2285d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel#include <vector>
23b899eed1bc0a64f96fa7aff8d7c6f999cf85bdfeDevang Patel#include <map>
24c2ff962bf97761a54c94d2dadb555060403d49c6Devang Patel
2555fd43f90913676682487f89f27c756adb827f66Devang Patelusing namespace llvm;
26c2ff962bf97761a54c94d2dadb555060403d49c6Devang Patelclass llvm::PMDataManager;
2755fd43f90913676682487f89f27c756adb827f66Devang Patel
28e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel//===----------------------------------------------------------------------===//
29e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel// Overview:
30e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel// The Pass Manager Infrastructure manages passes. It's responsibilities are:
31e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel//
32e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel//   o Manage optimization pass execution order
33e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel//   o Make required Analysis information available before pass P is run
34e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel//   o Release memory occupied by dead passes
35e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel//   o If Analysis information is dirtied by a pass then regenerate Analysis
36e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel//     information before it is consumed by another pass.
37e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel//
38a84b3025ca7d437d2eab22d7c3002c8d89c31858Chris Lattner// Pass Manager Infrastructure uses multiple pass managers.  They are
395f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel// PassManager, FunctionPassManager, MPPassManager, FPPassManager, BBPassManager.
40a84b3025ca7d437d2eab22d7c3002c8d89c31858Chris Lattner// This class hierarcy uses multiple inheritance but pass managers do not derive
41a84b3025ca7d437d2eab22d7c3002c8d89c31858Chris Lattner// from another pass manager.
42e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel//
43a84b3025ca7d437d2eab22d7c3002c8d89c31858Chris Lattner// PassManager and FunctionPassManager are two top-level pass manager that
44e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel// represents the external interface of this entire pass manager infrastucture.
45e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel//
46e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel// Important classes :
47e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel//
48e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel// [o] class PMTopLevelManager;
49e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel//
50e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel// Two top level managers, PassManager and FunctionPassManager, derive from
51e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel// PMTopLevelManager. PMTopLevelManager manages information used by top level
52e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel// managers such as last user info.
53e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel//
54e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel// [o] class PMDataManager;
55e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel//
56e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel// PMDataManager manages information, e.g. list of available analysis info,
57e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel// used by a pass manager to manage execution order of passes. It also provides
58e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel// a place to implement common pass manager APIs. All pass managers derive from
59e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel// PMDataManager.
60e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel//
615f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel// [o] class BBPassManager : public FunctionPass, public PMDataManager;
62e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel//
635f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel// BBPassManager manages BasicBlockPasses.
64e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel//
65e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel// [o] class FunctionPassManager;
66e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel//
67e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel// This is a external interface used by JIT to manage FunctionPasses. This
68e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel// interface relies on FunctionPassManagerImpl to do all the tasks.
69e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel//
70e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel// [o] class FunctionPassManagerImpl : public ModulePass, PMDataManager,
71e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel//                                     public PMTopLevelManager;
72e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel//
735f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel// FunctionPassManagerImpl is a top level manager. It manages FPPassManagers
74e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel//
755f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel// [o] class FPPassManager : public ModulePass, public PMDataManager;
76e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel//
775f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel// FPPassManager manages FunctionPasses and BBPassManagers
785f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel//
795f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel// [o] class MPPassManager : public Pass, public PMDataManager;
805f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel//
815f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel// MPPassManager manages ModulePasses and FPPassManagers
82e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel//
83e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel// [o] class PassManager;
84e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel//
85e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel// This is a external interface used by various tools to manages passes. It
86e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel// relies on PassManagerImpl to do all the tasks.
87e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel//
88e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel// [o] class PassManagerImpl : public Pass, public PMDataManager,
89e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel//                             public PMDTopLevelManager
90e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel//
91e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel// PassManagerImpl is a top level pass manager responsible for managing
925f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel// MPPassManagers.
93e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel//===----------------------------------------------------------------------===//
94e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel
9545dc02d6f97447785ee7ffe08c36a34bc8921b0bDevang Patelnamespace llvm {
9645dc02d6f97447785ee7ffe08c36a34bc8921b0bDevang Patel
9745dc02d6f97447785ee7ffe08c36a34bc8921b0bDevang Patel//===----------------------------------------------------------------------===//
9845dc02d6f97447785ee7ffe08c36a34bc8921b0bDevang Patel// Pass debugging information.  Often it is useful to find out what pass is
9945dc02d6f97447785ee7ffe08c36a34bc8921b0bDevang Patel// running when a crash occurs in a utility.  When this library is compiled with
10045dc02d6f97447785ee7ffe08c36a34bc8921b0bDevang Patel// debugging on, a command line option (--debug-pass) is enabled that causes the
10145dc02d6f97447785ee7ffe08c36a34bc8921b0bDevang Patel// pass name to be printed before it executes.
10245dc02d6f97447785ee7ffe08c36a34bc8921b0bDevang Patel//
10345dc02d6f97447785ee7ffe08c36a34bc8921b0bDevang Patel
104e8ff1ce7343c697ff90d940c8c5fa8fccc09220dDevang Patel// Different debug levels that can be enabled...
105e8ff1ce7343c697ff90d940c8c5fa8fccc09220dDevang Patelenum PassDebugLevel {
106e8ff1ce7343c697ff90d940c8c5fa8fccc09220dDevang Patel  None, Arguments, Structure, Executions, Details
107e8ff1ce7343c697ff90d940c8c5fa8fccc09220dDevang Patel};
108e8ff1ce7343c697ff90d940c8c5fa8fccc09220dDevang Patel
10945dc02d6f97447785ee7ffe08c36a34bc8921b0bDevang Patelstatic cl::opt<enum PassDebugLevel>
11045dc02d6f97447785ee7ffe08c36a34bc8921b0bDevang PatelPassDebugging_New("debug-pass", cl::Hidden,
11145dc02d6f97447785ee7ffe08c36a34bc8921b0bDevang Patel                  cl::desc("Print PassManager debugging information"),
11245dc02d6f97447785ee7ffe08c36a34bc8921b0bDevang Patel                  cl::values(
113e8ff1ce7343c697ff90d940c8c5fa8fccc09220dDevang Patel  clEnumVal(None      , "disable debug output"),
114e8ff1ce7343c697ff90d940c8c5fa8fccc09220dDevang Patel  clEnumVal(Arguments , "print pass arguments to pass to 'opt'"),
115e8ff1ce7343c697ff90d940c8c5fa8fccc09220dDevang Patel  clEnumVal(Structure , "print pass structure before run()"),
116e8ff1ce7343c697ff90d940c8c5fa8fccc09220dDevang Patel  clEnumVal(Executions, "print pass name before it is executed"),
117e8ff1ce7343c697ff90d940c8c5fa8fccc09220dDevang Patel  clEnumVal(Details   , "print pass details when it is executed"),
11845dc02d6f97447785ee7ffe08c36a34bc8921b0bDevang Patel                             clEnumValEnd));
11945dc02d6f97447785ee7ffe08c36a34bc8921b0bDevang Patel} // End of llvm namespace
12045dc02d6f97447785ee7ffe08c36a34bc8921b0bDevang Patel
121c2ff962bf97761a54c94d2dadb555060403d49c6Devang Patelnamespace {
1221b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel
1233f5d2b58b84cb12a9520dd33921ca556d539eb4dDevang Patel//===----------------------------------------------------------------------===//
1243f5d2b58b84cb12a9520dd33921ca556d539eb4dDevang Patel// PMTopLevelManager
1253f5d2b58b84cb12a9520dd33921ca556d539eb4dDevang Patel//
1263f5d2b58b84cb12a9520dd33921ca556d539eb4dDevang Patel/// PMTopLevelManager manages LastUser info and collects common APIs used by
1273f5d2b58b84cb12a9520dd33921ca556d539eb4dDevang Patel/// top level pass managers.
128c2ff962bf97761a54c94d2dadb555060403d49c6Devang Patelclass VISIBILITY_HIDDEN PMTopLevelManager {
1293f5d2b58b84cb12a9520dd33921ca556d539eb4dDevang Patelpublic:
1303f5d2b58b84cb12a9520dd33921ca556d539eb4dDevang Patel
1315f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  virtual unsigned getNumContainedManagers() {
1325f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel    return PassManagers.size();
1333f5d2b58b84cb12a9520dd33921ca556d539eb4dDevang Patel  }
1343f5d2b58b84cb12a9520dd33921ca556d539eb4dDevang Patel
1353f5d2b58b84cb12a9520dd33921ca556d539eb4dDevang Patel  /// Schedule pass P for execution. Make sure that passes required by
1363f5d2b58b84cb12a9520dd33921ca556d539eb4dDevang Patel  /// P are run before P is run. Update analysis info maintained by
1373f5d2b58b84cb12a9520dd33921ca556d539eb4dDevang Patel  /// the manager. Remove dead passes. This is a recursive function.
138e61b7478e53cea3183d4aee3799a4f0977b850a0Devang Patel  void schedulePass(Pass *P);
1393f5d2b58b84cb12a9520dd33921ca556d539eb4dDevang Patel
1403f5d2b58b84cb12a9520dd33921ca556d539eb4dDevang Patel  /// This is implemented by top level pass manager and used by
1413f5d2b58b84cb12a9520dd33921ca556d539eb4dDevang Patel  /// schedulePass() to add analysis info passes that are not available.
1423f5d2b58b84cb12a9520dd33921ca556d539eb4dDevang Patel  virtual void addTopLevelPass(Pass  *P) = 0;
1433f5d2b58b84cb12a9520dd33921ca556d539eb4dDevang Patel
1443f5d2b58b84cb12a9520dd33921ca556d539eb4dDevang Patel  /// Set pass P as the last user of the given analysis passes.
1453f5d2b58b84cb12a9520dd33921ca556d539eb4dDevang Patel  void setLastUser(std::vector<Pass *> &AnalysisPasses, Pass *P);
1463f5d2b58b84cb12a9520dd33921ca556d539eb4dDevang Patel
1473f5d2b58b84cb12a9520dd33921ca556d539eb4dDevang Patel  /// Collect passes whose last user is P
1483f5d2b58b84cb12a9520dd33921ca556d539eb4dDevang Patel  void collectLastUses(std::vector<Pass *> &LastUses, Pass *P);
1493f5d2b58b84cb12a9520dd33921ca556d539eb4dDevang Patel
15069867b511c732a7fac7301977bd6e880e46439f1Devang Patel  /// Find the pass that implements Analysis AID. Search immutable
15169867b511c732a7fac7301977bd6e880e46439f1Devang Patel  /// passes and all pass managers. If desired pass is not found
15269867b511c732a7fac7301977bd6e880e46439f1Devang Patel  /// then return NULL.
15369867b511c732a7fac7301977bd6e880e46439f1Devang Patel  Pass *findAnalysisPass(AnalysisID AID);
15469867b511c732a7fac7301977bd6e880e46439f1Devang Patel
1553f5d2b58b84cb12a9520dd33921ca556d539eb4dDevang Patel  virtual ~PMTopLevelManager() {
15637a6f7966c39f69a92419d37949a94a758c29e90Devang Patel    for (std::vector<Pass *>::iterator I = PassManagers.begin(),
15737a6f7966c39f69a92419d37949a94a758c29e90Devang Patel           E = PassManagers.end(); I != E; ++I)
15837a6f7966c39f69a92419d37949a94a758c29e90Devang Patel      delete *I;
15937a6f7966c39f69a92419d37949a94a758c29e90Devang Patel
16037a6f7966c39f69a92419d37949a94a758c29e90Devang Patel    for (std::vector<ImmutablePass *>::iterator
16137a6f7966c39f69a92419d37949a94a758c29e90Devang Patel           I = ImmutablePasses.begin(), E = ImmutablePasses.end(); I != E; ++I)
16237a6f7966c39f69a92419d37949a94a758c29e90Devang Patel      delete *I;
16337a6f7966c39f69a92419d37949a94a758c29e90Devang Patel
1643f5d2b58b84cb12a9520dd33921ca556d539eb4dDevang Patel    PassManagers.clear();
1653f5d2b58b84cb12a9520dd33921ca556d539eb4dDevang Patel  }
1663f5d2b58b84cb12a9520dd33921ca556d539eb4dDevang Patel
1673e44559d0137f2c3e3bf7a0c1e0004e0a5c81137Devang Patel  /// Add immutable pass and initialize it.
1683e44559d0137f2c3e3bf7a0c1e0004e0a5c81137Devang Patel  inline void addImmutablePass(ImmutablePass *P) {
1693e44559d0137f2c3e3bf7a0c1e0004e0a5c81137Devang Patel    P->initializePass();
1703e44559d0137f2c3e3bf7a0c1e0004e0a5c81137Devang Patel    ImmutablePasses.push_back(P);
1713e44559d0137f2c3e3bf7a0c1e0004e0a5c81137Devang Patel  }
1723e44559d0137f2c3e3bf7a0c1e0004e0a5c81137Devang Patel
1733e44559d0137f2c3e3bf7a0c1e0004e0a5c81137Devang Patel  inline std::vector<ImmutablePass *>& getImmutablePasses() {
1743e44559d0137f2c3e3bf7a0c1e0004e0a5c81137Devang Patel    return ImmutablePasses;
1753e44559d0137f2c3e3bf7a0c1e0004e0a5c81137Devang Patel  }
1763e44559d0137f2c3e3bf7a0c1e0004e0a5c81137Devang Patel
177a083e94f7971ddafb817b1bcd86992d9fc4d8f9eDevang Patel  void addPassManager(Pass *Manager) {
178a083e94f7971ddafb817b1bcd86992d9fc4d8f9eDevang Patel    PassManagers.push_back(Manager);
179a083e94f7971ddafb817b1bcd86992d9fc4d8f9eDevang Patel  }
180a083e94f7971ddafb817b1bcd86992d9fc4d8f9eDevang Patel
181591b1b7526ed9c099de23cc995853a250c20502fDevang Patel  // Add Manager into the list of managers that are not directly
182591b1b7526ed9c099de23cc995853a250c20502fDevang Patel  // maintained by this top level pass manager
1831b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel  inline void addIndirectPassManager(PMDataManager *Manager) {
1841b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel    IndirectPassManagers.push_back(Manager);
185591b1b7526ed9c099de23cc995853a250c20502fDevang Patel  }
186591b1b7526ed9c099de23cc995853a250c20502fDevang Patel
187ebc0922eeb5b728d33a68d4bea8128413f62e369Devang Patel  // Print passes managed by this top level manager.
188a52035a062edf9bfbf95c92c615219b647042c17Devang Patel  void dumpPasses() const;
189a52035a062edf9bfbf95c92c615219b647042c17Devang Patel  void dumpArguments() const;
190ebc0922eeb5b728d33a68d4bea8128413f62e369Devang Patel
1911336a6bf06e64a096217628d2cc9644e48a5d7d6Devang Patel  void initializeAllAnalysisInfo();
1921336a6bf06e64a096217628d2cc9644e48a5d7d6Devang Patel
1935f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patelprotected:
1943f5d2b58b84cb12a9520dd33921ca556d539eb4dDevang Patel
1953f5d2b58b84cb12a9520dd33921ca556d539eb4dDevang Patel  /// Collection of pass managers
1963f5d2b58b84cb12a9520dd33921ca556d539eb4dDevang Patel  std::vector<Pass *> PassManagers;
1973f5d2b58b84cb12a9520dd33921ca556d539eb4dDevang Patel
1985f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patelprivate:
1995f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel
200591b1b7526ed9c099de23cc995853a250c20502fDevang Patel  /// Collection of pass managers that are not directly maintained
201591b1b7526ed9c099de23cc995853a250c20502fDevang Patel  /// by this pass manager
2021b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel  std::vector<PMDataManager *> IndirectPassManagers;
203591b1b7526ed9c099de23cc995853a250c20502fDevang Patel
2043f5d2b58b84cb12a9520dd33921ca556d539eb4dDevang Patel  // Map to keep track of last user of the analysis pass.
2053f5d2b58b84cb12a9520dd33921ca556d539eb4dDevang Patel  // LastUser->second is the last user of Lastuser->first.
2063f5d2b58b84cb12a9520dd33921ca556d539eb4dDevang Patel  std::map<Pass *, Pass *> LastUser;
2073e44559d0137f2c3e3bf7a0c1e0004e0a5c81137Devang Patel
2083e44559d0137f2c3e3bf7a0c1e0004e0a5c81137Devang Patel  /// Immutable passes are managed by top level manager.
2093e44559d0137f2c3e3bf7a0c1e0004e0a5c81137Devang Patel  std::vector<ImmutablePass *> ImmutablePasses;
2103f5d2b58b84cb12a9520dd33921ca556d539eb4dDevang Patel};
211c2ff962bf97761a54c94d2dadb555060403d49c6Devang Patel
212c2ff962bf97761a54c94d2dadb555060403d49c6Devang Patel} // End of anon namespace
2133f5d2b58b84cb12a9520dd33921ca556d539eb4dDevang Patel
214dc48f203cdc5a0b8f79d28bab6219161061fd73bDevang Patel//===----------------------------------------------------------------------===//
215dc48f203cdc5a0b8f79d28bab6219161061fd73bDevang Patel// PMDataManager
2163f5d2b58b84cb12a9520dd33921ca556d539eb4dDevang Patel
217c2ff962bf97761a54c94d2dadb555060403d49c6Devang Patelnamespace llvm {
218419f0e95d698109541ad730cb45ba4caca78f458Devang Patel/// PMDataManager provides the common place to manage the analysis data
219419f0e95d698109541ad730cb45ba4caca78f458Devang Patel/// used by pass managers.
220419f0e95d698109541ad730cb45ba4caca78f458Devang Patelclass PMDataManager {
22185d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patelpublic:
2221a8038636c2998e37f2130b0ab89a3686d9c1f48Devang Patel  PMDataManager(int Depth) : TPM(NULL), Depth(Depth) {
223dc48f203cdc5a0b8f79d28bab6219161061fd73bDevang Patel    initializeAnalysisInfo();
224dc48f203cdc5a0b8f79d28bab6219161061fd73bDevang Patel  }
225dc48f203cdc5a0b8f79d28bab6219161061fd73bDevang Patel
22637a6f7966c39f69a92419d37949a94a758c29e90Devang Patel  virtual ~PMDataManager() {
22737a6f7966c39f69a92419d37949a94a758c29e90Devang Patel
22837a6f7966c39f69a92419d37949a94a758c29e90Devang Patel    for (std::vector<Pass *>::iterator I = PassVector.begin(),
22937a6f7966c39f69a92419d37949a94a758c29e90Devang Patel           E = PassVector.end(); I != E; ++I)
23037a6f7966c39f69a92419d37949a94a758c29e90Devang Patel      delete *I;
23137a6f7966c39f69a92419d37949a94a758c29e90Devang Patel
23237a6f7966c39f69a92419d37949a94a758c29e90Devang Patel    PassVector.clear();
23337a6f7966c39f69a92419d37949a94a758c29e90Devang Patel  }
23437a6f7966c39f69a92419d37949a94a758c29e90Devang Patel
23585d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel  /// Return true IFF pass P's required analysis set does not required new
23685d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel  /// manager.
23785d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel  bool manageablePass(Pass *P);
23885d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel
23985d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel  /// Augment AvailableAnalysis by adding analysis made available by pass P.
240f32b4dd13e421b3ad4696f984cb2043ce64e19cbDevang Patel  void recordAvailableAnalysis(Pass *P);
24185d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel
24285d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel  /// Remove Analysis that is not preserved by the pass
24385d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel  void removeNotPreservedAnalysis(Pass *P);
24485d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel
24585d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel  /// Remove dead passes
2464eeea774ce1b24fa55c06aac31e02016d5dd77d6Devang Patel  void removeDeadPasses(Pass *P, std::string &Msg);
24785d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel
2484045af1175509c81d6a4708df233f0b1abe888fcDevang Patel  /// Add pass P into the PassVector. Update
249893a5a681585cdf3b5bfff7128ea522e8a47750aDevang Patel  /// AvailableAnalysis appropriately if ProcessAnalysis is true.
250a84b3025ca7d437d2eab22d7c3002c8d89c31858Chris Lattner  void addPassToManager(Pass *P, bool ProcessAnalysis = true);
251e253385b108cd946b1ac150302f246d3b218be77Devang Patel
252c17bbb6da7e17c06c1f0ae7baa2f151db0e966d9Devang Patel  /// Initialize available analysis information.
253cbfd29d0da5810949ba66701b91c1b954122077aDevang Patel  void initializeAnalysisInfo() {
254ef89c5594aaa5b97f303ba0de99940b79f2c0e0eDevang Patel    TransferLastUses.clear();
255c1d6e1fc9c3a47529f417026df652f466ce67851Devang Patel    AvailableAnalysis.clear();
256c1d6e1fc9c3a47529f417026df652f466ce67851Devang Patel  }
257c1d6e1fc9c3a47529f417026df652f466ce67851Devang Patel
258c17bbb6da7e17c06c1f0ae7baa2f151db0e966d9Devang Patel  /// Populate RequiredPasses with the analysis pass that are required by
259c17bbb6da7e17c06c1f0ae7baa2f151db0e966d9Devang Patel  /// pass P.
260c17bbb6da7e17c06c1f0ae7baa2f151db0e966d9Devang Patel  void collectRequiredAnalysisPasses(std::vector<Pass *> &RequiredPasses,
261c17bbb6da7e17c06c1f0ae7baa2f151db0e966d9Devang Patel                                     Pass *P);
262c17bbb6da7e17c06c1f0ae7baa2f151db0e966d9Devang Patel
263c17bbb6da7e17c06c1f0ae7baa2f151db0e966d9Devang Patel  /// All Required analyses should be available to the pass as it runs!  Here
264c17bbb6da7e17c06c1f0ae7baa2f151db0e966d9Devang Patel  /// we fill in the AnalysisImpls member of the pass so that it can
265c17bbb6da7e17c06c1f0ae7baa2f151db0e966d9Devang Patel  /// successfully use the getAnalysis() method to retrieve the
266c17bbb6da7e17c06c1f0ae7baa2f151db0e966d9Devang Patel  /// implementations it needs.
267c17bbb6da7e17c06c1f0ae7baa2f151db0e966d9Devang Patel  void initializeAnalysisImpl(Pass *P);
268b899eed1bc0a64f96fa7aff8d7c6f999cf85bdfeDevang Patel
26969867b511c732a7fac7301977bd6e880e46439f1Devang Patel  /// Find the pass that implements Analysis AID. If desired pass is not found
27069867b511c732a7fac7301977bd6e880e46439f1Devang Patel  /// then return NULL.
27169867b511c732a7fac7301977bd6e880e46439f1Devang Patel  Pass *findAnalysisPass(AnalysisID AID, bool Direction);
27269867b511c732a7fac7301977bd6e880e46439f1Devang Patel
273dc48f203cdc5a0b8f79d28bab6219161061fd73bDevang Patel  // Access toplevel manager
274dc48f203cdc5a0b8f79d28bab6219161061fd73bDevang Patel  PMTopLevelManager *getTopLevelManager() { return TPM; }
275dc48f203cdc5a0b8f79d28bab6219161061fd73bDevang Patel  void setTopLevelManager(PMTopLevelManager *T) { TPM = T; }
276dc48f203cdc5a0b8f79d28bab6219161061fd73bDevang Patel
277a52035a062edf9bfbf95c92c615219b647042c17Devang Patel  unsigned getDepth() const { return Depth; }
2784eeea774ce1b24fa55c06aac31e02016d5dd77d6Devang Patel
279a52035a062edf9bfbf95c92c615219b647042c17Devang Patel  // Print routines used by debug-pass
280a52035a062edf9bfbf95c92c615219b647042c17Devang Patel  void dumpLastUses(Pass *P, unsigned Offset) const;
281a52035a062edf9bfbf95c92c615219b647042c17Devang Patel  void dumpPassArguments() const;
282a52035a062edf9bfbf95c92c615219b647042c17Devang Patel  void dumpPassInfo(Pass *P,  std::string &Msg1, std::string &Msg2) const;
283017b5d969b12119a88463fe2451f20ca9214c4ffDevang Patel  void dumpAnalysisSetInfo(const char *Msg, Pass *P,
284a52035a062edf9bfbf95c92c615219b647042c17Devang Patel                           const std::vector<AnalysisID> &Set) const;
285ef89c5594aaa5b97f303ba0de99940b79f2c0e0eDevang Patel
286ef89c5594aaa5b97f303ba0de99940b79f2c0e0eDevang Patel  std::vector<Pass *>& getTransferredLastUses() {
287ef89c5594aaa5b97f303ba0de99940b79f2c0e0eDevang Patel    return TransferLastUses;
288ef89c5594aaa5b97f303ba0de99940b79f2c0e0eDevang Patel  }
289ef89c5594aaa5b97f303ba0de99940b79f2c0e0eDevang Patel
2901554c8545651350569f08dc7370189da1a7e5814Devang Patel  virtual unsigned getNumContainedPasses() {
2911554c8545651350569f08dc7370189da1a7e5814Devang Patel    return PassVector.size();
2921554c8545651350569f08dc7370189da1a7e5814Devang Patel  }
2931554c8545651350569f08dc7370189da1a7e5814Devang Patel
294e16634065021e36ae31f074f623a636924d6b8d1Devang Patelprotected:
295e16634065021e36ae31f074f623a636924d6b8d1Devang Patel
296ef89c5594aaa5b97f303ba0de99940b79f2c0e0eDevang Patel  // If a FunctionPass F is the last user of ModulePass info M
297e16634065021e36ae31f074f623a636924d6b8d1Devang Patel  // then the F's manager, not F, records itself as a last user of M.
298ef89c5594aaa5b97f303ba0de99940b79f2c0e0eDevang Patel  // Current pass manage is requesting parent manager to record parent
299ef89c5594aaa5b97f303ba0de99940b79f2c0e0eDevang Patel  // manager as the last user of these TrransferLastUses passes.
300ef89c5594aaa5b97f303ba0de99940b79f2c0e0eDevang Patel  std::vector<Pass *> TransferLastUses;
301e16634065021e36ae31f074f623a636924d6b8d1Devang Patel
302e16634065021e36ae31f074f623a636924d6b8d1Devang Patel  // Top level manager.
303e16634065021e36ae31f074f623a636924d6b8d1Devang Patel  PMTopLevelManager *TPM;
304e16634065021e36ae31f074f623a636924d6b8d1Devang Patel
3051554c8545651350569f08dc7370189da1a7e5814Devang Patel  // Collection of pass that are managed by this manager
3061554c8545651350569f08dc7370189da1a7e5814Devang Patel  std::vector<Pass *> PassVector;
3071554c8545651350569f08dc7370189da1a7e5814Devang Patel
30885d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patelprivate:
3095770c7cd52d6a3dfd9a5815cc9153d94afc6dd31Devang Patel  // Set of available Analysis. This information is used while scheduling
3105770c7cd52d6a3dfd9a5815cc9153d94afc6dd31Devang Patel  // pass. If a pass requires an analysis which is not not available then
3115770c7cd52d6a3dfd9a5815cc9153d94afc6dd31Devang Patel  // equired analysis pass is scheduled to run before the pass itself is
3125770c7cd52d6a3dfd9a5815cc9153d94afc6dd31Devang Patel  // scheduled to run.
313b899eed1bc0a64f96fa7aff8d7c6f999cf85bdfeDevang Patel  std::map<AnalysisID, Pass*> AvailableAnalysis;
314e253385b108cd946b1ac150302f246d3b218be77Devang Patel
315f72d29c540bf32b9c0e8914484cbbdeac70ee12aDevang Patel  unsigned Depth;
31685d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel};
31785d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel
3187e601a70fcaf0a3090368425bbb339aab038d3e3Devang Patel//===----------------------------------------------------------------------===//
3195f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel// BBPassManager
3207e601a70fcaf0a3090368425bbb339aab038d3e3Devang Patel//
3215f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel/// BBPassManager manages BasicBlockPass. It batches all the
322c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel/// pass together and sequence them to process one basic block before
323c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel/// processing next basic block.
3245f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patelclass VISIBILITY_HIDDEN BBPassManager : public PMDataManager,
3255f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel                                        public FunctionPass {
326c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
327c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patelpublic:
3285f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  BBPassManager(int Depth) : PMDataManager(Depth) { }
329c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
330c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// Add a pass into a passmanager queue.
331c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  bool addPass(Pass *p);
332c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
333c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// Execute all of the passes scheduled for execution.  Keep track of
334c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// whether any of the passes modifies the function, and if so, return true.
335c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  bool runOnFunction(Function &F);
336c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
33766d72e140bf7bdfe03383bfb4d3fe53a420d147bDevang Patel  /// Pass Manager itself does not invalidate any analysis info.
33866d72e140bf7bdfe03383bfb4d3fe53a420d147bDevang Patel  void getAnalysisUsage(AnalysisUsage &Info) const {
33966d72e140bf7bdfe03383bfb4d3fe53a420d147bDevang Patel    Info.setPreservesAll();
34066d72e140bf7bdfe03383bfb4d3fe53a420d147bDevang Patel  }
34166d72e140bf7bdfe03383bfb4d3fe53a420d147bDevang Patel
342964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel  bool doInitialization(Module &M);
343964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel  bool doInitialization(Function &F);
344964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel  bool doFinalization(Module &M);
345964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel  bool doFinalization(Function &F);
346964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel
347ebc0922eeb5b728d33a68d4bea8128413f62e369Devang Patel  // Print passes managed by this manager
348ebc0922eeb5b728d33a68d4bea8128413f62e369Devang Patel  void dumpPassStructure(unsigned Offset) {
349c2ff962bf97761a54c94d2dadb555060403d49c6Devang Patel    llvm::cerr << std::string(Offset*2, ' ') << "BasicBlockPass Manager\n";
3501554c8545651350569f08dc7370189da1a7e5814Devang Patel    for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
3511554c8545651350569f08dc7370189da1a7e5814Devang Patel      BasicBlockPass *BP = getContainedPass(Index);
3521554c8545651350569f08dc7370189da1a7e5814Devang Patel      BP->dumpPassStructure(Offset + 1);
3531554c8545651350569f08dc7370189da1a7e5814Devang Patel      dumpLastUses(BP, Offset+1);
354ebc0922eeb5b728d33a68d4bea8128413f62e369Devang Patel    }
355ebc0922eeb5b728d33a68d4bea8128413f62e369Devang Patel  }
3561554c8545651350569f08dc7370189da1a7e5814Devang Patel
3571554c8545651350569f08dc7370189da1a7e5814Devang Patel  BasicBlockPass *getContainedPass(unsigned N) {
3581554c8545651350569f08dc7370189da1a7e5814Devang Patel    assert ( N < PassVector.size() && "Pass number out of range!");
3591554c8545651350569f08dc7370189da1a7e5814Devang Patel    BasicBlockPass *BP = static_cast<BasicBlockPass *>(PassVector[N]);
3601554c8545651350569f08dc7370189da1a7e5814Devang Patel    return BP;
3611554c8545651350569f08dc7370189da1a7e5814Devang Patel  }
362c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel};
363c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
3647e601a70fcaf0a3090368425bbb339aab038d3e3Devang Patel//===----------------------------------------------------------------------===//
3655f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel// FPPassManager
3667e601a70fcaf0a3090368425bbb339aab038d3e3Devang Patel//
3675f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel/// FPPassManager manages BBPassManagers and FunctionPasses.
3685f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel/// It batches all function passes and basic block pass managers together and
3695f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel/// sequence them to process one function at a time before processing next
3705f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel/// function.
371145e83dc12a3f962b999f348474ebb07a36a7b81Devang Patel
3725f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patelclass FPPassManager : public ModulePass, public PMDataManager {
3735f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel
3745f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patelpublic:
3755f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  FPPassManager(int Depth) : PMDataManager(Depth) {
3765f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel    activeBBPassManager = NULL;
377877bfbb9ef75e7fe333d93abecaf0579780ccf54Devang Patel  }
3785f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel
3795f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  /// Add a pass into a passmanager queue.
3805f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  bool addPass(Pass *p);
3815f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel
3825f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  /// run - Execute all of the passes scheduled for execution.  Keep track of
3835f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  /// whether any of the passes modifies the module, and if so, return true.
384214ca23aef8bd408c4ee4ce28ba93d57d2416587Devang Patel  bool runOnFunction(Function &F);
3855f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  bool runOnModule(Module &M);
386c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
3873799f97d539f6c288d169063e1b335917fafcffbDevang Patel  /// doInitialization - Run all of the initializers for the function passes.
3883799f97d539f6c288d169063e1b335917fafcffbDevang Patel  ///
3893799f97d539f6c288d169063e1b335917fafcffbDevang Patel  bool doInitialization(Module &M);
3903799f97d539f6c288d169063e1b335917fafcffbDevang Patel
3913799f97d539f6c288d169063e1b335917fafcffbDevang Patel  /// doFinalization - Run all of the initializers for the function passes.
3923799f97d539f6c288d169063e1b335917fafcffbDevang Patel  ///
3933799f97d539f6c288d169063e1b335917fafcffbDevang Patel  bool doFinalization(Module &M);
39466d72e140bf7bdfe03383bfb4d3fe53a420d147bDevang Patel
39566d72e140bf7bdfe03383bfb4d3fe53a420d147bDevang Patel  /// Pass Manager itself does not invalidate any analysis info.
39666d72e140bf7bdfe03383bfb4d3fe53a420d147bDevang Patel  void getAnalysisUsage(AnalysisUsage &Info) const {
39766d72e140bf7bdfe03383bfb4d3fe53a420d147bDevang Patel    Info.setPreservesAll();
39866d72e140bf7bdfe03383bfb4d3fe53a420d147bDevang Patel  }
39966d72e140bf7bdfe03383bfb4d3fe53a420d147bDevang Patel
400ebc0922eeb5b728d33a68d4bea8128413f62e369Devang Patel  // Print passes managed by this manager
401ebc0922eeb5b728d33a68d4bea8128413f62e369Devang Patel  void dumpPassStructure(unsigned Offset) {
4025f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel    llvm::cerr << std::string(Offset*2, ' ') << "FunctionPass Manager\n";
4031554c8545651350569f08dc7370189da1a7e5814Devang Patel    for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
4041554c8545651350569f08dc7370189da1a7e5814Devang Patel      FunctionPass *FP = getContainedPass(Index);
4051554c8545651350569f08dc7370189da1a7e5814Devang Patel      FP->dumpPassStructure(Offset + 1);
4061554c8545651350569f08dc7370189da1a7e5814Devang Patel      dumpLastUses(FP, Offset+1);
407ebc0922eeb5b728d33a68d4bea8128413f62e369Devang Patel    }
408ebc0922eeb5b728d33a68d4bea8128413f62e369Devang Patel  }
409ebc0922eeb5b728d33a68d4bea8128413f62e369Devang Patel
4101554c8545651350569f08dc7370189da1a7e5814Devang Patel  FunctionPass *getContainedPass(unsigned N) {
4111554c8545651350569f08dc7370189da1a7e5814Devang Patel    assert ( N < PassVector.size() && "Pass number out of range!");
4121554c8545651350569f08dc7370189da1a7e5814Devang Patel    FunctionPass *FP = static_cast<FunctionPass *>(PassVector[N]);
4131554c8545651350569f08dc7370189da1a7e5814Devang Patel    return FP;
4141554c8545651350569f08dc7370189da1a7e5814Devang Patel  }
4151554c8545651350569f08dc7370189da1a7e5814Devang Patel
416c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patelprivate:
4175f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  // Active Pass Manager
4185f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  BBPassManager *activeBBPassManager;
4195f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel};
4205f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel
4215f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel//===----------------------------------------------------------------------===//
4225f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel// FunctionPassManagerImpl
4235f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel//
4245f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel/// FunctionPassManagerImpl manages FPPassManagers
4255f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patelclass FunctionPassManagerImpl : public Pass,
4265f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel                                    public PMDataManager,
4275f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel                                    public PMTopLevelManager {
4285f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel
4295f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patelpublic:
4305f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel
4315f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  FunctionPassManagerImpl(int Depth) : PMDataManager(Depth) {
4325f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel    activeManager = NULL;
4335f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  }
4345f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel
4355f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  /// add - Add a pass to the queue of passes to run.  This passes ownership of
4365f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  /// the Pass to the PassManager.  When the PassManager is destroyed, the pass
4375f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  /// will be destroyed as well, so there is no need to delete the pass.  This
4385f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  /// implies that all passes MUST be allocated with 'new'.
4395f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  void add(Pass *P) {
4405f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel    schedulePass(P);
4415f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  }
4425f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel
4435f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  /// run - Execute all of the passes scheduled for execution.  Keep track of
4445f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  /// whether any of the passes modifies the module, and if so, return true.
4455f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  bool run(Function &F);
4465f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel
4475f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  /// doInitialization - Run all of the initializers for the function passes.
4485f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  ///
4495f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  bool doInitialization(Module &M);
4505f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel
4515f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  /// doFinalization - Run all of the initializers for the function passes.
4525f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  ///
4535f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  bool doFinalization(Module &M);
4545f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel
4555f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  /// Pass Manager itself does not invalidate any analysis info.
4565f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  void getAnalysisUsage(AnalysisUsage &Info) const {
4575f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel    Info.setPreservesAll();
4585f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  }
4595f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel
4605f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  inline void addTopLevelPass(Pass *P) {
4615f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel
4625f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel    if (ImmutablePass *IP = dynamic_cast<ImmutablePass *> (P)) {
4635f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel
4645f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel      // P is a immutable pass and it will be managed by this
4655f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel      // top level manager. Set up analysis resolver to connect them.
466cde53d3c1e9d6a2add5de847b44818fbb1d69c20Devang Patel      AnalysisResolver *AR = new AnalysisResolver(*this);
4675f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel      P->setResolver(AR);
4685f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel      initializeAnalysisImpl(P);
4695f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel      addImmutablePass(IP);
4705f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel      recordAvailableAnalysis(IP);
4715f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel    }
4725f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel    else
4735f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel      addPass(P);
4745f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  }
4755f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel
4765f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  FPPassManager *getContainedManager(unsigned N) {
4775f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel    assert ( N < PassManagers.size() && "Pass number out of range!");
4785f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel    FPPassManager *FP = static_cast<FPPassManager *>(PassManagers[N]);
4795f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel    return FP;
4805f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  }
4815f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel
4825f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  /// Add a pass into a passmanager queue.
4835f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  bool addPass(Pass *p);
4845f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel
4855f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patelprivate:
4865f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel
4875f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  // Active Pass Manager
4885f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  FPPassManager *activeManager;
489c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel};
490c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
4917e601a70fcaf0a3090368425bbb339aab038d3e3Devang Patel//===----------------------------------------------------------------------===//
4925f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel// MPPassManager
4937e601a70fcaf0a3090368425bbb339aab038d3e3Devang Patel//
4945f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel/// MPPassManager manages ModulePasses and function pass managers.
495c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel/// It batches all Module passes  passes and function pass managers together and
496c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel/// sequence them to process one module.
4975f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patelclass MPPassManager : public Pass, public PMDataManager {
498c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
499c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patelpublic:
5005f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  MPPassManager(int Depth) : PMDataManager(Depth) {
501f72d29c540bf32b9c0e8914484cbbdeac70ee12aDevang Patel    activeFunctionPassManager = NULL;
502f72d29c540bf32b9c0e8914484cbbdeac70ee12aDevang Patel  }
503c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
504c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// Add a pass into a passmanager queue.
505c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  bool addPass(Pass *p);
506c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
507c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// run - Execute all of the passes scheduled for execution.  Keep track of
508c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// whether any of the passes modifies the module, and if so, return true.
509c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  bool runOnModule(Module &M);
510be6d515f481756ff549f355e32be1ac398e141d5Devang Patel
51166d72e140bf7bdfe03383bfb4d3fe53a420d147bDevang Patel  /// Pass Manager itself does not invalidate any analysis info.
51266d72e140bf7bdfe03383bfb4d3fe53a420d147bDevang Patel  void getAnalysisUsage(AnalysisUsage &Info) const {
51366d72e140bf7bdfe03383bfb4d3fe53a420d147bDevang Patel    Info.setPreservesAll();
51466d72e140bf7bdfe03383bfb4d3fe53a420d147bDevang Patel  }
51566d72e140bf7bdfe03383bfb4d3fe53a420d147bDevang Patel
516ebc0922eeb5b728d33a68d4bea8128413f62e369Devang Patel  // Print passes managed by this manager
517ebc0922eeb5b728d33a68d4bea8128413f62e369Devang Patel  void dumpPassStructure(unsigned Offset) {
518ebc0922eeb5b728d33a68d4bea8128413f62e369Devang Patel    llvm::cerr << std::string(Offset*2, ' ') << "ModulePass Manager\n";
5191554c8545651350569f08dc7370189da1a7e5814Devang Patel    for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
5201554c8545651350569f08dc7370189da1a7e5814Devang Patel      ModulePass *MP = getContainedPass(Index);
5211554c8545651350569f08dc7370189da1a7e5814Devang Patel      MP->dumpPassStructure(Offset + 1);
5221554c8545651350569f08dc7370189da1a7e5814Devang Patel      dumpLastUses(MP, Offset+1);
523ebc0922eeb5b728d33a68d4bea8128413f62e369Devang Patel    }
524ebc0922eeb5b728d33a68d4bea8128413f62e369Devang Patel  }
525ebc0922eeb5b728d33a68d4bea8128413f62e369Devang Patel
5261554c8545651350569f08dc7370189da1a7e5814Devang Patel  ModulePass *getContainedPass(unsigned N) {
5271554c8545651350569f08dc7370189da1a7e5814Devang Patel    assert ( N < PassVector.size() && "Pass number out of range!");
5281554c8545651350569f08dc7370189da1a7e5814Devang Patel    ModulePass *MP = static_cast<ModulePass *>(PassVector[N]);
5291554c8545651350569f08dc7370189da1a7e5814Devang Patel    return MP;
5301554c8545651350569f08dc7370189da1a7e5814Devang Patel  }
5311554c8545651350569f08dc7370189da1a7e5814Devang Patel
532c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patelprivate:
533c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  // Active Pass Manager
5345f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  FPPassManager *activeFunctionPassManager;
535c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel};
536c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
5377e601a70fcaf0a3090368425bbb339aab038d3e3Devang Patel//===----------------------------------------------------------------------===//
5385f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel// PassManagerImpl
5397e601a70fcaf0a3090368425bbb339aab038d3e3Devang Patel//
5405f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel/// PassManagerImpl manages MPPassManagers
5415f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patelclass PassManagerImpl : public Pass,
542877bfbb9ef75e7fe333d93abecaf0579780ccf54Devang Patel                            public PMDataManager,
543eb0d613ef6755f93610e08534a203c41ec14b56aDevang Patel                            public PMTopLevelManager {
5445a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
5455a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patelpublic:
5465a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
5475f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  PassManagerImpl(int Depth) : PMDataManager(Depth) {
548395ed739849a0507a2faae0829287c039c3589f8Devang Patel    activeManager = NULL;
549395ed739849a0507a2faae0829287c039c3589f8Devang Patel  }
550f72d29c540bf32b9c0e8914484cbbdeac70ee12aDevang Patel
5515a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  /// add - Add a pass to the queue of passes to run.  This passes ownership of
5525a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  /// the Pass to the PassManager.  When the PassManager is destroyed, the pass
5535a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  /// will be destroyed as well, so there is no need to delete the pass.  This
5545a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  /// implies that all passes MUST be allocated with 'new'.
555877bfbb9ef75e7fe333d93abecaf0579780ccf54Devang Patel  void add(Pass *P) {
556e61b7478e53cea3183d4aee3799a4f0977b850a0Devang Patel    schedulePass(P);
557877bfbb9ef75e7fe333d93abecaf0579780ccf54Devang Patel  }
5585a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
5595a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  /// run - Execute all of the passes scheduled for execution.  Keep track of
5605a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  /// whether any of the passes modifies the module, and if so, return true.
5615a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  bool run(Module &M);
5625a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
56366d72e140bf7bdfe03383bfb4d3fe53a420d147bDevang Patel  /// Pass Manager itself does not invalidate any analysis info.
56466d72e140bf7bdfe03383bfb4d3fe53a420d147bDevang Patel  void getAnalysisUsage(AnalysisUsage &Info) const {
56566d72e140bf7bdfe03383bfb4d3fe53a420d147bDevang Patel    Info.setPreservesAll();
56666d72e140bf7bdfe03383bfb4d3fe53a420d147bDevang Patel  }
56766d72e140bf7bdfe03383bfb4d3fe53a420d147bDevang Patel
568eb0d613ef6755f93610e08534a203c41ec14b56aDevang Patel  inline void addTopLevelPass(Pass *P) {
569145e83dc12a3f962b999f348474ebb07a36a7b81Devang Patel
570c9a6293af7b433146d8f7ecf8fa494b530af9376Devang Patel    if (ImmutablePass *IP = dynamic_cast<ImmutablePass *> (P)) {
571145e83dc12a3f962b999f348474ebb07a36a7b81Devang Patel
572145e83dc12a3f962b999f348474ebb07a36a7b81Devang Patel      // P is a immutable pass and it will be managed by this
573145e83dc12a3f962b999f348474ebb07a36a7b81Devang Patel      // top level manager. Set up analysis resolver to connect them.
574cde53d3c1e9d6a2add5de847b44818fbb1d69c20Devang Patel      AnalysisResolver *AR = new AnalysisResolver(*this);
575145e83dc12a3f962b999f348474ebb07a36a7b81Devang Patel      P->setResolver(AR);
576689c683bccbb28b4d18a3dbe1b1c28ee6b90b17aDevang Patel      initializeAnalysisImpl(P);
577c9a6293af7b433146d8f7ecf8fa494b530af9376Devang Patel      addImmutablePass(IP);
578689c683bccbb28b4d18a3dbe1b1c28ee6b90b17aDevang Patel      recordAvailableAnalysis(IP);
579145e83dc12a3f962b999f348474ebb07a36a7b81Devang Patel    }
580c9a6293af7b433146d8f7ecf8fa494b530af9376Devang Patel    else
581c9a6293af7b433146d8f7ecf8fa494b530af9376Devang Patel      addPass(P);
582eb0d613ef6755f93610e08534a203c41ec14b56aDevang Patel  }
583eb0d613ef6755f93610e08534a203c41ec14b56aDevang Patel
5845f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  MPPassManager *getContainedManager(unsigned N) {
5855f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel    assert ( N < PassManagers.size() && "Pass number out of range!");
5865f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel    MPPassManager *MP = static_cast<MPPassManager *>(PassManagers[N]);
5875f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel    return MP;
5885f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  }
5895f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel
5905a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patelprivate:
5915a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
5921209f416cf2f2ec0f335d91a7c115e3b0a37d603Devang Patel  /// Add a pass into a passmanager queue.
5935a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  bool addPass(Pass *p);
5945a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
5955a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  // Active Pass Manager
5965f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  MPPassManager *activeManager;
5975a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel};
5985a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
599c2ff962bf97761a54c94d2dadb555060403d49c6Devang Patel} // End of llvm namespace
600c2ff962bf97761a54c94d2dadb555060403d49c6Devang Patel
601c2ff962bf97761a54c94d2dadb555060403d49c6Devang Patelnamespace {
602c2ff962bf97761a54c94d2dadb555060403d49c6Devang Patel
6038e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel//===----------------------------------------------------------------------===//
6048e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel// TimingInfo Class - This class is used to calculate information about the
6058e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel// amount of time each pass takes to execute.  This only happens when
6068e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel// -time-passes is enabled on the command line.
6078e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel//
6088e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel
609c2ff962bf97761a54c94d2dadb555060403d49c6Devang Patelclass VISIBILITY_HIDDEN TimingInfo {
6108e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel  std::map<Pass*, Timer> TimingData;
6118e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel  TimerGroup TG;
6128e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel
6138e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patelpublic:
6148e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel  // Use 'create' member to get this.
6158e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel  TimingInfo() : TG("... Pass execution timing report ...") {}
6168e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel
6178e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel  // TimingDtor - Print out information about timing information
6188e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel  ~TimingInfo() {
6198e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel    // Delete all of the timers...
6208e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel    TimingData.clear();
6218e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel    // TimerGroup is deleted next, printing the report.
6228e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel  }
6238e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel
6248e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel  // createTheTimeInfo - This method either initializes the TheTimeInfo pointer
6258e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel  // to a non null value (if the -time-passes option is enabled) or it leaves it
6268e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel  // null.  It may be called multiple times.
6278e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel  static void createTheTimeInfo();
6288e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel
6298e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel  void passStarted(Pass *P) {
6308e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel
6318e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel    if (dynamic_cast<PMDataManager *>(P))
6328e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel      return;
6338e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel
6348e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel    std::map<Pass*, Timer>::iterator I = TimingData.find(P);
6358e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel    if (I == TimingData.end())
6368e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel      I=TimingData.insert(std::make_pair(P, Timer(P->getPassName(), TG))).first;
6378e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel    I->second.startTimer();
6388e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel  }
6398e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel  void passEnded(Pass *P) {
6408e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel
6418e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel    if (dynamic_cast<PMDataManager *>(P))
6428e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel      return;
6438e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel
6448e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel    std::map<Pass*, Timer>::iterator I = TimingData.find(P);
6458e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel    assert (I != TimingData.end() && "passStarted/passEnded not nested right!");
6468e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel    I->second.stopTimer();
6478e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel  }
6488e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel};
6498e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel
6508e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patelstatic TimingInfo *TheTimeInfo;
6518e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel
652c2ff962bf97761a54c94d2dadb555060403d49c6Devang Patel} // End of anon namespace
653c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
65406e86561a5261a59f5c391d5cc5cb4aa38dca83cDevang Patel//===----------------------------------------------------------------------===//
6551b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel// PMTopLevelManager implementation
6561b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel
6571b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel/// Set pass P as the last user of the given analysis passes.
6581b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patelvoid PMTopLevelManager::setLastUser(std::vector<Pass *> &AnalysisPasses,
6591b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel                                    Pass *P) {
6601b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel
6611b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel  for (std::vector<Pass *>::iterator I = AnalysisPasses.begin(),
6621b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel         E = AnalysisPasses.end(); I != E; ++I) {
6631b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel    Pass *AP = *I;
6641b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel    LastUser[AP] = P;
6651b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel    // If AP is the last user of other passes then make P last user of
6661b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel    // such passes.
6671b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel    for (std::map<Pass *, Pass *>::iterator LUI = LastUser.begin(),
6681b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel           LUE = LastUser.end(); LUI != LUE; ++LUI) {
6691b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel      if (LUI->second == AP)
6701b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel        LastUser[LUI->first] = P;
6711b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel    }
6721b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel  }
6731b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel}
6741b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel
6751b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel/// Collect passes whose last user is P
6761b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patelvoid PMTopLevelManager::collectLastUses(std::vector<Pass *> &LastUses,
6771b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel                                            Pass *P) {
6781b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel   for (std::map<Pass *, Pass *>::iterator LUI = LastUser.begin(),
6791b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel          LUE = LastUser.end(); LUI != LUE; ++LUI)
6801b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel      if (LUI->second == P)
6811b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel        LastUses.push_back(LUI->first);
6821b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel}
6831b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel
6841b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel/// Schedule pass P for execution. Make sure that passes required by
6851b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel/// P are run before P is run. Update analysis info maintained by
6861b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel/// the manager. Remove dead passes. This is a recursive function.
6871b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patelvoid PMTopLevelManager::schedulePass(Pass *P) {
6881b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel
6891b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel  // TODO : Allocate function manager for this pass, other wise required set
6901b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel  // may be inserted into previous function manager
6911b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel
6921b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel  AnalysisUsage AnUsage;
6931b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel  P->getAnalysisUsage(AnUsage);
6941b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel  const std::vector<AnalysisID> &RequiredSet = AnUsage.getRequiredSet();
6951b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel  for (std::vector<AnalysisID>::const_iterator I = RequiredSet.begin(),
6961b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel         E = RequiredSet.end(); I != E; ++I) {
6971b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel
6981b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel    Pass *AnalysisPass = findAnalysisPass(*I);
6991b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel    if (!AnalysisPass) {
7001b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel      // Schedule this analysis run first.
7011b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel      AnalysisPass = (*I)->createPass();
7021b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel      schedulePass(AnalysisPass);
7031b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel    }
7041b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel  }
7051b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel
7061b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel  // Now all required passes are available.
7071b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel  addTopLevelPass(P);
7081b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel}
7091b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel
7101b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel/// Find the pass that implements Analysis AID. Search immutable
7111b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel/// passes and all pass managers. If desired pass is not found
7121b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel/// then return NULL.
7131b8d015066dca364a1b11b6dbe5b80248b111cd5Devang PatelPass *PMTopLevelManager::findAnalysisPass(AnalysisID AID) {
7141b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel
7151b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel  Pass *P = NULL;
716d0fa16c33615bb6f21685c4e4e3d948ac6780160Devang Patel  // Check pass managers
717d0fa16c33615bb6f21685c4e4e3d948ac6780160Devang Patel  for (std::vector<Pass *>::iterator I = PassManagers.begin(),
718d0fa16c33615bb6f21685c4e4e3d948ac6780160Devang Patel         E = PassManagers.end(); P == NULL && I != E; ++I) {
719d0fa16c33615bb6f21685c4e4e3d948ac6780160Devang Patel    PMDataManager *PMD = dynamic_cast<PMDataManager *>(*I);
720d0fa16c33615bb6f21685c4e4e3d948ac6780160Devang Patel    assert(PMD && "This is not a PassManager");
721d0fa16c33615bb6f21685c4e4e3d948ac6780160Devang Patel    P = PMD->findAnalysisPass(AID, false);
722d0fa16c33615bb6f21685c4e4e3d948ac6780160Devang Patel  }
723d0fa16c33615bb6f21685c4e4e3d948ac6780160Devang Patel
724d0fa16c33615bb6f21685c4e4e3d948ac6780160Devang Patel  // Check other pass managers
725d0fa16c33615bb6f21685c4e4e3d948ac6780160Devang Patel  for (std::vector<PMDataManager *>::iterator I = IndirectPassManagers.begin(),
726d0fa16c33615bb6f21685c4e4e3d948ac6780160Devang Patel         E = IndirectPassManagers.end(); P == NULL && I != E; ++I)
727d0fa16c33615bb6f21685c4e4e3d948ac6780160Devang Patel    P = (*I)->findAnalysisPass(AID, false);
728d0fa16c33615bb6f21685c4e4e3d948ac6780160Devang Patel
7291b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel  for (std::vector<ImmutablePass *>::iterator I = ImmutablePasses.begin(),
7301b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel         E = ImmutablePasses.end(); P == NULL && I != E; ++I) {
7311b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel    const PassInfo *PI = (*I)->getPassInfo();
7321b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel    if (PI == AID)
7331b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel      P = *I;
7341b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel
7351b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel    // If Pass not found then check the interfaces implemented by Immutable Pass
7361b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel    if (!P) {
7371a8038636c2998e37f2130b0ab89a3686d9c1f48Devang Patel      const std::vector<const PassInfo*> &ImmPI = PI->getInterfacesImplemented();
7381a8038636c2998e37f2130b0ab89a3686d9c1f48Devang Patel      if (std::find(ImmPI.begin(), ImmPI.end(), AID) != ImmPI.end())
7391a8038636c2998e37f2130b0ab89a3686d9c1f48Devang Patel        P = *I;
7401b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel    }
7411b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel  }
7421b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel
7431b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel  return P;
7441b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel}
7451b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel
746ebc0922eeb5b728d33a68d4bea8128413f62e369Devang Patel// Print passes managed by this top level manager.
747a52035a062edf9bfbf95c92c615219b647042c17Devang Patelvoid PMTopLevelManager::dumpPasses() const {
748ebc0922eeb5b728d33a68d4bea8128413f62e369Devang Patel
7495f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  if (PassDebugging_New < Structure)
7505f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel    return;
7515f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel
752ebc0922eeb5b728d33a68d4bea8128413f62e369Devang Patel  // Print out the immutable passes
753ebc0922eeb5b728d33a68d4bea8128413f62e369Devang Patel  for (unsigned i = 0, e = ImmutablePasses.size(); i != e; ++i) {
754ebc0922eeb5b728d33a68d4bea8128413f62e369Devang Patel    ImmutablePasses[i]->dumpPassStructure(0);
755ebc0922eeb5b728d33a68d4bea8128413f62e369Devang Patel  }
756ebc0922eeb5b728d33a68d4bea8128413f62e369Devang Patel
757a52035a062edf9bfbf95c92c615219b647042c17Devang Patel  for (std::vector<Pass *>::const_iterator I = PassManagers.begin(),
758ebc0922eeb5b728d33a68d4bea8128413f62e369Devang Patel         E = PassManagers.end(); I != E; ++I)
759ebc0922eeb5b728d33a68d4bea8128413f62e369Devang Patel    (*I)->dumpPassStructure(1);
760ebc0922eeb5b728d33a68d4bea8128413f62e369Devang Patel}
761ebc0922eeb5b728d33a68d4bea8128413f62e369Devang Patel
762a52035a062edf9bfbf95c92c615219b647042c17Devang Patelvoid PMTopLevelManager::dumpArguments() const {
763c32cf54101ecaf336d161fecd58667870149169cDevang Patel
764c32cf54101ecaf336d161fecd58667870149169cDevang Patel  if (PassDebugging_New < Arguments)
765c32cf54101ecaf336d161fecd58667870149169cDevang Patel    return;
766c32cf54101ecaf336d161fecd58667870149169cDevang Patel
767c32cf54101ecaf336d161fecd58667870149169cDevang Patel  cerr << "Pass Arguments: ";
768a52035a062edf9bfbf95c92c615219b647042c17Devang Patel  for (std::vector<Pass *>::const_iterator I = PassManagers.begin(),
769c32cf54101ecaf336d161fecd58667870149169cDevang Patel         E = PassManagers.end(); I != E; ++I) {
770c32cf54101ecaf336d161fecd58667870149169cDevang Patel    PMDataManager *PMD = dynamic_cast<PMDataManager *>(*I);
771c32cf54101ecaf336d161fecd58667870149169cDevang Patel    assert(PMD && "This is not a PassManager");
772c32cf54101ecaf336d161fecd58667870149169cDevang Patel    PMD->dumpPassArguments();
773c32cf54101ecaf336d161fecd58667870149169cDevang Patel  }
774c32cf54101ecaf336d161fecd58667870149169cDevang Patel  cerr << "\n";
775c32cf54101ecaf336d161fecd58667870149169cDevang Patel}
776c32cf54101ecaf336d161fecd58667870149169cDevang Patel
7771336a6bf06e64a096217628d2cc9644e48a5d7d6Devang Patelvoid PMTopLevelManager::initializeAllAnalysisInfo() {
7781336a6bf06e64a096217628d2cc9644e48a5d7d6Devang Patel
7791336a6bf06e64a096217628d2cc9644e48a5d7d6Devang Patel  for (std::vector<Pass *>::iterator I = PassManagers.begin(),
7801336a6bf06e64a096217628d2cc9644e48a5d7d6Devang Patel         E = PassManagers.end(); I != E; ++I) {
7811336a6bf06e64a096217628d2cc9644e48a5d7d6Devang Patel    PMDataManager *PMD = dynamic_cast<PMDataManager *>(*I);
7821336a6bf06e64a096217628d2cc9644e48a5d7d6Devang Patel    assert(PMD && "This is not a PassManager");
7831336a6bf06e64a096217628d2cc9644e48a5d7d6Devang Patel    PMD->initializeAnalysisInfo();
7841336a6bf06e64a096217628d2cc9644e48a5d7d6Devang Patel  }
7851336a6bf06e64a096217628d2cc9644e48a5d7d6Devang Patel
7861336a6bf06e64a096217628d2cc9644e48a5d7d6Devang Patel  // Initailize other pass managers
7871336a6bf06e64a096217628d2cc9644e48a5d7d6Devang Patel  for (std::vector<PMDataManager *>::iterator I = IndirectPassManagers.begin(),
7881336a6bf06e64a096217628d2cc9644e48a5d7d6Devang Patel         E = IndirectPassManagers.end(); I != E; ++I)
7891336a6bf06e64a096217628d2cc9644e48a5d7d6Devang Patel    (*I)->initializeAnalysisInfo();
7901336a6bf06e64a096217628d2cc9644e48a5d7d6Devang Patel}
7911336a6bf06e64a096217628d2cc9644e48a5d7d6Devang Patel
7921b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel//===----------------------------------------------------------------------===//
793419f0e95d698109541ad730cb45ba4caca78f458Devang Patel// PMDataManager implementation
794889739c4d188d28c167644bced9df0f3131317d7Devang Patel
7952c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel/// Return true IFF pass P's required analysis set does not required new
796889739c4d188d28c167644bced9df0f3131317d7Devang Patel/// manager.
797419f0e95d698109541ad730cb45ba4caca78f458Devang Patelbool PMDataManager::manageablePass(Pass *P) {
798889739c4d188d28c167644bced9df0f3131317d7Devang Patel
7994045af1175509c81d6a4708df233f0b1abe888fcDevang Patel  // TODO
8004045af1175509c81d6a4708df233f0b1abe888fcDevang Patel  // If this pass is not preserving information that is required by a
8014045af1175509c81d6a4708df233f0b1abe888fcDevang Patel  // pass maintained by higher level pass manager then do not insert
8024045af1175509c81d6a4708df233f0b1abe888fcDevang Patel  // this pass into current manager. Use new manager. For example,
8034045af1175509c81d6a4708df233f0b1abe888fcDevang Patel  // For example, If FunctionPass F is not preserving ModulePass Info M1
8044045af1175509c81d6a4708df233f0b1abe888fcDevang Patel  // that is used by another ModulePass M2 then do not insert F in
8054045af1175509c81d6a4708df233f0b1abe888fcDevang Patel  // current function pass manager.
806889739c4d188d28c167644bced9df0f3131317d7Devang Patel  return true;
807889739c4d188d28c167644bced9df0f3131317d7Devang Patel}
808889739c4d188d28c167644bced9df0f3131317d7Devang Patel
809b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel/// Augement AvailableAnalysis by adding analysis made available by pass P.
810f32b4dd13e421b3ad4696f984cb2043ce64e19cbDevang Patelvoid PMDataManager::recordAvailableAnalysis(Pass *P) {
811b899eed1bc0a64f96fa7aff8d7c6f999cf85bdfeDevang Patel
812b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel  if (const PassInfo *PI = P->getPassInfo()) {
813b899eed1bc0a64f96fa7aff8d7c6f999cf85bdfeDevang Patel    AvailableAnalysis[PI] = P;
814b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel
815f32b4dd13e421b3ad4696f984cb2043ce64e19cbDevang Patel    //This pass is the current implementation of all of the interfaces it
816f32b4dd13e421b3ad4696f984cb2043ce64e19cbDevang Patel    //implements as well.
817f32b4dd13e421b3ad4696f984cb2043ce64e19cbDevang Patel    const std::vector<const PassInfo*> &II = PI->getInterfacesImplemented();
818f32b4dd13e421b3ad4696f984cb2043ce64e19cbDevang Patel    for (unsigned i = 0, e = II.size(); i != e; ++i)
819f32b4dd13e421b3ad4696f984cb2043ce64e19cbDevang Patel      AvailableAnalysis[II[i]] = P;
820b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel  }
821b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel}
822b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel
823889739c4d188d28c167644bced9df0f3131317d7Devang Patel/// Remove Analyss not preserved by Pass P
824419f0e95d698109541ad730cb45ba4caca78f458Devang Patelvoid PMDataManager::removeNotPreservedAnalysis(Pass *P) {
82514d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel  AnalysisUsage AnUsage;
82614d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel  P->getAnalysisUsage(AnUsage);
82714d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel
82804b4e0595ffffab232a73a78d742e08efb6ebcfbDevang Patel  if (AnUsage.getPreservesAll())
82904b4e0595ffffab232a73a78d742e08efb6ebcfbDevang Patel    return;
83004b4e0595ffffab232a73a78d742e08efb6ebcfbDevang Patel
83104b4e0595ffffab232a73a78d742e08efb6ebcfbDevang Patel  const std::vector<AnalysisID> &PreservedSet = AnUsage.getPreservedSet();
832b899eed1bc0a64f96fa7aff8d7c6f999cf85bdfeDevang Patel  for (std::map<AnalysisID, Pass*>::iterator I = AvailableAnalysis.begin(),
83354e247d2d0c07544b3e638e80b816f352ec152c1Devang Patel         E = AvailableAnalysis.end(); I != E; ) {
8341a8038636c2998e37f2130b0ab89a3686d9c1f48Devang Patel    std::map<AnalysisID, Pass*>::iterator Info = I++;
8351a8038636c2998e37f2130b0ab89a3686d9c1f48Devang Patel    if (std::find(PreservedSet.begin(), PreservedSet.end(), Info->first) ==
83614d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel        PreservedSet.end()) {
83714d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel      // Remove this analysis
8381a8038636c2998e37f2130b0ab89a3686d9c1f48Devang Patel      if (!dynamic_cast<ImmutablePass*>(Info->second))
8391a8038636c2998e37f2130b0ab89a3686d9c1f48Devang Patel        AvailableAnalysis.erase(Info);
8401a8038636c2998e37f2130b0ab89a3686d9c1f48Devang Patel    }
84114d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel  }
842889739c4d188d28c167644bced9df0f3131317d7Devang Patel}
843889739c4d188d28c167644bced9df0f3131317d7Devang Patel
844df1a10ece6a75f230d98c6fb001349eede90387aDevang Patel/// Remove analysis passes that are not used any longer
8454eeea774ce1b24fa55c06aac31e02016d5dd77d6Devang Patelvoid PMDataManager::removeDeadPasses(Pass *P, std::string &Msg) {
846f9a60ae75d6fdc74160085323c14e92e7d3517d3Devang Patel
847f9a60ae75d6fdc74160085323c14e92e7d3517d3Devang Patel  std::vector<Pass *> DeadPasses;
848f9a60ae75d6fdc74160085323c14e92e7d3517d3Devang Patel  TPM->collectLastUses(DeadPasses, P);
849f9a60ae75d6fdc74160085323c14e92e7d3517d3Devang Patel
850f9a60ae75d6fdc74160085323c14e92e7d3517d3Devang Patel  for (std::vector<Pass *>::iterator I = DeadPasses.begin(),
851f9a60ae75d6fdc74160085323c14e92e7d3517d3Devang Patel         E = DeadPasses.end(); I != E; ++I) {
8524eeea774ce1b24fa55c06aac31e02016d5dd77d6Devang Patel
8534eeea774ce1b24fa55c06aac31e02016d5dd77d6Devang Patel    std::string Msg1 = "  Freeing Pass '";
8544eeea774ce1b24fa55c06aac31e02016d5dd77d6Devang Patel    dumpPassInfo(*I, Msg1, Msg);
8554eeea774ce1b24fa55c06aac31e02016d5dd77d6Devang Patel
8568e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel    if (TheTimeInfo) TheTimeInfo->passStarted(P);
857f9a60ae75d6fdc74160085323c14e92e7d3517d3Devang Patel    (*I)->releaseMemory();
8588e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel    if (TheTimeInfo) TheTimeInfo->passEnded(P);
8598e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel
860f9a60ae75d6fdc74160085323c14e92e7d3517d3Devang Patel    std::map<AnalysisID, Pass*>::iterator Pos =
861f9a60ae75d6fdc74160085323c14e92e7d3517d3Devang Patel      AvailableAnalysis.find((*I)->getPassInfo());
862f9a60ae75d6fdc74160085323c14e92e7d3517d3Devang Patel
863964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel    // It is possible that pass is already removed from the AvailableAnalysis
864f9a60ae75d6fdc74160085323c14e92e7d3517d3Devang Patel    if (Pos != AvailableAnalysis.end())
865f9a60ae75d6fdc74160085323c14e92e7d3517d3Devang Patel      AvailableAnalysis.erase(Pos);
866f9a60ae75d6fdc74160085323c14e92e7d3517d3Devang Patel  }
867df1a10ece6a75f230d98c6fb001349eede90387aDevang Patel}
868df1a10ece6a75f230d98c6fb001349eede90387aDevang Patel
8694045af1175509c81d6a4708df233f0b1abe888fcDevang Patel/// Add pass P into the PassVector. Update
870893a5a681585cdf3b5bfff7128ea522e8a47750aDevang Patel/// AvailableAnalysis appropriately if ProcessAnalysis is true.
87104b4e0595ffffab232a73a78d742e08efb6ebcfbDevang Patelvoid PMDataManager::addPassToManager(Pass *P,
87204b4e0595ffffab232a73a78d742e08efb6ebcfbDevang Patel                                     bool ProcessAnalysis) {
873e253385b108cd946b1ac150302f246d3b218be77Devang Patel
874145e83dc12a3f962b999f348474ebb07a36a7b81Devang Patel  // This manager is going to manage pass P. Set up analysis resolver
875145e83dc12a3f962b999f348474ebb07a36a7b81Devang Patel  // to connect them.
876cde53d3c1e9d6a2add5de847b44818fbb1d69c20Devang Patel  AnalysisResolver *AR = new AnalysisResolver(*this);
877145e83dc12a3f962b999f348474ebb07a36a7b81Devang Patel  P->setResolver(AR);
878145e83dc12a3f962b999f348474ebb07a36a7b81Devang Patel
879893a5a681585cdf3b5bfff7128ea522e8a47750aDevang Patel  if (ProcessAnalysis) {
880e16634065021e36ae31f074f623a636924d6b8d1Devang Patel
881e16634065021e36ae31f074f623a636924d6b8d1Devang Patel    // At the moment, this pass is the last user of all required passes.
882e16634065021e36ae31f074f623a636924d6b8d1Devang Patel    std::vector<Pass *> LastUses;
883e16634065021e36ae31f074f623a636924d6b8d1Devang Patel    std::vector<Pass *> RequiredPasses;
884e16634065021e36ae31f074f623a636924d6b8d1Devang Patel    unsigned PDepth = this->getDepth();
885e16634065021e36ae31f074f623a636924d6b8d1Devang Patel
886e16634065021e36ae31f074f623a636924d6b8d1Devang Patel    collectRequiredAnalysisPasses(RequiredPasses, P);
887e16634065021e36ae31f074f623a636924d6b8d1Devang Patel    for (std::vector<Pass *>::iterator I = RequiredPasses.begin(),
888e16634065021e36ae31f074f623a636924d6b8d1Devang Patel           E = RequiredPasses.end(); I != E; ++I) {
889e16634065021e36ae31f074f623a636924d6b8d1Devang Patel      Pass *PRequired = *I;
890e16634065021e36ae31f074f623a636924d6b8d1Devang Patel      unsigned RDepth = 0;
891cd520b187a222bf99d4238590e6517e87666e39fDevang Patel
892cd520b187a222bf99d4238590e6517e87666e39fDevang Patel      PMDataManager &DM = PRequired->getResolver()->getPMDataManager();
893cd520b187a222bf99d4238590e6517e87666e39fDevang Patel      RDepth = DM.getDepth();
894cd520b187a222bf99d4238590e6517e87666e39fDevang Patel
895e16634065021e36ae31f074f623a636924d6b8d1Devang Patel      if (PDepth == RDepth)
896e16634065021e36ae31f074f623a636924d6b8d1Devang Patel        LastUses.push_back(PRequired);
897e16634065021e36ae31f074f623a636924d6b8d1Devang Patel      else if (PDepth >  RDepth) {
898e16634065021e36ae31f074f623a636924d6b8d1Devang Patel        // Let the parent claim responsibility of last use
899ef89c5594aaa5b97f303ba0de99940b79f2c0e0eDevang Patel        TransferLastUses.push_back(PRequired);
900e16634065021e36ae31f074f623a636924d6b8d1Devang Patel      } else {
901e16634065021e36ae31f074f623a636924d6b8d1Devang Patel        // Note : This feature is not yet implemented
902e16634065021e36ae31f074f623a636924d6b8d1Devang Patel        assert (0 &&
903e16634065021e36ae31f074f623a636924d6b8d1Devang Patel                "Unable to handle Pass that requires lower level Analysis pass");
904e16634065021e36ae31f074f623a636924d6b8d1Devang Patel      }
905e16634065021e36ae31f074f623a636924d6b8d1Devang Patel    }
906e16634065021e36ae31f074f623a636924d6b8d1Devang Patel
907ef89c5594aaa5b97f303ba0de99940b79f2c0e0eDevang Patel    LastUses.push_back(P);
908ef89c5594aaa5b97f303ba0de99940b79f2c0e0eDevang Patel    TPM->setLastUser(LastUses, P);
909e16634065021e36ae31f074f623a636924d6b8d1Devang Patel
9100ac961d9c1c511204abfb02f5c25c92da6b75eb6Devang Patel    // Take a note of analysis required and made available by this pass.
911893a5a681585cdf3b5bfff7128ea522e8a47750aDevang Patel    // Remove the analysis not preserved by this pass
912893a5a681585cdf3b5bfff7128ea522e8a47750aDevang Patel    removeNotPreservedAnalysis(P);
9130ac961d9c1c511204abfb02f5c25c92da6b75eb6Devang Patel    recordAvailableAnalysis(P);
914893a5a681585cdf3b5bfff7128ea522e8a47750aDevang Patel  }
915e253385b108cd946b1ac150302f246d3b218be77Devang Patel
916e253385b108cd946b1ac150302f246d3b218be77Devang Patel  // Add pass
917e253385b108cd946b1ac150302f246d3b218be77Devang Patel  PassVector.push_back(P);
918e253385b108cd946b1ac150302f246d3b218be77Devang Patel}
919e253385b108cd946b1ac150302f246d3b218be77Devang Patel
920c17bbb6da7e17c06c1f0ae7baa2f151db0e966d9Devang Patel/// Populate RequiredPasses with the analysis pass that are required by
921c17bbb6da7e17c06c1f0ae7baa2f151db0e966d9Devang Patel/// pass P.
922c17bbb6da7e17c06c1f0ae7baa2f151db0e966d9Devang Patelvoid PMDataManager::collectRequiredAnalysisPasses(std::vector<Pass *> &RP,
923c17bbb6da7e17c06c1f0ae7baa2f151db0e966d9Devang Patel                                                  Pass *P) {
924c17bbb6da7e17c06c1f0ae7baa2f151db0e966d9Devang Patel  AnalysisUsage AnUsage;
925c17bbb6da7e17c06c1f0ae7baa2f151db0e966d9Devang Patel  P->getAnalysisUsage(AnUsage);
926c17bbb6da7e17c06c1f0ae7baa2f151db0e966d9Devang Patel  const std::vector<AnalysisID> &RequiredSet = AnUsage.getRequiredSet();
927c17bbb6da7e17c06c1f0ae7baa2f151db0e966d9Devang Patel  for (std::vector<AnalysisID>::const_iterator
928c17bbb6da7e17c06c1f0ae7baa2f151db0e966d9Devang Patel         I = RequiredSet.begin(), E = RequiredSet.end();
929c17bbb6da7e17c06c1f0ae7baa2f151db0e966d9Devang Patel       I != E; ++I) {
93069867b511c732a7fac7301977bd6e880e46439f1Devang Patel    Pass *AnalysisPass = findAnalysisPass(*I, true);
931c17bbb6da7e17c06c1f0ae7baa2f151db0e966d9Devang Patel    assert (AnalysisPass && "Analysis pass is not available");
932c17bbb6da7e17c06c1f0ae7baa2f151db0e966d9Devang Patel    RP.push_back(AnalysisPass);
933c17bbb6da7e17c06c1f0ae7baa2f151db0e966d9Devang Patel  }
93427aaab2bd3c220d8466b34f6b959f74e1caac69bDevang Patel
93527aaab2bd3c220d8466b34f6b959f74e1caac69bDevang Patel  const std::vector<AnalysisID> &IDs = AnUsage.getRequiredTransitiveSet();
93627aaab2bd3c220d8466b34f6b959f74e1caac69bDevang Patel  for (std::vector<AnalysisID>::const_iterator I = IDs.begin(),
93727aaab2bd3c220d8466b34f6b959f74e1caac69bDevang Patel         E = IDs.end(); I != E; ++I) {
93827aaab2bd3c220d8466b34f6b959f74e1caac69bDevang Patel    Pass *AnalysisPass = findAnalysisPass(*I, true);
93927aaab2bd3c220d8466b34f6b959f74e1caac69bDevang Patel    assert (AnalysisPass && "Analysis pass is not available");
94027aaab2bd3c220d8466b34f6b959f74e1caac69bDevang Patel    RP.push_back(AnalysisPass);
94127aaab2bd3c220d8466b34f6b959f74e1caac69bDevang Patel  }
942c17bbb6da7e17c06c1f0ae7baa2f151db0e966d9Devang Patel}
943c17bbb6da7e17c06c1f0ae7baa2f151db0e966d9Devang Patel
9442f42ed6b0b5161296cdd7e573b49fe631599fc97Devang Patel// All Required analyses should be available to the pass as it runs!  Here
9452f42ed6b0b5161296cdd7e573b49fe631599fc97Devang Patel// we fill in the AnalysisImpls member of the pass so that it can
9462f42ed6b0b5161296cdd7e573b49fe631599fc97Devang Patel// successfully use the getAnalysis() method to retrieve the
9472f42ed6b0b5161296cdd7e573b49fe631599fc97Devang Patel// implementations it needs.
9482f42ed6b0b5161296cdd7e573b49fe631599fc97Devang Patel//
949419f0e95d698109541ad730cb45ba4caca78f458Devang Patelvoid PMDataManager::initializeAnalysisImpl(Pass *P) {
9503799f97d539f6c288d169063e1b335917fafcffbDevang Patel  AnalysisUsage AnUsage;
9513799f97d539f6c288d169063e1b335917fafcffbDevang Patel  P->getAnalysisUsage(AnUsage);
9522f42ed6b0b5161296cdd7e573b49fe631599fc97Devang Patel
9532f42ed6b0b5161296cdd7e573b49fe631599fc97Devang Patel  for (std::vector<const PassInfo *>::const_iterator
9542f42ed6b0b5161296cdd7e573b49fe631599fc97Devang Patel         I = AnUsage.getRequiredSet().begin(),
9552f42ed6b0b5161296cdd7e573b49fe631599fc97Devang Patel         E = AnUsage.getRequiredSet().end(); I != E; ++I) {
95669867b511c732a7fac7301977bd6e880e46439f1Devang Patel    Pass *Impl = findAnalysisPass(*I, true);
9572f42ed6b0b5161296cdd7e573b49fe631599fc97Devang Patel    if (Impl == 0)
9582f42ed6b0b5161296cdd7e573b49fe631599fc97Devang Patel      assert(0 && "Analysis used but not available!");
959cde53d3c1e9d6a2add5de847b44818fbb1d69c20Devang Patel    AnalysisResolver *AR = P->getResolver();
960298feadd7a547d50eb943c9ea15f6345a024bc9aDevang Patel    AR->addAnalysisImplsPair(*I, Impl);
9612f42ed6b0b5161296cdd7e573b49fe631599fc97Devang Patel  }
9622f42ed6b0b5161296cdd7e573b49fe631599fc97Devang Patel}
9632f42ed6b0b5161296cdd7e573b49fe631599fc97Devang Patel
96469867b511c732a7fac7301977bd6e880e46439f1Devang Patel/// Find the pass that implements Analysis AID. If desired pass is not found
96569867b511c732a7fac7301977bd6e880e46439f1Devang Patel/// then return NULL.
96669867b511c732a7fac7301977bd6e880e46439f1Devang PatelPass *PMDataManager::findAnalysisPass(AnalysisID AID, bool SearchParent) {
96769867b511c732a7fac7301977bd6e880e46439f1Devang Patel
96869867b511c732a7fac7301977bd6e880e46439f1Devang Patel  // Check if AvailableAnalysis map has one entry.
96969867b511c732a7fac7301977bd6e880e46439f1Devang Patel  std::map<AnalysisID, Pass*>::const_iterator I =  AvailableAnalysis.find(AID);
97069867b511c732a7fac7301977bd6e880e46439f1Devang Patel
97169867b511c732a7fac7301977bd6e880e46439f1Devang Patel  if (I != AvailableAnalysis.end())
97269867b511c732a7fac7301977bd6e880e46439f1Devang Patel    return I->second;
97369867b511c732a7fac7301977bd6e880e46439f1Devang Patel
97469867b511c732a7fac7301977bd6e880e46439f1Devang Patel  // Search Parents through TopLevelManager
97569867b511c732a7fac7301977bd6e880e46439f1Devang Patel  if (SearchParent)
97669867b511c732a7fac7301977bd6e880e46439f1Devang Patel    return TPM->findAnalysisPass(AID);
97769867b511c732a7fac7301977bd6e880e46439f1Devang Patel
9785b640e7edc606059717fb9c2ebcd85302c97fc21Devang Patel  return NULL;
97969867b511c732a7fac7301977bd6e880e46439f1Devang Patel}
98069867b511c732a7fac7301977bd6e880e46439f1Devang Patel
981a52035a062edf9bfbf95c92c615219b647042c17Devang Patel// Print list of passes that are last used by P.
982a52035a062edf9bfbf95c92c615219b647042c17Devang Patelvoid PMDataManager::dumpLastUses(Pass *P, unsigned Offset) const{
983a52035a062edf9bfbf95c92c615219b647042c17Devang Patel
984a52035a062edf9bfbf95c92c615219b647042c17Devang Patel  std::vector<Pass *> LUses;
985a52035a062edf9bfbf95c92c615219b647042c17Devang Patel
986a52035a062edf9bfbf95c92c615219b647042c17Devang Patel  assert (TPM && "Top Level Manager is missing");
987a52035a062edf9bfbf95c92c615219b647042c17Devang Patel  TPM->collectLastUses(LUses, P);
988a52035a062edf9bfbf95c92c615219b647042c17Devang Patel
989a52035a062edf9bfbf95c92c615219b647042c17Devang Patel  for (std::vector<Pass *>::iterator I = LUses.begin(),
990a52035a062edf9bfbf95c92c615219b647042c17Devang Patel         E = LUses.end(); I != E; ++I) {
991a52035a062edf9bfbf95c92c615219b647042c17Devang Patel    llvm::cerr << "--" << std::string(Offset*2, ' ');
992a52035a062edf9bfbf95c92c615219b647042c17Devang Patel    (*I)->dumpPassStructure(0);
993a52035a062edf9bfbf95c92c615219b647042c17Devang Patel  }
994a52035a062edf9bfbf95c92c615219b647042c17Devang Patel}
995a52035a062edf9bfbf95c92c615219b647042c17Devang Patel
996a52035a062edf9bfbf95c92c615219b647042c17Devang Patelvoid PMDataManager::dumpPassArguments() const {
997a52035a062edf9bfbf95c92c615219b647042c17Devang Patel  for(std::vector<Pass *>::const_iterator I = PassVector.begin(),
998a52035a062edf9bfbf95c92c615219b647042c17Devang Patel        E = PassVector.end(); I != E; ++I) {
999a52035a062edf9bfbf95c92c615219b647042c17Devang Patel    if (PMDataManager *PMD = dynamic_cast<PMDataManager *>(*I))
1000a52035a062edf9bfbf95c92c615219b647042c17Devang Patel      PMD->dumpPassArguments();
1001a52035a062edf9bfbf95c92c615219b647042c17Devang Patel    else
1002a52035a062edf9bfbf95c92c615219b647042c17Devang Patel      if (const PassInfo *PI = (*I)->getPassInfo())
1003a52035a062edf9bfbf95c92c615219b647042c17Devang Patel        if (!PI->isAnalysisGroup())
1004a52035a062edf9bfbf95c92c615219b647042c17Devang Patel          cerr << " -" << PI->getPassArgument();
1005a52035a062edf9bfbf95c92c615219b647042c17Devang Patel  }
1006a52035a062edf9bfbf95c92c615219b647042c17Devang Patel}
1007a52035a062edf9bfbf95c92c615219b647042c17Devang Patel
1008a52035a062edf9bfbf95c92c615219b647042c17Devang Patelvoid PMDataManager:: dumpPassInfo(Pass *P,  std::string &Msg1,
1009a52035a062edf9bfbf95c92c615219b647042c17Devang Patel                                  std::string &Msg2) const {
1010a52035a062edf9bfbf95c92c615219b647042c17Devang Patel  if (PassDebugging_New < Executions)
1011a52035a062edf9bfbf95c92c615219b647042c17Devang Patel    return;
1012a52035a062edf9bfbf95c92c615219b647042c17Devang Patel  cerr << (void*)this << std::string(getDepth()*2+1, ' ');
1013a52035a062edf9bfbf95c92c615219b647042c17Devang Patel  cerr << Msg1;
1014a52035a062edf9bfbf95c92c615219b647042c17Devang Patel  cerr << P->getPassName();
1015a52035a062edf9bfbf95c92c615219b647042c17Devang Patel  cerr << Msg2;
1016a52035a062edf9bfbf95c92c615219b647042c17Devang Patel}
1017a52035a062edf9bfbf95c92c615219b647042c17Devang Patel
1018a52035a062edf9bfbf95c92c615219b647042c17Devang Patelvoid PMDataManager::dumpAnalysisSetInfo(const char *Msg, Pass *P,
1019a52035a062edf9bfbf95c92c615219b647042c17Devang Patel                                        const std::vector<AnalysisID> &Set)
1020a52035a062edf9bfbf95c92c615219b647042c17Devang Patel  const {
1021a52035a062edf9bfbf95c92c615219b647042c17Devang Patel  if (PassDebugging_New >= Details && !Set.empty()) {
1022a52035a062edf9bfbf95c92c615219b647042c17Devang Patel    cerr << (void*)P << std::string(getDepth()*2+3, ' ') << Msg << " Analyses:";
1023a52035a062edf9bfbf95c92c615219b647042c17Devang Patel      for (unsigned i = 0; i != Set.size(); ++i) {
1024a52035a062edf9bfbf95c92c615219b647042c17Devang Patel        if (i) cerr << ",";
1025a52035a062edf9bfbf95c92c615219b647042c17Devang Patel        cerr << " " << Set[i]->getPassName();
1026a52035a062edf9bfbf95c92c615219b647042c17Devang Patel      }
1027a52035a062edf9bfbf95c92c615219b647042c17Devang Patel      cerr << "\n";
1028a52035a062edf9bfbf95c92c615219b647042c17Devang Patel  }
1029a52035a062edf9bfbf95c92c615219b647042c17Devang Patel}
1030f3dc6d9f95d4ba7756105154df4a8075bbbcf931Devang Patel
1031f3dc6d9f95d4ba7756105154df4a8075bbbcf931Devang Patel//===----------------------------------------------------------------------===//
1032f3dc6d9f95d4ba7756105154df4a8075bbbcf931Devang Patel// NOTE: Is this the right place to define this method ?
1033f3dc6d9f95d4ba7756105154df4a8075bbbcf931Devang Patel// getAnalysisToUpdate - Return an analysis result or null if it doesn't exist
1034cde53d3c1e9d6a2add5de847b44818fbb1d69c20Devang PatelPass *AnalysisResolver::getAnalysisToUpdate(AnalysisID ID, bool dir) const {
1035f3dc6d9f95d4ba7756105154df4a8075bbbcf931Devang Patel  return PM.findAnalysisPass(ID, dir);
1036f3dc6d9f95d4ba7756105154df4a8075bbbcf931Devang Patel}
1037f3dc6d9f95d4ba7756105154df4a8075bbbcf931Devang Patel
103806e86561a5261a59f5c391d5cc5cb4aa38dca83cDevang Patel//===----------------------------------------------------------------------===//
10395f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel// BBPassManager implementation
104055fd43f90913676682487f89f27c756adb827f66Devang Patel
10412c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel/// Add pass P into PassVector and return true. If this pass is not
10422c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel/// manageable by this manager then return false.
104355fd43f90913676682487f89f27c756adb827f66Devang Patelbool
10445f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang PatelBBPassManager::addPass(Pass *P) {
104555fd43f90913676682487f89f27c756adb827f66Devang Patel
104655fd43f90913676682487f89f27c756adb827f66Devang Patel  BasicBlockPass *BP = dynamic_cast<BasicBlockPass*>(P);
104755fd43f90913676682487f89f27c756adb827f66Devang Patel  if (!BP)
104855fd43f90913676682487f89f27c756adb827f66Devang Patel    return false;
104955fd43f90913676682487f89f27c756adb827f66Devang Patel
10501a8038636c2998e37f2130b0ab89a3686d9c1f48Devang Patel  // If this pass does not preserve analysis that is used by other passes
10511a8038636c2998e37f2130b0ab89a3686d9c1f48Devang Patel  // managed by this manager than it is not a suitable pass for this manager.
10522c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel  if (!manageablePass(P))
105353596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel    return false;
105453596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel
1055a84b3025ca7d437d2eab22d7c3002c8d89c31858Chris Lattner  addPassToManager(BP);
105614d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel
105755fd43f90913676682487f89f27c756adb827f66Devang Patel  return true;
105855fd43f90913676682487f89f27c756adb827f66Devang Patel}
105955fd43f90913676682487f89f27c756adb827f66Devang Patel
106055fd43f90913676682487f89f27c756adb827f66Devang Patel/// Execute all of the passes scheduled for execution by invoking
106155fd43f90913676682487f89f27c756adb827f66Devang Patel/// runOnBasicBlock method.  Keep track of whether any of the passes modifies
106255fd43f90913676682487f89f27c756adb827f66Devang Patel/// the function, and if so, return true.
106355fd43f90913676682487f89f27c756adb827f66Devang Patelbool
10645f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang PatelBBPassManager::runOnFunction(Function &F) {
106555fd43f90913676682487f89f27c756adb827f66Devang Patel
10661fbe2c9964d57b2a58235541175f069ae491a95eDevang Patel  if (F.isExternal())
10671fbe2c9964d57b2a58235541175f069ae491a95eDevang Patel    return false;
10681fbe2c9964d57b2a58235541175f069ae491a95eDevang Patel
10693b14fbe300b96c353a9abfadf481b64324f17375Devang Patel  bool Changed = doInitialization(F);
1070c1d6e1fc9c3a47529f417026df652f466ce67851Devang Patel
1071693a74e4ee34e2058dab7121c17c98ec59258a8aDevang Patel  std::string Msg1 = "Executing Pass '";
1072693a74e4ee34e2058dab7121c17c98ec59258a8aDevang Patel  std::string Msg3 = "' Made Modification '";
1073693a74e4ee34e2058dab7121c17c98ec59258a8aDevang Patel
107455fd43f90913676682487f89f27c756adb827f66Devang Patel  for (Function::iterator I = F.begin(), E = F.end(); I != E; ++I)
10751554c8545651350569f08dc7370189da1a7e5814Devang Patel    for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
10761554c8545651350569f08dc7370189da1a7e5814Devang Patel      BasicBlockPass *BP = getContainedPass(Index);
1077017b5d969b12119a88463fe2451f20ca9214c4ffDevang Patel      AnalysisUsage AnUsage;
10781554c8545651350569f08dc7370189da1a7e5814Devang Patel      BP->getAnalysisUsage(AnUsage);
1079017b5d969b12119a88463fe2451f20ca9214c4ffDevang Patel
10804eeea774ce1b24fa55c06aac31e02016d5dd77d6Devang Patel      std::string Msg2 = "' on BasicBlock '" + (*I).getName() + "'...\n";
10811554c8545651350569f08dc7370189da1a7e5814Devang Patel      dumpPassInfo(BP, Msg1, Msg2);
10821554c8545651350569f08dc7370189da1a7e5814Devang Patel      dumpAnalysisSetInfo("Required", BP, AnUsage.getRequiredSet());
1083017b5d969b12119a88463fe2451f20ca9214c4ffDevang Patel
10841554c8545651350569f08dc7370189da1a7e5814Devang Patel      initializeAnalysisImpl(BP);
1085693a74e4ee34e2058dab7121c17c98ec59258a8aDevang Patel
10861554c8545651350569f08dc7370189da1a7e5814Devang Patel      if (TheTimeInfo) TheTimeInfo->passStarted(BP);
108755fd43f90913676682487f89f27c756adb827f66Devang Patel      Changed |= BP->runOnBasicBlock(*I);
10881554c8545651350569f08dc7370189da1a7e5814Devang Patel      if (TheTimeInfo) TheTimeInfo->passEnded(BP);
1089693a74e4ee34e2058dab7121c17c98ec59258a8aDevang Patel
1090693a74e4ee34e2058dab7121c17c98ec59258a8aDevang Patel      if (Changed)
10911554c8545651350569f08dc7370189da1a7e5814Devang Patel        dumpPassInfo(BP, Msg3, Msg2);
10921554c8545651350569f08dc7370189da1a7e5814Devang Patel      dumpAnalysisSetInfo("Preserved", BP, AnUsage.getPreservedSet());
1093693a74e4ee34e2058dab7121c17c98ec59258a8aDevang Patel
10941554c8545651350569f08dc7370189da1a7e5814Devang Patel      removeNotPreservedAnalysis(BP);
10951554c8545651350569f08dc7370189da1a7e5814Devang Patel      recordAvailableAnalysis(BP);
10961554c8545651350569f08dc7370189da1a7e5814Devang Patel      removeDeadPasses(BP, Msg2);
109755fd43f90913676682487f89f27c756adb827f66Devang Patel    }
10981a8038636c2998e37f2130b0ab89a3686d9c1f48Devang Patel  return Changed |= doFinalization(F);
109955fd43f90913676682487f89f27c756adb827f66Devang Patel}
110055fd43f90913676682487f89f27c756adb827f66Devang Patel
1101964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel// Implement doInitialization and doFinalization
11025f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patelinline bool BBPassManager::doInitialization(Module &M) {
1103964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel  bool Changed = false;
1104964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel
11051554c8545651350569f08dc7370189da1a7e5814Devang Patel  for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
11061554c8545651350569f08dc7370189da1a7e5814Devang Patel    BasicBlockPass *BP = getContainedPass(Index);
1107964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel    Changed |= BP->doInitialization(M);
1108964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel  }
1109964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel
1110964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel  return Changed;
1111964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel}
1112964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel
11135f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patelinline bool BBPassManager::doFinalization(Module &M) {
1114964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel  bool Changed = false;
1115964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel
11161554c8545651350569f08dc7370189da1a7e5814Devang Patel  for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
11171554c8545651350569f08dc7370189da1a7e5814Devang Patel    BasicBlockPass *BP = getContainedPass(Index);
1118964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel    Changed |= BP->doFinalization(M);
1119964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel  }
1120964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel
1121964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel  return Changed;
1122964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel}
1123964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel
11245f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patelinline bool BBPassManager::doInitialization(Function &F) {
1125964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel  bool Changed = false;
1126964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel
11271554c8545651350569f08dc7370189da1a7e5814Devang Patel  for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
11281554c8545651350569f08dc7370189da1a7e5814Devang Patel    BasicBlockPass *BP = getContainedPass(Index);
1129964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel    Changed |= BP->doInitialization(F);
1130964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel  }
1131964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel
1132964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel  return Changed;
1133964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel}
1134964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel
11355f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patelinline bool BBPassManager::doFinalization(Function &F) {
1136964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel  bool Changed = false;
1137964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel
11381554c8545651350569f08dc7370189da1a7e5814Devang Patel  for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
11391554c8545651350569f08dc7370189da1a7e5814Devang Patel    BasicBlockPass *BP = getContainedPass(Index);
1140964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel    Changed |= BP->doFinalization(F);
1141964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel  }
1142964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel
1143964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel  return Changed;
1144964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel}
1145964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel
1146964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel
114706e86561a5261a59f5c391d5cc5cb4aa38dca83cDevang Patel//===----------------------------------------------------------------------===//
11483162691f69f85f740bc28f3ddca39b166d35187cDevang Patel// FunctionPassManager implementation
114906e86561a5261a59f5c391d5cc5cb4aa38dca83cDevang Patel
1150c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// Create new Function pass manager
11513162691f69f85f740bc28f3ddca39b166d35187cDevang PatelFunctionPassManager::FunctionPassManager(ModuleProvider *P) {
11525f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  FPM = new FunctionPassManagerImpl(0);
1153dff33ef8e863241193463fd0129657c5ebce4d58Devang Patel  // FPM is the top level manager.
1154dff33ef8e863241193463fd0129657c5ebce4d58Devang Patel  FPM->setTopLevelManager(FPM);
1155b920bd85adba95553568cef6a7078ee2509ab804Devang Patel
1156b920bd85adba95553568cef6a7078ee2509ab804Devang Patel  PMDataManager *PMD = dynamic_cast<PMDataManager *>(FPM);
1157cde53d3c1e9d6a2add5de847b44818fbb1d69c20Devang Patel  AnalysisResolver *AR = new AnalysisResolver(*PMD);
1158b920bd85adba95553568cef6a7078ee2509ab804Devang Patel  FPM->setResolver(AR);
1159b920bd85adba95553568cef6a7078ee2509ab804Devang Patel
1160cc132cd9feef765fe70284183c0f997b4faa5483Devang Patel  MP = P;
1161cc132cd9feef765fe70284183c0f997b4faa5483Devang Patel}
1162cc132cd9feef765fe70284183c0f997b4faa5483Devang Patel
11633162691f69f85f740bc28f3ddca39b166d35187cDevang PatelFunctionPassManager::~FunctionPassManager() {
116437a6f7966c39f69a92419d37949a94a758c29e90Devang Patel  delete FPM;
116537a6f7966c39f69a92419d37949a94a758c29e90Devang Patel}
116637a6f7966c39f69a92419d37949a94a758c29e90Devang Patel
1167c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// add - Add a pass to the queue of passes to run.  This passes
1168c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// ownership of the Pass to the PassManager.  When the
1169c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// PassManager_X is destroyed, the pass will be destroyed as well, so
1170c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// there is no need to delete the pass. (TODO delete passes.)
1171c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// This implies that all passes MUST be allocated with 'new'.
11723162691f69f85f740bc28f3ddca39b166d35187cDevang Patelvoid FunctionPassManager::add(Pass *P) {
1173c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel  FPM->add(P);
1174c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel}
1175c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel
1176214ca23aef8bd408c4ee4ce28ba93d57d2416587Devang Patel/// run - Execute all of the passes scheduled for execution.  Keep
1177214ca23aef8bd408c4ee4ce28ba93d57d2416587Devang Patel/// track of whether any of the passes modifies the function, and if
1178214ca23aef8bd408c4ee4ce28ba93d57d2416587Devang Patel/// so, return true.
1179214ca23aef8bd408c4ee4ce28ba93d57d2416587Devang Patel///
11803162691f69f85f740bc28f3ddca39b166d35187cDevang Patelbool FunctionPassManager::run(Function &F) {
1181214ca23aef8bd408c4ee4ce28ba93d57d2416587Devang Patel  std::string errstr;
1182214ca23aef8bd408c4ee4ce28ba93d57d2416587Devang Patel  if (MP->materializeFunction(&F, &errstr)) {
1183e81561909d128c6e2d8033cb5465a49b2596b26aBill Wendling    cerr << "Error reading bytecode file: " << errstr << "\n";
1184214ca23aef8bd408c4ee4ce28ba93d57d2416587Devang Patel    abort();
1185214ca23aef8bd408c4ee4ce28ba93d57d2416587Devang Patel  }
1186c475692c5ee2f9c0c6988b7ec28768ef6690bfb0Devang Patel  return FPM->run(F);
1187214ca23aef8bd408c4ee4ce28ba93d57d2416587Devang Patel}
1188214ca23aef8bd408c4ee4ce28ba93d57d2416587Devang Patel
1189214ca23aef8bd408c4ee4ce28ba93d57d2416587Devang Patel
11903799f97d539f6c288d169063e1b335917fafcffbDevang Patel/// doInitialization - Run all of the initializers for the function passes.
11913799f97d539f6c288d169063e1b335917fafcffbDevang Patel///
11923162691f69f85f740bc28f3ddca39b166d35187cDevang Patelbool FunctionPassManager::doInitialization() {
11933799f97d539f6c288d169063e1b335917fafcffbDevang Patel  return FPM->doInitialization(*MP->getModule());
11943799f97d539f6c288d169063e1b335917fafcffbDevang Patel}
11953799f97d539f6c288d169063e1b335917fafcffbDevang Patel
11963799f97d539f6c288d169063e1b335917fafcffbDevang Patel/// doFinalization - Run all of the initializers for the function passes.
11973799f97d539f6c288d169063e1b335917fafcffbDevang Patel///
11983162691f69f85f740bc28f3ddca39b166d35187cDevang Patelbool FunctionPassManager::doFinalization() {
11993799f97d539f6c288d169063e1b335917fafcffbDevang Patel  return FPM->doFinalization(*MP->getModule());
12003799f97d539f6c288d169063e1b335917fafcffbDevang Patel}
12013799f97d539f6c288d169063e1b335917fafcffbDevang Patel
120206e86561a5261a59f5c391d5cc5cb4aa38dca83cDevang Patel//===----------------------------------------------------------------------===//
12035f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel// FunctionPassManagerImpl implementation
12045f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel//
12055f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel/// Add P into active pass manager or use new module pass manager to
12065f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel/// manage it.
12075f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patelbool FunctionPassManagerImpl::addPass(Pass *P) {
12085f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel
12095f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  if (!activeManager || !activeManager->addPass(P)) {
12105f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel    activeManager = new FPPassManager(getDepth() + 1);
12115f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel    // Inherit top level manager
12125f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel    activeManager->setTopLevelManager(this->getTopLevelManager());
12135f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel
12145f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel    // This top level manager is going to manage activeManager.
12155f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel    // Set up analysis resolver to connect them.
1216cde53d3c1e9d6a2add5de847b44818fbb1d69c20Devang Patel    AnalysisResolver *AR = new AnalysisResolver(*this);
12175f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel    activeManager->setResolver(AR);
12185f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel
12195f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel    addPassManager(activeManager);
12205f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel    return activeManager->addPass(P);
12215f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  }
12225f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  return true;
12235f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel}
12245f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel
12255f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patelinline bool FunctionPassManagerImpl::doInitialization(Module &M) {
12265f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  bool Changed = false;
12275f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel
12285f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  for (unsigned Index = 0; Index < getNumContainedManagers(); ++Index) {
12295f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel    FPPassManager *FP = getContainedManager(Index);
12305f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel    Changed |= FP->doInitialization(M);
12315f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  }
12325f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel
12335f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  return Changed;
12345f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel}
12355f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel
12365f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patelinline bool FunctionPassManagerImpl::doFinalization(Module &M) {
12375f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  bool Changed = false;
12385f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel
12395f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  for (unsigned Index = 0; Index < getNumContainedManagers(); ++Index) {
12405f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel    FPPassManager *FP = getContainedManager(Index);
12415f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel    Changed |= FP->doFinalization(M);
12425f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  }
12435f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel
12445f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  return Changed;
12455f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel}
12465f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel
12475f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel// Execute all the passes managed by this top level manager.
12485f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel// Return true if any function is modified by a pass.
12495f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patelbool FunctionPassManagerImpl::run(Function &F) {
12505f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel
12515f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  bool Changed = false;
12525f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel
12535f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  TimingInfo::createTheTimeInfo();
12545f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel
12555f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  dumpArguments();
12565f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  dumpPasses();
12575f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel
12581336a6bf06e64a096217628d2cc9644e48a5d7d6Devang Patel  initializeAllAnalysisInfo();
12595f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  for (unsigned Index = 0; Index < getNumContainedManagers(); ++Index) {
12605f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel    FPPassManager *FP = getContainedManager(Index);
12615f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel    Changed |= FP->runOnFunction(F);
12625f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  }
12635f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  return Changed;
12645f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel}
12655f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel
12665f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel//===----------------------------------------------------------------------===//
12675f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel// FPPassManager implementation
1268448d27cd795dc273249f123444509403f4fa4facDevang Patel
1269448d27cd795dc273249f123444509403f4fa4facDevang Patel/// Add pass P into the pass manager queue. If P is a BasicBlockPass then
1270448d27cd795dc273249f123444509403f4fa4facDevang Patel/// either use it into active basic block pass manager or create new basic
1271448d27cd795dc273249f123444509403f4fa4facDevang Patel/// block pass manager to handle pass P.
1272448d27cd795dc273249f123444509403f4fa4facDevang Patelbool
12735f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang PatelFPPassManager::addPass(Pass *P) {
1274448d27cd795dc273249f123444509403f4fa4facDevang Patel
12755f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  // If P is a BasicBlockPass then use BBPassManager.
1276448d27cd795dc273249f123444509403f4fa4facDevang Patel  if (BasicBlockPass *BP = dynamic_cast<BasicBlockPass*>(P)) {
1277448d27cd795dc273249f123444509403f4fa4facDevang Patel
1278badc4fae531cc0fdaa8e58f481c3b1d23ea7dd56Devang Patel    if (!activeBBPassManager || !activeBBPassManager->addPass(BP)) {
1279448d27cd795dc273249f123444509403f4fa4facDevang Patel
1280badc4fae531cc0fdaa8e58f481c3b1d23ea7dd56Devang Patel      // If active manager exists then clear its analysis info.
1281badc4fae531cc0fdaa8e58f481c3b1d23ea7dd56Devang Patel      if (activeBBPassManager)
1282badc4fae531cc0fdaa8e58f481c3b1d23ea7dd56Devang Patel        activeBBPassManager->initializeAnalysisInfo();
1283b917e38c84fa9c7c434762a0e587af63eec939e5Devang Patel
1284badc4fae531cc0fdaa8e58f481c3b1d23ea7dd56Devang Patel      // Create and add new manager
12855f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel      activeBBPassManager = new BBPassManager(getDepth() + 1);
1286dff33ef8e863241193463fd0129657c5ebce4d58Devang Patel      // Inherit top level manager
1287dff33ef8e863241193463fd0129657c5ebce4d58Devang Patel      activeBBPassManager->setTopLevelManager(this->getTopLevelManager());
12881b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel
12891b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel      // Add new manager into current manager's list.
1290893a5a681585cdf3b5bfff7128ea522e8a47750aDevang Patel      addPassToManager(activeBBPassManager, false);
12911b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel
12921b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel      // Add new manager into top level manager's indirect passes list
12931b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel      PMDataManager *PMD = dynamic_cast<PMDataManager *>(activeBBPassManager);
12941b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel      assert (PMD && "Manager is not Pass Manager");
12951b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel      TPM->addIndirectPassManager(PMD);
1296badc4fae531cc0fdaa8e58f481c3b1d23ea7dd56Devang Patel
1297badc4fae531cc0fdaa8e58f481c3b1d23ea7dd56Devang Patel      // Add pass into new manager. This time it must succeed.
12982c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel      if (!activeBBPassManager->addPass(BP))
12992c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel        assert(0 && "Unable to add Pass");
1300ef89c5594aaa5b97f303ba0de99940b79f2c0e0eDevang Patel
1301ef89c5594aaa5b97f303ba0de99940b79f2c0e0eDevang Patel      // If activeBBPassManager transfered any Last Uses then handle them here.
1302ef89c5594aaa5b97f303ba0de99940b79f2c0e0eDevang Patel      std::vector<Pass *> &TLU = activeBBPassManager->getTransferredLastUses();
1303ef89c5594aaa5b97f303ba0de99940b79f2c0e0eDevang Patel      if (!TLU.empty())
1304ef89c5594aaa5b97f303ba0de99940b79f2c0e0eDevang Patel        TPM->setLastUser(TLU, this);
1305ef89c5594aaa5b97f303ba0de99940b79f2c0e0eDevang Patel
1306448d27cd795dc273249f123444509403f4fa4facDevang Patel    }
1307e16634065021e36ae31f074f623a636924d6b8d1Devang Patel
1308448d27cd795dc273249f123444509403f4fa4facDevang Patel    return true;
1309448d27cd795dc273249f123444509403f4fa4facDevang Patel  }
1310448d27cd795dc273249f123444509403f4fa4facDevang Patel
1311448d27cd795dc273249f123444509403f4fa4facDevang Patel  FunctionPass *FP = dynamic_cast<FunctionPass *>(P);
1312448d27cd795dc273249f123444509403f4fa4facDevang Patel  if (!FP)
1313448d27cd795dc273249f123444509403f4fa4facDevang Patel    return false;
1314448d27cd795dc273249f123444509403f4fa4facDevang Patel
13151a8038636c2998e37f2130b0ab89a3686d9c1f48Devang Patel  // If this pass does not preserve analysis that is used by other passes
13161a8038636c2998e37f2130b0ab89a3686d9c1f48Devang Patel  // managed by this manager than it is not a suitable pass for this manager.
13172c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel  if (!manageablePass(P))
131853596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel    return false;
131953596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel
1320e253385b108cd946b1ac150302f246d3b218be77Devang Patel  addPassToManager (FP);
1321badc4fae531cc0fdaa8e58f481c3b1d23ea7dd56Devang Patel
1322badc4fae531cc0fdaa8e58f481c3b1d23ea7dd56Devang Patel  // If active manager exists then clear its analysis info.
1323badc4fae531cc0fdaa8e58f481c3b1d23ea7dd56Devang Patel  if (activeBBPassManager) {
1324badc4fae531cc0fdaa8e58f481c3b1d23ea7dd56Devang Patel    activeBBPassManager->initializeAnalysisInfo();
1325badc4fae531cc0fdaa8e58f481c3b1d23ea7dd56Devang Patel    activeBBPassManager = NULL;
1326badc4fae531cc0fdaa8e58f481c3b1d23ea7dd56Devang Patel  }
1327badc4fae531cc0fdaa8e58f481c3b1d23ea7dd56Devang Patel
1328448d27cd795dc273249f123444509403f4fa4facDevang Patel  return true;
1329448d27cd795dc273249f123444509403f4fa4facDevang Patel}
1330448d27cd795dc273249f123444509403f4fa4facDevang Patel
1331448d27cd795dc273249f123444509403f4fa4facDevang Patel/// Execute all of the passes scheduled for execution by invoking
1332448d27cd795dc273249f123444509403f4fa4facDevang Patel/// runOnFunction method.  Keep track of whether any of the passes modifies
1333448d27cd795dc273249f123444509403f4fa4facDevang Patel/// the function, and if so, return true.
13345f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patelbool FPPassManager::runOnFunction(Function &F) {
1335214ca23aef8bd408c4ee4ce28ba93d57d2416587Devang Patel
1336214ca23aef8bd408c4ee4ce28ba93d57d2416587Devang Patel  bool Changed = false;
13371fbe2c9964d57b2a58235541175f069ae491a95eDevang Patel
13381fbe2c9964d57b2a58235541175f069ae491a95eDevang Patel  if (F.isExternal())
13391fbe2c9964d57b2a58235541175f069ae491a95eDevang Patel    return false;
13401fbe2c9964d57b2a58235541175f069ae491a95eDevang Patel
1341693a74e4ee34e2058dab7121c17c98ec59258a8aDevang Patel  std::string Msg1 = "Executing Pass '";
1342693a74e4ee34e2058dab7121c17c98ec59258a8aDevang Patel  std::string Msg3 = "' Made Modification '";
1343693a74e4ee34e2058dab7121c17c98ec59258a8aDevang Patel
13441554c8545651350569f08dc7370189da1a7e5814Devang Patel  for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
13451554c8545651350569f08dc7370189da1a7e5814Devang Patel    FunctionPass *FP = getContainedPass(Index);
13461554c8545651350569f08dc7370189da1a7e5814Devang Patel
1347017b5d969b12119a88463fe2451f20ca9214c4ffDevang Patel    AnalysisUsage AnUsage;
13481554c8545651350569f08dc7370189da1a7e5814Devang Patel    FP->getAnalysisUsage(AnUsage);
1349693a74e4ee34e2058dab7121c17c98ec59258a8aDevang Patel
13504eeea774ce1b24fa55c06aac31e02016d5dd77d6Devang Patel    std::string Msg2 = "' on Function '" + F.getName() + "'...\n";
13511554c8545651350569f08dc7370189da1a7e5814Devang Patel    dumpPassInfo(FP, Msg1, Msg2);
13521554c8545651350569f08dc7370189da1a7e5814Devang Patel    dumpAnalysisSetInfo("Required", FP, AnUsage.getRequiredSet());
1353693a74e4ee34e2058dab7121c17c98ec59258a8aDevang Patel
13541554c8545651350569f08dc7370189da1a7e5814Devang Patel    initializeAnalysisImpl(FP);
13558e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel
13561554c8545651350569f08dc7370189da1a7e5814Devang Patel    if (TheTimeInfo) TheTimeInfo->passStarted(FP);
1357214ca23aef8bd408c4ee4ce28ba93d57d2416587Devang Patel    Changed |= FP->runOnFunction(F);
13581554c8545651350569f08dc7370189da1a7e5814Devang Patel    if (TheTimeInfo) TheTimeInfo->passEnded(FP);
1359693a74e4ee34e2058dab7121c17c98ec59258a8aDevang Patel
1360693a74e4ee34e2058dab7121c17c98ec59258a8aDevang Patel    if (Changed)
13611554c8545651350569f08dc7370189da1a7e5814Devang Patel      dumpPassInfo(FP, Msg3, Msg2);
13621554c8545651350569f08dc7370189da1a7e5814Devang Patel    dumpAnalysisSetInfo("Preserved", FP, AnUsage.getPreservedSet());
1363693a74e4ee34e2058dab7121c17c98ec59258a8aDevang Patel
13641554c8545651350569f08dc7370189da1a7e5814Devang Patel    removeNotPreservedAnalysis(FP);
13651554c8545651350569f08dc7370189da1a7e5814Devang Patel    recordAvailableAnalysis(FP);
13661554c8545651350569f08dc7370189da1a7e5814Devang Patel    removeDeadPasses(FP, Msg2);
1367214ca23aef8bd408c4ee4ce28ba93d57d2416587Devang Patel  }
1368214ca23aef8bd408c4ee4ce28ba93d57d2416587Devang Patel  return Changed;
1369214ca23aef8bd408c4ee4ce28ba93d57d2416587Devang Patel}
1370214ca23aef8bd408c4ee4ce28ba93d57d2416587Devang Patel
13715f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patelbool FPPassManager::runOnModule(Module &M) {
1372214ca23aef8bd408c4ee4ce28ba93d57d2416587Devang Patel
13735f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  bool Changed = doInitialization(M);
13745f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel
13755f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  for(Module::iterator I = M.begin(), E = M.end(); I != E; ++I)
13765f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel    this->runOnFunction(*I);
13775f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel
13785f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  return Changed |= doFinalization(M);
13795f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel}
13805f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel
13815f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patelinline bool FPPassManager::doInitialization(Module &M) {
13823799f97d539f6c288d169063e1b335917fafcffbDevang Patel  bool Changed = false;
13833799f97d539f6c288d169063e1b335917fafcffbDevang Patel
13841554c8545651350569f08dc7370189da1a7e5814Devang Patel  for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
13851554c8545651350569f08dc7370189da1a7e5814Devang Patel    FunctionPass *FP = getContainedPass(Index);
13863799f97d539f6c288d169063e1b335917fafcffbDevang Patel    Changed |= FP->doInitialization(M);
13873799f97d539f6c288d169063e1b335917fafcffbDevang Patel  }
13883799f97d539f6c288d169063e1b335917fafcffbDevang Patel
13893799f97d539f6c288d169063e1b335917fafcffbDevang Patel  return Changed;
13903799f97d539f6c288d169063e1b335917fafcffbDevang Patel}
13913799f97d539f6c288d169063e1b335917fafcffbDevang Patel
13925f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patelinline bool FPPassManager::doFinalization(Module &M) {
13933799f97d539f6c288d169063e1b335917fafcffbDevang Patel  bool Changed = false;
13943799f97d539f6c288d169063e1b335917fafcffbDevang Patel
13951554c8545651350569f08dc7370189da1a7e5814Devang Patel  for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
13961554c8545651350569f08dc7370189da1a7e5814Devang Patel    FunctionPass *FP = getContainedPass(Index);
13973799f97d539f6c288d169063e1b335917fafcffbDevang Patel    Changed |= FP->doFinalization(M);
13983799f97d539f6c288d169063e1b335917fafcffbDevang Patel  }
13993799f97d539f6c288d169063e1b335917fafcffbDevang Patel
14003799f97d539f6c288d169063e1b335917fafcffbDevang Patel  return Changed;
14013799f97d539f6c288d169063e1b335917fafcffbDevang Patel}
14023799f97d539f6c288d169063e1b335917fafcffbDevang Patel
140306e86561a5261a59f5c391d5cc5cb4aa38dca83cDevang Patel//===----------------------------------------------------------------------===//
14045f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel// MPPassManager implementation
140592c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel
140692c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel/// Add P into pass vector if it is manageble. If P is a FunctionPass
14075f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel/// then use FPPassManager to manage it. Return false if P
140892c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel/// is not manageable by this manager.
140992c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patelbool
14105f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang PatelMPPassManager::addPass(Pass *P) {
141192c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel
141292c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel  // If P is FunctionPass then use function pass maanager.
141392c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel  if (FunctionPass *FP = dynamic_cast<FunctionPass*>(P)) {
141492c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel
141569867b511c732a7fac7301977bd6e880e46439f1Devang Patel    if (!activeFunctionPassManager || !activeFunctionPassManager->addPass(P)) {
141692c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel
1417badc4fae531cc0fdaa8e58f481c3b1d23ea7dd56Devang Patel      // If active manager exists then clear its analysis info.
1418badc4fae531cc0fdaa8e58f481c3b1d23ea7dd56Devang Patel      if (activeFunctionPassManager)
1419badc4fae531cc0fdaa8e58f481c3b1d23ea7dd56Devang Patel        activeFunctionPassManager->initializeAnalysisInfo();
1420b917e38c84fa9c7c434762a0e587af63eec939e5Devang Patel
1421badc4fae531cc0fdaa8e58f481c3b1d23ea7dd56Devang Patel      // Create and add new manager
1422f72d29c540bf32b9c0e8914484cbbdeac70ee12aDevang Patel      activeFunctionPassManager =
14235f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel        new FPPassManager(getDepth() + 1);
14241b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel
14251b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel      // Add new manager into current manager's list
1426893a5a681585cdf3b5bfff7128ea522e8a47750aDevang Patel      addPassToManager(activeFunctionPassManager, false);
14271b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel
1428dff33ef8e863241193463fd0129657c5ebce4d58Devang Patel      // Inherit top level manager
1429dff33ef8e863241193463fd0129657c5ebce4d58Devang Patel      activeFunctionPassManager->setTopLevelManager(this->getTopLevelManager());
14301b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel
14311b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel      // Add new manager into top level manager's indirect passes list
14326e9e5e026af9e26cdec634c79017199f4e718599Chris Lattner      PMDataManager *PMD =
14336e9e5e026af9e26cdec634c79017199f4e718599Chris Lattner        dynamic_cast<PMDataManager *>(activeFunctionPassManager);
14346e9e5e026af9e26cdec634c79017199f4e718599Chris Lattner      assert(PMD && "Manager is not Pass Manager");
14351b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel      TPM->addIndirectPassManager(PMD);
1436591b1b7526ed9c099de23cc995853a250c20502fDevang Patel
1437badc4fae531cc0fdaa8e58f481c3b1d23ea7dd56Devang Patel      // Add pass into new manager. This time it must succeed.
14382c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel      if (!activeFunctionPassManager->addPass(FP))
14392c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel        assert(0 && "Unable to add pass");
1440e16634065021e36ae31f074f623a636924d6b8d1Devang Patel
1441ef89c5594aaa5b97f303ba0de99940b79f2c0e0eDevang Patel      // If activeFunctionPassManager transfered any Last Uses then
1442ef89c5594aaa5b97f303ba0de99940b79f2c0e0eDevang Patel      // handle them here.
1443ef89c5594aaa5b97f303ba0de99940b79f2c0e0eDevang Patel      std::vector<Pass *> &TLU =
1444ef89c5594aaa5b97f303ba0de99940b79f2c0e0eDevang Patel        activeFunctionPassManager->getTransferredLastUses();
1445ef89c5594aaa5b97f303ba0de99940b79f2c0e0eDevang Patel      if (!TLU.empty())
1446ef89c5594aaa5b97f303ba0de99940b79f2c0e0eDevang Patel        TPM->setLastUser(TLU, this);
1447ef89c5594aaa5b97f303ba0de99940b79f2c0e0eDevang Patel    }
1448e16634065021e36ae31f074f623a636924d6b8d1Devang Patel
144992c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel    return true;
145092c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel  }
145192c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel
145292c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel  ModulePass *MP = dynamic_cast<ModulePass *>(P);
145392c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel  if (!MP)
145492c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel    return false;
145592c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel
14561a8038636c2998e37f2130b0ab89a3686d9c1f48Devang Patel  // If this pass does not preserve analysis that is used by other passes
14571a8038636c2998e37f2130b0ab89a3686d9c1f48Devang Patel  // managed by this manager than it is not a suitable pass for this manager.
14582c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel  if (!manageablePass(P))
145953596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel    return false;
146053596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel
1461e253385b108cd946b1ac150302f246d3b218be77Devang Patel  addPassToManager(MP);
1462badc4fae531cc0fdaa8e58f481c3b1d23ea7dd56Devang Patel  // If active manager exists then clear its analysis info.
1463badc4fae531cc0fdaa8e58f481c3b1d23ea7dd56Devang Patel  if (activeFunctionPassManager) {
1464badc4fae531cc0fdaa8e58f481c3b1d23ea7dd56Devang Patel    activeFunctionPassManager->initializeAnalysisInfo();
1465badc4fae531cc0fdaa8e58f481c3b1d23ea7dd56Devang Patel    activeFunctionPassManager = NULL;
1466badc4fae531cc0fdaa8e58f481c3b1d23ea7dd56Devang Patel  }
1467badc4fae531cc0fdaa8e58f481c3b1d23ea7dd56Devang Patel
146892c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel  return true;
146992c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel}
147092c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel
147192c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel
147292c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel/// Execute all of the passes scheduled for execution by invoking
147392c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel/// runOnModule method.  Keep track of whether any of the passes modifies
147492c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel/// the module, and if so, return true.
147592c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patelbool
14765f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang PatelMPPassManager::runOnModule(Module &M) {
147792c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel  bool Changed = false;
1478c1d6e1fc9c3a47529f417026df652f466ce67851Devang Patel
1479693a74e4ee34e2058dab7121c17c98ec59258a8aDevang Patel  std::string Msg1 = "Executing Pass '";
1480693a74e4ee34e2058dab7121c17c98ec59258a8aDevang Patel  std::string Msg3 = "' Made Modification '";
1481693a74e4ee34e2058dab7121c17c98ec59258a8aDevang Patel
14821554c8545651350569f08dc7370189da1a7e5814Devang Patel  for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
14831554c8545651350569f08dc7370189da1a7e5814Devang Patel    ModulePass *MP = getContainedPass(Index);
14841554c8545651350569f08dc7370189da1a7e5814Devang Patel
1485017b5d969b12119a88463fe2451f20ca9214c4ffDevang Patel    AnalysisUsage AnUsage;
14861554c8545651350569f08dc7370189da1a7e5814Devang Patel    MP->getAnalysisUsage(AnUsage);
1487693a74e4ee34e2058dab7121c17c98ec59258a8aDevang Patel
14884eeea774ce1b24fa55c06aac31e02016d5dd77d6Devang Patel    std::string Msg2 = "' on Module '" + M.getModuleIdentifier() + "'...\n";
14891554c8545651350569f08dc7370189da1a7e5814Devang Patel    dumpPassInfo(MP, Msg1, Msg2);
14901554c8545651350569f08dc7370189da1a7e5814Devang Patel    dumpAnalysisSetInfo("Required", MP, AnUsage.getRequiredSet());
1491693a74e4ee34e2058dab7121c17c98ec59258a8aDevang Patel
14921554c8545651350569f08dc7370189da1a7e5814Devang Patel    initializeAnalysisImpl(MP);
14938e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel
14941554c8545651350569f08dc7370189da1a7e5814Devang Patel    if (TheTimeInfo) TheTimeInfo->passStarted(MP);
149592c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel    Changed |= MP->runOnModule(M);
14961554c8545651350569f08dc7370189da1a7e5814Devang Patel    if (TheTimeInfo) TheTimeInfo->passEnded(MP);
1497693a74e4ee34e2058dab7121c17c98ec59258a8aDevang Patel
1498693a74e4ee34e2058dab7121c17c98ec59258a8aDevang Patel    if (Changed)
14991554c8545651350569f08dc7370189da1a7e5814Devang Patel      dumpPassInfo(MP, Msg3, Msg2);
15001554c8545651350569f08dc7370189da1a7e5814Devang Patel    dumpAnalysisSetInfo("Preserved", MP, AnUsage.getPreservedSet());
1501017b5d969b12119a88463fe2451f20ca9214c4ffDevang Patel
15021554c8545651350569f08dc7370189da1a7e5814Devang Patel    removeNotPreservedAnalysis(MP);
15031554c8545651350569f08dc7370189da1a7e5814Devang Patel    recordAvailableAnalysis(MP);
15041554c8545651350569f08dc7370189da1a7e5814Devang Patel    removeDeadPasses(MP, Msg2);
150592c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel  }
150692c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel  return Changed;
150792c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel}
150892c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel
150906e86561a5261a59f5c391d5cc5cb4aa38dca83cDevang Patel//===----------------------------------------------------------------------===//
151006e86561a5261a59f5c391d5cc5cb4aa38dca83cDevang Patel// PassManagerImpl implementation
151137a6f7966c39f69a92419d37949a94a758c29e90Devang Patel//
1512b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel/// Add P into active pass manager or use new module pass manager to
1513b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel/// manage it.
15145f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patelbool PassManagerImpl::addPass(Pass *P) {
1515b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel
1516a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel  if (!activeManager || !activeManager->addPass(P)) {
151709e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel
15185f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel    activeManager = new MPPassManager(getDepth() + 1);
151909e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel
1520dff33ef8e863241193463fd0129657c5ebce4d58Devang Patel    // Inherit top level manager
1521dff33ef8e863241193463fd0129657c5ebce4d58Devang Patel    activeManager->setTopLevelManager(this->getTopLevelManager());
1522145e83dc12a3f962b999f348474ebb07a36a7b81Devang Patel
1523145e83dc12a3f962b999f348474ebb07a36a7b81Devang Patel    // This top level manager is going to manage activeManager.
1524145e83dc12a3f962b999f348474ebb07a36a7b81Devang Patel    // Set up analysis resolver to connect them.
1525cde53d3c1e9d6a2add5de847b44818fbb1d69c20Devang Patel    AnalysisResolver *AR = new AnalysisResolver(*this);
1526145e83dc12a3f962b999f348474ebb07a36a7b81Devang Patel    activeManager->setResolver(AR);
1527145e83dc12a3f962b999f348474ebb07a36a7b81Devang Patel
1528a083e94f7971ddafb817b1bcd86992d9fc4d8f9eDevang Patel    addPassManager(activeManager);
1529502f19e0f8ba47b5916a7e9d445f4ee071cdf132Devang Patel    return activeManager->addPass(P);
1530b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel  }
1531502f19e0f8ba47b5916a7e9d445f4ee071cdf132Devang Patel  return true;
1532b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel}
1533b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel
1534b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel/// run - Execute all of the passes scheduled for execution.  Keep track of
1535b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel/// whether any of the passes modifies the module, and if so, return true.
15365f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patelbool PassManagerImpl::run(Module &M) {
1537b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel
1538b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel  bool Changed = false;
153945dc02d6f97447785ee7ffe08c36a34bc8921b0bDevang Patel
15408e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel  TimingInfo::createTheTimeInfo();
15418e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel
1542c32cf54101ecaf336d161fecd58667870149169cDevang Patel  dumpArguments();
15435f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  dumpPasses();
154445dc02d6f97447785ee7ffe08c36a34bc8921b0bDevang Patel
15451336a6bf06e64a096217628d2cc9644e48a5d7d6Devang Patel  initializeAllAnalysisInfo();
15465f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  for (unsigned Index = 0; Index < getNumContainedManagers(); ++Index) {
15475f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel    MPPassManager *MP = getContainedManager(Index);
1548a083e94f7971ddafb817b1bcd86992d9fc4d8f9eDevang Patel    Changed |= MP->runOnModule(M);
1549b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel  }
1550b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel  return Changed;
1551b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel}
15525a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
155306e86561a5261a59f5c391d5cc5cb4aa38dca83cDevang Patel//===----------------------------------------------------------------------===//
155406e86561a5261a59f5c391d5cc5cb4aa38dca83cDevang Patel// PassManager implementation
155506e86561a5261a59f5c391d5cc5cb4aa38dca83cDevang Patel
15565a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel/// Create new pass manager
15573162691f69f85f740bc28f3ddca39b166d35187cDevang PatelPassManager::PassManager() {
15585f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  PM = new PassManagerImpl(0);
1559dff33ef8e863241193463fd0129657c5ebce4d58Devang Patel  // PM is the top level manager
1560dff33ef8e863241193463fd0129657c5ebce4d58Devang Patel  PM->setTopLevelManager(PM);
15615a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel}
15625a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
15633162691f69f85f740bc28f3ddca39b166d35187cDevang PatelPassManager::~PassManager() {
156437a6f7966c39f69a92419d37949a94a758c29e90Devang Patel  delete PM;
156537a6f7966c39f69a92419d37949a94a758c29e90Devang Patel}
156637a6f7966c39f69a92419d37949a94a758c29e90Devang Patel
15675a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel/// add - Add a pass to the queue of passes to run.  This passes ownership of
15685a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel/// the Pass to the PassManager.  When the PassManager is destroyed, the pass
15695a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel/// will be destroyed as well, so there is no need to delete the pass.  This
15705a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel/// implies that all passes MUST be allocated with 'new'.
15715a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patelvoid
15723162691f69f85f740bc28f3ddca39b166d35187cDevang PatelPassManager::add(Pass *P) {
15735a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  PM->add(P);
15745a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel}
15755a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
15765a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel/// run - Execute all of the passes scheduled for execution.  Keep track of
15775a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel/// whether any of the passes modifies the module, and if so, return true.
15785a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patelbool
15793162691f69f85f740bc28f3ddca39b166d35187cDevang PatelPassManager::run(Module &M) {
15805a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  return PM->run(M);
15815a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel}
15825a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
15838e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel//===----------------------------------------------------------------------===//
15848e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel// TimingInfo Class - This class is used to calculate information about the
15858e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel// amount of time each pass takes to execute.  This only happens with
15868e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel// -time-passes is enabled on the command line.
15878e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel//
15888e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patelbool llvm::TimePassesIsEnabled = false;
15898e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patelstatic cl::opt<bool,true>
15908e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang PatelEnableTiming("time-passes", cl::location(TimePassesIsEnabled),
15918e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel            cl::desc("Time each pass, printing elapsed time for each on exit"));
15928e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel
15938e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel// createTheTimeInfo - This method either initializes the TheTimeInfo pointer to
15948e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel// a non null value (if the -time-passes option is enabled) or it leaves it
15958e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel// null.  It may be called multiple times.
15968e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patelvoid TimingInfo::createTheTimeInfo() {
15978e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel  if (!TimePassesIsEnabled || TheTimeInfo) return;
15988e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel
15998e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel  // Constructed the first time this is called, iff -time-passes is enabled.
16008e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel  // This guarantees that the object will be constructed before static globals,
16018e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel  // thus it will be destroyed before them.
16028e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel  static ManagedStatic<TimingInfo> TTI;
16038e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel  TheTimeInfo = &*TTI;
16048e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel}
16058e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel
160609e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel//===----------------------------------------------------------------------===//
160709e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel// PMStack implementation
160809e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel//
160909e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel// Pop Pass Manager from the stack and clear its analysis info.
161009e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patelvoid PMStack::pop() {
161109e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel
161209e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel  PMDataManager *Top = this->top();
161309e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel  Top->initializeAnalysisInfo();
161409e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel
161509e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel  S.pop_back();
161609e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel}
161709e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel
161809e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel// Push PM on the stack and set its top level manager.
161909e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patelvoid PMStack::push(PMDataManager *PM) {
162009e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel
162109e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel  PMDataManager *Top = this->top();
162209e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel
162309e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel  // Inherit top level manager
162409e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel  PMTopLevelManager *TPM = Top->getTopLevelManager();
162509e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel  PM->setTopLevelManager(TPM);
162609e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel  TPM->addIndirectPassManager(PM);
162709e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel}
162809e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel
162909e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel// Walk Pass Manager stack and set LastUse markers if any
163009e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel// manager is transfering this priviledge to its parent manager
163109e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patelvoid PMStack::handleLastUserOverflow() {
163209e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel
163309e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel  for(PMStack::iterator I = this->begin(), E = this->end(); I != E;) {
163409e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel
163509e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel    PMDataManager *Child = *I++;
163609e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel    if (I != E) {
163709e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel      PMDataManager *Parent = *I++;
163809e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel      PMTopLevelManager *TPM = Parent->getTopLevelManager();
163909e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel      std::vector<Pass *> &TLU = Child->getTransferredLastUses();
164009e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel      if (!TLU.empty()) {
164109e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel        Pass *P = dynamic_cast<Pass *>(Parent);
164209e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel        TPM->setLastUser(TLU, P);
164309e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel      }
164409e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel    }
164509e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel  }
164609e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel}
164709e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel
164809e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel/// Find appropriate Module Pass Manager in the PM Stack and
164909e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel/// add self into that manager.
165009e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patelvoid ModulePass::assignPassManager(PMStack &PMS) {
165109e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel
165209e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel  MPPassManager *MPP = NULL;
165309e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel
165409e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel  // Find Module Pass Manager
165509e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel  while(!PMS.empty()) {
165609e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel
165709e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel    MPP = dynamic_cast<MPPassManager *>(PMS.top());
165809e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel    if (MPP)
165909e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel      break;        // Found it
166009e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel    else
166109e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel      PMS.pop();    // Pop children pass managers
166209e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel  }
166309e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel
166409e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel  assert(MPP && "Unable to find Module Pass Manager");
166509e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel
166609e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel  MPP->addPassToManager(this);
166709e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel}
166809e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel
166909e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel/// Find appropriate Function Pass Manager or Call Graph Pass Manager
167009e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel/// in the PM Stack and add self into that manager.
167109e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patelvoid FunctionPass::assignPassManager(PMStack &PMS) {
167209e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel
167309e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel  FPPassManager *FPP = NULL;
167409e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel
167509e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel  // Find Module Pass Manager
167609e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel  while(!PMS.empty()) {
167709e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel
167809e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel    FPP = dynamic_cast<FPPassManager *>(PMS.top());
167909e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel    if (FPP || dynamic_cast<MPPassManager *>(PMS.top()))
168009e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel      break;        // Found it or it is not here
168109e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel    else
168209e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel      PMS.pop();    // Pop children pass managers
168309e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel  }
168409e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel
168509e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel  if (!FPP) {
168609e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel    /// Create new Function Pass Manager
168709e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel
168809e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel    /// Function Pass Manager does not live by itself
168909e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel    assert(!PMS.empty() && "Unable to create Function Pass Manager");
169009e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel
169109e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel    PMDataManager *PMD = PMS.top();
169209e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel
169309e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel    /// PMD should be either Module Pass Manager or Call Graph Pass Manager
169409e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel    assert(dynamic_cast<MPPassManager *>(PMD) &&
169509e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel           "Unable to create Function Pass Manager");
169609e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel
169709e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel    FPP = new FPPassManager(PMD->getDepth() + 1);
169809e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel    PMD->addPassToManager(FPP, false);
169909e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel    PMS.push(FPP);
170009e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel  }
170109e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel
170209e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel
170309e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel  FPP->addPassToManager(this);
170409e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel}
170509e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel
170609e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel/// Find appropriate Basic Pass Manager or Call Graph Pass Manager
170709e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel/// in the PM Stack and add self into that manager.
170809e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patelvoid BasicBlockPass::assignPassManager(PMStack &PMS) {
170909e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel
171009e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel  BBPassManager *BBP = NULL;
171109e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel
171209e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel  // Find Module Pass Manager
171309e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel  while(!PMS.empty()) {
171409e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel
171509e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel    BBP = dynamic_cast<BBPassManager *>(PMS.top());
171609e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel    if (BBP || dynamic_cast<FPPassManager *>(PMS.top()))
171709e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel      break;        // Found it or it is not here
171809e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel    else
171909e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel      PMS.pop();    // Pop children pass managers
172009e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel  }
172109e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel
172209e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel  if (!BBP) {
172309e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel    /// Create new BasicBlock Pass Manager
172409e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel
172509e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel    /// BasicBlock Pass Manager does not live by itself
172609e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel    assert(!PMS.empty() && "Unable to create BasicBlock Pass Manager");
172709e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel
172809e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel    PMDataManager *PMD = PMS.top();
172909e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel
173009e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel    /// PMD should be Function Pass Manager
173109e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel    assert(dynamic_cast<FPPassManager *>(PMD) &&
173209e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel           "Unable to create BasicBlock Pass Manager");
173309e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel
173409e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel    BBP = new BBPassManager(PMD->getDepth() + 1);
173509e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel    PMD->addPassToManager(BBP, false);
173609e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel    PMS.push(BBP);
173709e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel  }
173809e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel
173909e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel  BBP->addPassToManager(this);
174009e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel}
174109e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel
1742cccd80dfa316019047f053c55f1b94f63b17c043Devang Patel
1743