PassManager.cpp revision 5cbf985dcbc89fba3208e7baf8b6f488b06d3ec9
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
15ab7752c1496c2913793305ba4b989a551c5617e1Devang Patel#include "llvm/PassManagers.h"
1645dc02d6f97447785ee7ffe08c36a34bc8921b0bDevang Patel#include "llvm/Support/CommandLine.h"
17c874eb54ecf57f493c49934a327e0e4e49f0ff10Devang 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
25ab7752c1496c2913793305ba4b989a551c5617e1Devang Patel// See PassManagers.h for Pass Manager infrastructure overview.
26e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel
2745dc02d6f97447785ee7ffe08c36a34bc8921b0bDevang Patelnamespace llvm {
2845dc02d6f97447785ee7ffe08c36a34bc8921b0bDevang Patel
2945dc02d6f97447785ee7ffe08c36a34bc8921b0bDevang Patel//===----------------------------------------------------------------------===//
3045dc02d6f97447785ee7ffe08c36a34bc8921b0bDevang Patel// Pass debugging information.  Often it is useful to find out what pass is
3145dc02d6f97447785ee7ffe08c36a34bc8921b0bDevang Patel// running when a crash occurs in a utility.  When this library is compiled with
3245dc02d6f97447785ee7ffe08c36a34bc8921b0bDevang Patel// debugging on, a command line option (--debug-pass) is enabled that causes the
3345dc02d6f97447785ee7ffe08c36a34bc8921b0bDevang Patel// pass name to be printed before it executes.
3445dc02d6f97447785ee7ffe08c36a34bc8921b0bDevang Patel//
3545dc02d6f97447785ee7ffe08c36a34bc8921b0bDevang Patel
36e8ff1ce7343c697ff90d940c8c5fa8fccc09220dDevang Patel// Different debug levels that can be enabled...
37e8ff1ce7343c697ff90d940c8c5fa8fccc09220dDevang Patelenum PassDebugLevel {
38e8ff1ce7343c697ff90d940c8c5fa8fccc09220dDevang Patel  None, Arguments, Structure, Executions, Details
39e8ff1ce7343c697ff90d940c8c5fa8fccc09220dDevang Patel};
40e8ff1ce7343c697ff90d940c8c5fa8fccc09220dDevang Patel
4145dc02d6f97447785ee7ffe08c36a34bc8921b0bDevang Patelstatic cl::opt<enum PassDebugLevel>
4226426949f33e5a77fbd2fa330f7df5626e8b177dDevang PatelPassDebugging("debug-pass", cl::Hidden,
4345dc02d6f97447785ee7ffe08c36a34bc8921b0bDevang Patel                  cl::desc("Print PassManager debugging information"),
4445dc02d6f97447785ee7ffe08c36a34bc8921b0bDevang Patel                  cl::values(
45e8ff1ce7343c697ff90d940c8c5fa8fccc09220dDevang Patel  clEnumVal(None      , "disable debug output"),
46e8ff1ce7343c697ff90d940c8c5fa8fccc09220dDevang Patel  clEnumVal(Arguments , "print pass arguments to pass to 'opt'"),
47e8ff1ce7343c697ff90d940c8c5fa8fccc09220dDevang Patel  clEnumVal(Structure , "print pass structure before run()"),
48e8ff1ce7343c697ff90d940c8c5fa8fccc09220dDevang Patel  clEnumVal(Executions, "print pass name before it is executed"),
49e8ff1ce7343c697ff90d940c8c5fa8fccc09220dDevang Patel  clEnumVal(Details   , "print pass details when it is executed"),
5045dc02d6f97447785ee7ffe08c36a34bc8921b0bDevang Patel                             clEnumValEnd));
5145dc02d6f97447785ee7ffe08c36a34bc8921b0bDevang Patel} // End of llvm namespace
5245dc02d6f97447785ee7ffe08c36a34bc8921b0bDevang Patel
53c2ff962bf97761a54c94d2dadb555060403d49c6Devang Patelnamespace {
541b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel
553f5d2b58b84cb12a9520dd33921ca556d539eb4dDevang Patel//===----------------------------------------------------------------------===//
565f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel// BBPassManager
577e601a70fcaf0a3090368425bbb339aab038d3e3Devang Patel//
585f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel/// BBPassManager manages BasicBlockPass. It batches all the
59c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel/// pass together and sequence them to process one basic block before
60c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel/// processing next basic block.
615f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patelclass VISIBILITY_HIDDEN BBPassManager : public PMDataManager,
625f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel                                        public FunctionPass {
63c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
64c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patelpublic:
655f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  BBPassManager(int Depth) : PMDataManager(Depth) { }
66c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
67c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// Execute all of the passes scheduled for execution.  Keep track of
68c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// whether any of the passes modifies the function, and if so, return true.
69c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  bool runOnFunction(Function &F);
70c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
7166d72e140bf7bdfe03383bfb4d3fe53a420d147bDevang Patel  /// Pass Manager itself does not invalidate any analysis info.
7266d72e140bf7bdfe03383bfb4d3fe53a420d147bDevang Patel  void getAnalysisUsage(AnalysisUsage &Info) const {
7366d72e140bf7bdfe03383bfb4d3fe53a420d147bDevang Patel    Info.setPreservesAll();
7466d72e140bf7bdfe03383bfb4d3fe53a420d147bDevang Patel  }
7566d72e140bf7bdfe03383bfb4d3fe53a420d147bDevang Patel
76964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel  bool doInitialization(Module &M);
77964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel  bool doInitialization(Function &F);
78964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel  bool doFinalization(Module &M);
79964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel  bool doFinalization(Function &F);
80964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel
81ebc0922eeb5b728d33a68d4bea8128413f62e369Devang Patel  // Print passes managed by this manager
82ebc0922eeb5b728d33a68d4bea8128413f62e369Devang Patel  void dumpPassStructure(unsigned Offset) {
83c2ff962bf97761a54c94d2dadb555060403d49c6Devang Patel    llvm::cerr << std::string(Offset*2, ' ') << "BasicBlockPass Manager\n";
841554c8545651350569f08dc7370189da1a7e5814Devang Patel    for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
851554c8545651350569f08dc7370189da1a7e5814Devang Patel      BasicBlockPass *BP = getContainedPass(Index);
861554c8545651350569f08dc7370189da1a7e5814Devang Patel      BP->dumpPassStructure(Offset + 1);
871554c8545651350569f08dc7370189da1a7e5814Devang Patel      dumpLastUses(BP, Offset+1);
88ebc0922eeb5b728d33a68d4bea8128413f62e369Devang Patel    }
89ebc0922eeb5b728d33a68d4bea8128413f62e369Devang Patel  }
901554c8545651350569f08dc7370189da1a7e5814Devang Patel
911554c8545651350569f08dc7370189da1a7e5814Devang Patel  BasicBlockPass *getContainedPass(unsigned N) {
921554c8545651350569f08dc7370189da1a7e5814Devang Patel    assert ( N < PassVector.size() && "Pass number out of range!");
931554c8545651350569f08dc7370189da1a7e5814Devang Patel    BasicBlockPass *BP = static_cast<BasicBlockPass *>(PassVector[N]);
941554c8545651350569f08dc7370189da1a7e5814Devang Patel    return BP;
951554c8545651350569f08dc7370189da1a7e5814Devang Patel  }
9625919cb7802f2682b159a040ba07c5bd12b54efaDevang Patel
9725919cb7802f2682b159a040ba07c5bd12b54efaDevang Patel  virtual PassManagerType getPassManagerType() {
9825919cb7802f2682b159a040ba07c5bd12b54efaDevang Patel    return PMT_BasicBlockPassManager;
9925919cb7802f2682b159a040ba07c5bd12b54efaDevang Patel  }
100c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel};
101c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
102ab7752c1496c2913793305ba4b989a551c5617e1Devang Patel}
1031554c8545651350569f08dc7370189da1a7e5814Devang Patel
104ab7752c1496c2913793305ba4b989a551c5617e1Devang Patelnamespace llvm {
1055f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel
1065f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel//===----------------------------------------------------------------------===//
1075f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel// FunctionPassManagerImpl
1085f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel//
1095f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel/// FunctionPassManagerImpl manages FPPassManagers
1105f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patelclass FunctionPassManagerImpl : public Pass,
11136bcb82c3f7acd7cc3a79f51102c5995db2fb723Devang Patel                                public PMDataManager,
11236bcb82c3f7acd7cc3a79f51102c5995db2fb723Devang Patel                                public PMTopLevelManager {
1135f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patelpublic:
1145f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel
1158f3f3d103a8b92bd0514ab5998865205e17ef550Devang Patel  FunctionPassManagerImpl(int Depth) : PMDataManager(Depth),
1168f3f3d103a8b92bd0514ab5998865205e17ef550Devang Patel                                       PMTopLevelManager(TLM_Function) { }
1175f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel
1185f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  /// add - Add a pass to the queue of passes to run.  This passes ownership of
1195f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  /// the Pass to the PassManager.  When the PassManager is destroyed, the pass
1205f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  /// will be destroyed as well, so there is no need to delete the pass.  This
1215f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  /// implies that all passes MUST be allocated with 'new'.
1225f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  void add(Pass *P) {
1235f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel    schedulePass(P);
1245f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  }
1255f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel
1265f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  /// run - Execute all of the passes scheduled for execution.  Keep track of
1275f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  /// whether any of the passes modifies the module, and if so, return true.
1285f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  bool run(Function &F);
1295f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel
1305f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  /// doInitialization - Run all of the initializers for the function passes.
1315f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  ///
1325f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  bool doInitialization(Module &M);
1335f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel
1345f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  /// doFinalization - Run all of the initializers for the function passes.
1355f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  ///
1365f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  bool doFinalization(Module &M);
1375f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel
1385f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  /// Pass Manager itself does not invalidate any analysis info.
1395f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  void getAnalysisUsage(AnalysisUsage &Info) const {
1405f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel    Info.setPreservesAll();
1415f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  }
1425f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel
1435f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  inline void addTopLevelPass(Pass *P) {
1445f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel
1455f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel    if (ImmutablePass *IP = dynamic_cast<ImmutablePass *> (P)) {
1465f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel
1475f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel      // P is a immutable pass and it will be managed by this
1485f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel      // top level manager. Set up analysis resolver to connect them.
149cde53d3c1e9d6a2add5de847b44818fbb1d69c20Devang Patel      AnalysisResolver *AR = new AnalysisResolver(*this);
1505f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel      P->setResolver(AR);
1515f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel      initializeAnalysisImpl(P);
1525f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel      addImmutablePass(IP);
1535f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel      recordAvailableAnalysis(IP);
154a0dd987916b6e8dd445c35bdd456c55e7cd6fa3bDevang Patel    } else {
155a0dd987916b6e8dd445c35bdd456c55e7cd6fa3bDevang Patel      P->assignPassManager(activeStack);
1565f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel    }
157a0dd987916b6e8dd445c35bdd456c55e7cd6fa3bDevang Patel
1585f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  }
1595f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel
1605f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  FPPassManager *getContainedManager(unsigned N) {
1615f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel    assert ( N < PassManagers.size() && "Pass number out of range!");
1625f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel    FPPassManager *FP = static_cast<FPPassManager *>(PassManagers[N]);
1635f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel    return FP;
1645f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  }
1655f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel
166c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel};
167c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
1687e601a70fcaf0a3090368425bbb339aab038d3e3Devang Patel//===----------------------------------------------------------------------===//
1695f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel// MPPassManager
1707e601a70fcaf0a3090368425bbb339aab038d3e3Devang Patel//
1715f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel/// MPPassManager manages ModulePasses and function pass managers.
172c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel/// It batches all Module passes  passes and function pass managers together and
173c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel/// sequence them to process one module.
1745f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patelclass MPPassManager : public Pass, public PMDataManager {
175c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
176c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patelpublic:
177a0dd987916b6e8dd445c35bdd456c55e7cd6fa3bDevang Patel  MPPassManager(int Depth) : PMDataManager(Depth) { }
178c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
179c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// run - Execute all of the passes scheduled for execution.  Keep track of
180c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  /// whether any of the passes modifies the module, and if so, return true.
181c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel  bool runOnModule(Module &M);
182be6d515f481756ff549f355e32be1ac398e141d5Devang Patel
18366d72e140bf7bdfe03383bfb4d3fe53a420d147bDevang Patel  /// Pass Manager itself does not invalidate any analysis info.
18466d72e140bf7bdfe03383bfb4d3fe53a420d147bDevang Patel  void getAnalysisUsage(AnalysisUsage &Info) const {
18566d72e140bf7bdfe03383bfb4d3fe53a420d147bDevang Patel    Info.setPreservesAll();
18666d72e140bf7bdfe03383bfb4d3fe53a420d147bDevang Patel  }
18766d72e140bf7bdfe03383bfb4d3fe53a420d147bDevang Patel
188ebc0922eeb5b728d33a68d4bea8128413f62e369Devang Patel  // Print passes managed by this manager
189ebc0922eeb5b728d33a68d4bea8128413f62e369Devang Patel  void dumpPassStructure(unsigned Offset) {
190ebc0922eeb5b728d33a68d4bea8128413f62e369Devang Patel    llvm::cerr << std::string(Offset*2, ' ') << "ModulePass Manager\n";
1911554c8545651350569f08dc7370189da1a7e5814Devang Patel    for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
1921554c8545651350569f08dc7370189da1a7e5814Devang Patel      ModulePass *MP = getContainedPass(Index);
1931554c8545651350569f08dc7370189da1a7e5814Devang Patel      MP->dumpPassStructure(Offset + 1);
1941554c8545651350569f08dc7370189da1a7e5814Devang Patel      dumpLastUses(MP, Offset+1);
195ebc0922eeb5b728d33a68d4bea8128413f62e369Devang Patel    }
196ebc0922eeb5b728d33a68d4bea8128413f62e369Devang Patel  }
197ebc0922eeb5b728d33a68d4bea8128413f62e369Devang Patel
1981554c8545651350569f08dc7370189da1a7e5814Devang Patel  ModulePass *getContainedPass(unsigned N) {
1991554c8545651350569f08dc7370189da1a7e5814Devang Patel    assert ( N < PassVector.size() && "Pass number out of range!");
2001554c8545651350569f08dc7370189da1a7e5814Devang Patel    ModulePass *MP = static_cast<ModulePass *>(PassVector[N]);
2011554c8545651350569f08dc7370189da1a7e5814Devang Patel    return MP;
2021554c8545651350569f08dc7370189da1a7e5814Devang Patel  }
2031554c8545651350569f08dc7370189da1a7e5814Devang Patel
20425919cb7802f2682b159a040ba07c5bd12b54efaDevang Patel  virtual PassManagerType getPassManagerType() { return PMT_ModulePassManager; }
205c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel};
206c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
2077e601a70fcaf0a3090368425bbb339aab038d3e3Devang Patel//===----------------------------------------------------------------------===//
2085f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel// PassManagerImpl
2097e601a70fcaf0a3090368425bbb339aab038d3e3Devang Patel//
2105f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel/// PassManagerImpl manages MPPassManagers
2115f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patelclass PassManagerImpl : public Pass,
21236bcb82c3f7acd7cc3a79f51102c5995db2fb723Devang Patel                        public PMDataManager,
21336bcb82c3f7acd7cc3a79f51102c5995db2fb723Devang Patel                        public PMTopLevelManager {
2145a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
2155a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patelpublic:
2165a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
2178f3f3d103a8b92bd0514ab5998865205e17ef550Devang Patel  PassManagerImpl(int Depth) : PMDataManager(Depth),
2188f3f3d103a8b92bd0514ab5998865205e17ef550Devang Patel                               PMTopLevelManager(TLM_Pass) { }
219f72d29c540bf32b9c0e8914484cbbdeac70ee12aDevang Patel
2205a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  /// add - Add a pass to the queue of passes to run.  This passes ownership of
2215a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  /// the Pass to the PassManager.  When the PassManager is destroyed, the pass
2225a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  /// will be destroyed as well, so there is no need to delete the pass.  This
2235a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  /// implies that all passes MUST be allocated with 'new'.
224877bfbb9ef75e7fe333d93abecaf0579780ccf54Devang Patel  void add(Pass *P) {
225e61b7478e53cea3183d4aee3799a4f0977b850a0Devang Patel    schedulePass(P);
226877bfbb9ef75e7fe333d93abecaf0579780ccf54Devang Patel  }
2275a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
2285a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  /// run - Execute all of the passes scheduled for execution.  Keep track of
2295a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  /// whether any of the passes modifies the module, and if so, return true.
2305a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  bool run(Module &M);
2315a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
23266d72e140bf7bdfe03383bfb4d3fe53a420d147bDevang Patel  /// Pass Manager itself does not invalidate any analysis info.
23366d72e140bf7bdfe03383bfb4d3fe53a420d147bDevang Patel  void getAnalysisUsage(AnalysisUsage &Info) const {
23466d72e140bf7bdfe03383bfb4d3fe53a420d147bDevang Patel    Info.setPreservesAll();
23566d72e140bf7bdfe03383bfb4d3fe53a420d147bDevang Patel  }
23666d72e140bf7bdfe03383bfb4d3fe53a420d147bDevang Patel
237eb0d613ef6755f93610e08534a203c41ec14b56aDevang Patel  inline void addTopLevelPass(Pass *P) {
238145e83dc12a3f962b999f348474ebb07a36a7b81Devang Patel
239c9a6293af7b433146d8f7ecf8fa494b530af9376Devang Patel    if (ImmutablePass *IP = dynamic_cast<ImmutablePass *> (P)) {
240145e83dc12a3f962b999f348474ebb07a36a7b81Devang Patel
241145e83dc12a3f962b999f348474ebb07a36a7b81Devang Patel      // P is a immutable pass and it will be managed by this
242145e83dc12a3f962b999f348474ebb07a36a7b81Devang Patel      // top level manager. Set up analysis resolver to connect them.
243cde53d3c1e9d6a2add5de847b44818fbb1d69c20Devang Patel      AnalysisResolver *AR = new AnalysisResolver(*this);
244145e83dc12a3f962b999f348474ebb07a36a7b81Devang Patel      P->setResolver(AR);
245689c683bccbb28b4d18a3dbe1b1c28ee6b90b17aDevang Patel      initializeAnalysisImpl(P);
246c9a6293af7b433146d8f7ecf8fa494b530af9376Devang Patel      addImmutablePass(IP);
247689c683bccbb28b4d18a3dbe1b1c28ee6b90b17aDevang Patel      recordAvailableAnalysis(IP);
248a0dd987916b6e8dd445c35bdd456c55e7cd6fa3bDevang Patel    } else {
249a0dd987916b6e8dd445c35bdd456c55e7cd6fa3bDevang Patel      P->assignPassManager(activeStack);
250145e83dc12a3f962b999f348474ebb07a36a7b81Devang Patel    }
251a0dd987916b6e8dd445c35bdd456c55e7cd6fa3bDevang Patel
252eb0d613ef6755f93610e08534a203c41ec14b56aDevang Patel  }
253eb0d613ef6755f93610e08534a203c41ec14b56aDevang Patel
2545f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  MPPassManager *getContainedManager(unsigned N) {
2555f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel    assert ( N < PassManagers.size() && "Pass number out of range!");
2565f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel    MPPassManager *MP = static_cast<MPPassManager *>(PassManagers[N]);
2575f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel    return MP;
2585f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  }
2595f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel
2605a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel};
2615a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
262c874eb54ecf57f493c49934a327e0e4e49f0ff10Devang Patel} // End of llvm namespace
2638e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel
264c874eb54ecf57f493c49934a327e0e4e49f0ff10Devang Patelnamespace {
265b05ef6a8eb4e06a4c3addb74d7d30eb2150049eaDevang Patel
266c874eb54ecf57f493c49934a327e0e4e49f0ff10Devang Patel//===----------------------------------------------------------------------===//
267c874eb54ecf57f493c49934a327e0e4e49f0ff10Devang Patel// TimingInfo Class - This class is used to calculate information about the
268c874eb54ecf57f493c49934a327e0e4e49f0ff10Devang Patel// amount of time each pass takes to execute.  This only happens when
269c874eb54ecf57f493c49934a327e0e4e49f0ff10Devang Patel// -time-passes is enabled on the command line.
270c874eb54ecf57f493c49934a327e0e4e49f0ff10Devang Patel//
271c874eb54ecf57f493c49934a327e0e4e49f0ff10Devang Patel
272c874eb54ecf57f493c49934a327e0e4e49f0ff10Devang Patelclass VISIBILITY_HIDDEN TimingInfo {
273c874eb54ecf57f493c49934a327e0e4e49f0ff10Devang Patel  std::map<Pass*, Timer> TimingData;
274c874eb54ecf57f493c49934a327e0e4e49f0ff10Devang Patel  TimerGroup TG;
275c874eb54ecf57f493c49934a327e0e4e49f0ff10Devang Patel
276c874eb54ecf57f493c49934a327e0e4e49f0ff10Devang Patelpublic:
277c874eb54ecf57f493c49934a327e0e4e49f0ff10Devang Patel  // Use 'create' member to get this.
278c874eb54ecf57f493c49934a327e0e4e49f0ff10Devang Patel  TimingInfo() : TG("... Pass execution timing report ...") {}
279c874eb54ecf57f493c49934a327e0e4e49f0ff10Devang Patel
280c874eb54ecf57f493c49934a327e0e4e49f0ff10Devang Patel  // TimingDtor - Print out information about timing information
281c874eb54ecf57f493c49934a327e0e4e49f0ff10Devang Patel  ~TimingInfo() {
282c874eb54ecf57f493c49934a327e0e4e49f0ff10Devang Patel    // Delete all of the timers...
283c874eb54ecf57f493c49934a327e0e4e49f0ff10Devang Patel    TimingData.clear();
284c874eb54ecf57f493c49934a327e0e4e49f0ff10Devang Patel    // TimerGroup is deleted next, printing the report.
285c874eb54ecf57f493c49934a327e0e4e49f0ff10Devang Patel  }
286c874eb54ecf57f493c49934a327e0e4e49f0ff10Devang Patel
287c874eb54ecf57f493c49934a327e0e4e49f0ff10Devang Patel  // createTheTimeInfo - This method either initializes the TheTimeInfo pointer
288c874eb54ecf57f493c49934a327e0e4e49f0ff10Devang Patel  // to a non null value (if the -time-passes option is enabled) or it leaves it
289c874eb54ecf57f493c49934a327e0e4e49f0ff10Devang Patel  // null.  It may be called multiple times.
290c874eb54ecf57f493c49934a327e0e4e49f0ff10Devang Patel  static void createTheTimeInfo();
291c874eb54ecf57f493c49934a327e0e4e49f0ff10Devang Patel
292c874eb54ecf57f493c49934a327e0e4e49f0ff10Devang Patel  void passStarted(Pass *P) {
293c874eb54ecf57f493c49934a327e0e4e49f0ff10Devang Patel
294c874eb54ecf57f493c49934a327e0e4e49f0ff10Devang Patel    if (dynamic_cast<PMDataManager *>(P))
295c874eb54ecf57f493c49934a327e0e4e49f0ff10Devang Patel      return;
296c874eb54ecf57f493c49934a327e0e4e49f0ff10Devang Patel
297c874eb54ecf57f493c49934a327e0e4e49f0ff10Devang Patel    std::map<Pass*, Timer>::iterator I = TimingData.find(P);
298c874eb54ecf57f493c49934a327e0e4e49f0ff10Devang Patel    if (I == TimingData.end())
299c874eb54ecf57f493c49934a327e0e4e49f0ff10Devang Patel      I=TimingData.insert(std::make_pair(P, Timer(P->getPassName(), TG))).first;
300c874eb54ecf57f493c49934a327e0e4e49f0ff10Devang Patel    I->second.startTimer();
301c874eb54ecf57f493c49934a327e0e4e49f0ff10Devang Patel  }
302c874eb54ecf57f493c49934a327e0e4e49f0ff10Devang Patel  void passEnded(Pass *P) {
303c874eb54ecf57f493c49934a327e0e4e49f0ff10Devang Patel
304c874eb54ecf57f493c49934a327e0e4e49f0ff10Devang Patel    if (dynamic_cast<PMDataManager *>(P))
305c874eb54ecf57f493c49934a327e0e4e49f0ff10Devang Patel      return;
306c874eb54ecf57f493c49934a327e0e4e49f0ff10Devang Patel
307c874eb54ecf57f493c49934a327e0e4e49f0ff10Devang Patel    std::map<Pass*, Timer>::iterator I = TimingData.find(P);
308c874eb54ecf57f493c49934a327e0e4e49f0ff10Devang Patel    assert (I != TimingData.end() && "passStarted/passEnded not nested right!");
309c874eb54ecf57f493c49934a327e0e4e49f0ff10Devang Patel    I->second.stopTimer();
310c874eb54ecf57f493c49934a327e0e4e49f0ff10Devang Patel  }
311c874eb54ecf57f493c49934a327e0e4e49f0ff10Devang Patel};
312c874eb54ecf57f493c49934a327e0e4e49f0ff10Devang Patel
313c874eb54ecf57f493c49934a327e0e4e49f0ff10Devang Patelstatic TimingInfo *TheTimeInfo;
314c874eb54ecf57f493c49934a327e0e4e49f0ff10Devang Patel
315c874eb54ecf57f493c49934a327e0e4e49f0ff10Devang Patel} // End of anon namespace
316c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel
31706e86561a5261a59f5c391d5cc5cb4aa38dca83cDevang Patel//===----------------------------------------------------------------------===//
3181b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel// PMTopLevelManager implementation
3191b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel
3208f3f3d103a8b92bd0514ab5998865205e17ef550Devang Patel/// Initialize top level manager. Create first pass manager.
3218f3f3d103a8b92bd0514ab5998865205e17ef550Devang PatelPMTopLevelManager::PMTopLevelManager (enum TopLevelManagerType t) {
3228f3f3d103a8b92bd0514ab5998865205e17ef550Devang Patel
3238f3f3d103a8b92bd0514ab5998865205e17ef550Devang Patel  if (t == TLM_Pass) {
3248f3f3d103a8b92bd0514ab5998865205e17ef550Devang Patel    MPPassManager *MPP = new MPPassManager(1);
3258f3f3d103a8b92bd0514ab5998865205e17ef550Devang Patel    MPP->setTopLevelManager(this);
3268f3f3d103a8b92bd0514ab5998865205e17ef550Devang Patel    addPassManager(MPP);
3278f3f3d103a8b92bd0514ab5998865205e17ef550Devang Patel    activeStack.push(MPP);
3288f3f3d103a8b92bd0514ab5998865205e17ef550Devang Patel  }
3298f3f3d103a8b92bd0514ab5998865205e17ef550Devang Patel  else if (t == TLM_Function) {
3308f3f3d103a8b92bd0514ab5998865205e17ef550Devang Patel    FPPassManager *FPP = new FPPassManager(1);
3318f3f3d103a8b92bd0514ab5998865205e17ef550Devang Patel    FPP->setTopLevelManager(this);
3328f3f3d103a8b92bd0514ab5998865205e17ef550Devang Patel    addPassManager(FPP);
3338f3f3d103a8b92bd0514ab5998865205e17ef550Devang Patel    activeStack.push(FPP);
3348f3f3d103a8b92bd0514ab5998865205e17ef550Devang Patel  }
3358f3f3d103a8b92bd0514ab5998865205e17ef550Devang Patel}
3368f3f3d103a8b92bd0514ab5998865205e17ef550Devang Patel
3371b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel/// Set pass P as the last user of the given analysis passes.
3381b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patelvoid PMTopLevelManager::setLastUser(std::vector<Pass *> &AnalysisPasses,
3391b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel                                    Pass *P) {
3401b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel
3411b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel  for (std::vector<Pass *>::iterator I = AnalysisPasses.begin(),
3421b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel         E = AnalysisPasses.end(); I != E; ++I) {
3431b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel    Pass *AP = *I;
3441b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel    LastUser[AP] = P;
3451b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel    // If AP is the last user of other passes then make P last user of
3461b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel    // such passes.
3471b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel    for (std::map<Pass *, Pass *>::iterator LUI = LastUser.begin(),
3481b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel           LUE = LastUser.end(); LUI != LUE; ++LUI) {
3491b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel      if (LUI->second == AP)
3501b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel        LastUser[LUI->first] = P;
3511b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel    }
3521b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel  }
3531b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel}
3541b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel
3551b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel/// Collect passes whose last user is P
3561b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patelvoid PMTopLevelManager::collectLastUses(std::vector<Pass *> &LastUses,
3571b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel                                            Pass *P) {
3581b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel   for (std::map<Pass *, Pass *>::iterator LUI = LastUser.begin(),
3591b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel          LUE = LastUser.end(); LUI != LUE; ++LUI)
3601b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel      if (LUI->second == P)
3611b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel        LastUses.push_back(LUI->first);
3621b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel}
3631b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel
3641b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel/// Schedule pass P for execution. Make sure that passes required by
3651b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel/// P are run before P is run. Update analysis info maintained by
3661b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel/// the manager. Remove dead passes. This is a recursive function.
3671b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patelvoid PMTopLevelManager::schedulePass(Pass *P) {
3681b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel
3699d133e150faac44b8d8d1b53516cbad4d9bbf84aDevang Patel  // TODO : Allocate function manager for this pass, other wise required set
3709d133e150faac44b8d8d1b53516cbad4d9bbf84aDevang Patel  // may be inserted into previous function manager
3711b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel
3721b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel  AnalysisUsage AnUsage;
3731b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel  P->getAnalysisUsage(AnUsage);
3741b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel  const std::vector<AnalysisID> &RequiredSet = AnUsage.getRequiredSet();
3751b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel  for (std::vector<AnalysisID>::const_iterator I = RequiredSet.begin(),
3761b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel         E = RequiredSet.end(); I != E; ++I) {
3771b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel
3781b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel    Pass *AnalysisPass = findAnalysisPass(*I);
3791b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel    if (!AnalysisPass) {
3801b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel      // Schedule this analysis run first.
3811b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel      AnalysisPass = (*I)->createPass();
3821b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel      schedulePass(AnalysisPass);
3831b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel    }
3841b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel  }
3851b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel
3861b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel  // Now all required passes are available.
3871b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel  addTopLevelPass(P);
3881b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel}
3891b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel
3901b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel/// Find the pass that implements Analysis AID. Search immutable
3911b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel/// passes and all pass managers. If desired pass is not found
3921b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel/// then return NULL.
3931b8d015066dca364a1b11b6dbe5b80248b111cd5Devang PatelPass *PMTopLevelManager::findAnalysisPass(AnalysisID AID) {
3941b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel
3951b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel  Pass *P = NULL;
396d0fa16c33615bb6f21685c4e4e3d948ac6780160Devang Patel  // Check pass managers
397d0fa16c33615bb6f21685c4e4e3d948ac6780160Devang Patel  for (std::vector<Pass *>::iterator I = PassManagers.begin(),
398d0fa16c33615bb6f21685c4e4e3d948ac6780160Devang Patel         E = PassManagers.end(); P == NULL && I != E; ++I) {
399d0fa16c33615bb6f21685c4e4e3d948ac6780160Devang Patel    PMDataManager *PMD = dynamic_cast<PMDataManager *>(*I);
400d0fa16c33615bb6f21685c4e4e3d948ac6780160Devang Patel    assert(PMD && "This is not a PassManager");
401d0fa16c33615bb6f21685c4e4e3d948ac6780160Devang Patel    P = PMD->findAnalysisPass(AID, false);
402d0fa16c33615bb6f21685c4e4e3d948ac6780160Devang Patel  }
403d0fa16c33615bb6f21685c4e4e3d948ac6780160Devang Patel
404d0fa16c33615bb6f21685c4e4e3d948ac6780160Devang Patel  // Check other pass managers
405d0fa16c33615bb6f21685c4e4e3d948ac6780160Devang Patel  for (std::vector<PMDataManager *>::iterator I = IndirectPassManagers.begin(),
406d0fa16c33615bb6f21685c4e4e3d948ac6780160Devang Patel         E = IndirectPassManagers.end(); P == NULL && I != E; ++I)
407d0fa16c33615bb6f21685c4e4e3d948ac6780160Devang Patel    P = (*I)->findAnalysisPass(AID, false);
408d0fa16c33615bb6f21685c4e4e3d948ac6780160Devang Patel
4091b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel  for (std::vector<ImmutablePass *>::iterator I = ImmutablePasses.begin(),
4101b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel         E = ImmutablePasses.end(); P == NULL && I != E; ++I) {
4111b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel    const PassInfo *PI = (*I)->getPassInfo();
4121b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel    if (PI == AID)
4131b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel      P = *I;
4141b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel
4151b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel    // If Pass not found then check the interfaces implemented by Immutable Pass
4161b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel    if (!P) {
4171a8038636c2998e37f2130b0ab89a3686d9c1f48Devang Patel      const std::vector<const PassInfo*> &ImmPI = PI->getInterfacesImplemented();
4181a8038636c2998e37f2130b0ab89a3686d9c1f48Devang Patel      if (std::find(ImmPI.begin(), ImmPI.end(), AID) != ImmPI.end())
4191a8038636c2998e37f2130b0ab89a3686d9c1f48Devang Patel        P = *I;
4201b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel    }
4211b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel  }
4221b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel
4231b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel  return P;
4241b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel}
4251b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel
426ebc0922eeb5b728d33a68d4bea8128413f62e369Devang Patel// Print passes managed by this top level manager.
427a52035a062edf9bfbf95c92c615219b647042c17Devang Patelvoid PMTopLevelManager::dumpPasses() const {
428ebc0922eeb5b728d33a68d4bea8128413f62e369Devang Patel
42926426949f33e5a77fbd2fa330f7df5626e8b177dDevang Patel  if (PassDebugging < Structure)
4305f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel    return;
4315f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel
432ebc0922eeb5b728d33a68d4bea8128413f62e369Devang Patel  // Print out the immutable passes
433ebc0922eeb5b728d33a68d4bea8128413f62e369Devang Patel  for (unsigned i = 0, e = ImmutablePasses.size(); i != e; ++i) {
434ebc0922eeb5b728d33a68d4bea8128413f62e369Devang Patel    ImmutablePasses[i]->dumpPassStructure(0);
435ebc0922eeb5b728d33a68d4bea8128413f62e369Devang Patel  }
436ebc0922eeb5b728d33a68d4bea8128413f62e369Devang Patel
437a52035a062edf9bfbf95c92c615219b647042c17Devang Patel  for (std::vector<Pass *>::const_iterator I = PassManagers.begin(),
438ebc0922eeb5b728d33a68d4bea8128413f62e369Devang Patel         E = PassManagers.end(); I != E; ++I)
439ebc0922eeb5b728d33a68d4bea8128413f62e369Devang Patel    (*I)->dumpPassStructure(1);
440ebc0922eeb5b728d33a68d4bea8128413f62e369Devang Patel}
441ebc0922eeb5b728d33a68d4bea8128413f62e369Devang Patel
442a52035a062edf9bfbf95c92c615219b647042c17Devang Patelvoid PMTopLevelManager::dumpArguments() const {
443c32cf54101ecaf336d161fecd58667870149169cDevang Patel
44426426949f33e5a77fbd2fa330f7df5626e8b177dDevang Patel  if (PassDebugging < Arguments)
445c32cf54101ecaf336d161fecd58667870149169cDevang Patel    return;
446c32cf54101ecaf336d161fecd58667870149169cDevang Patel
447c32cf54101ecaf336d161fecd58667870149169cDevang Patel  cerr << "Pass Arguments: ";
448a52035a062edf9bfbf95c92c615219b647042c17Devang Patel  for (std::vector<Pass *>::const_iterator I = PassManagers.begin(),
449c32cf54101ecaf336d161fecd58667870149169cDevang Patel         E = PassManagers.end(); I != E; ++I) {
450c32cf54101ecaf336d161fecd58667870149169cDevang Patel    PMDataManager *PMD = dynamic_cast<PMDataManager *>(*I);
451c32cf54101ecaf336d161fecd58667870149169cDevang Patel    assert(PMD && "This is not a PassManager");
452c32cf54101ecaf336d161fecd58667870149169cDevang Patel    PMD->dumpPassArguments();
453c32cf54101ecaf336d161fecd58667870149169cDevang Patel  }
454c32cf54101ecaf336d161fecd58667870149169cDevang Patel  cerr << "\n";
455c32cf54101ecaf336d161fecd58667870149169cDevang Patel}
456c32cf54101ecaf336d161fecd58667870149169cDevang Patel
4571336a6bf06e64a096217628d2cc9644e48a5d7d6Devang Patelvoid PMTopLevelManager::initializeAllAnalysisInfo() {
4581336a6bf06e64a096217628d2cc9644e48a5d7d6Devang Patel
4591336a6bf06e64a096217628d2cc9644e48a5d7d6Devang Patel  for (std::vector<Pass *>::iterator I = PassManagers.begin(),
4601336a6bf06e64a096217628d2cc9644e48a5d7d6Devang Patel         E = PassManagers.end(); I != E; ++I) {
4611336a6bf06e64a096217628d2cc9644e48a5d7d6Devang Patel    PMDataManager *PMD = dynamic_cast<PMDataManager *>(*I);
4621336a6bf06e64a096217628d2cc9644e48a5d7d6Devang Patel    assert(PMD && "This is not a PassManager");
4631336a6bf06e64a096217628d2cc9644e48a5d7d6Devang Patel    PMD->initializeAnalysisInfo();
4641336a6bf06e64a096217628d2cc9644e48a5d7d6Devang Patel  }
4651336a6bf06e64a096217628d2cc9644e48a5d7d6Devang Patel
4661336a6bf06e64a096217628d2cc9644e48a5d7d6Devang Patel  // Initailize other pass managers
4671336a6bf06e64a096217628d2cc9644e48a5d7d6Devang Patel  for (std::vector<PMDataManager *>::iterator I = IndirectPassManagers.begin(),
4681336a6bf06e64a096217628d2cc9644e48a5d7d6Devang Patel         E = IndirectPassManagers.end(); I != E; ++I)
4691336a6bf06e64a096217628d2cc9644e48a5d7d6Devang Patel    (*I)->initializeAnalysisInfo();
4701336a6bf06e64a096217628d2cc9644e48a5d7d6Devang Patel}
4711336a6bf06e64a096217628d2cc9644e48a5d7d6Devang Patel
472ab7752c1496c2913793305ba4b989a551c5617e1Devang Patel/// Destructor
473ab7752c1496c2913793305ba4b989a551c5617e1Devang PatelPMTopLevelManager::~PMTopLevelManager() {
474ab7752c1496c2913793305ba4b989a551c5617e1Devang Patel  for (std::vector<Pass *>::iterator I = PassManagers.begin(),
475ab7752c1496c2913793305ba4b989a551c5617e1Devang Patel         E = PassManagers.end(); I != E; ++I)
476ab7752c1496c2913793305ba4b989a551c5617e1Devang Patel    delete *I;
477ab7752c1496c2913793305ba4b989a551c5617e1Devang Patel
478ab7752c1496c2913793305ba4b989a551c5617e1Devang Patel  for (std::vector<ImmutablePass *>::iterator
479ab7752c1496c2913793305ba4b989a551c5617e1Devang Patel         I = ImmutablePasses.begin(), E = ImmutablePasses.end(); I != E; ++I)
480ab7752c1496c2913793305ba4b989a551c5617e1Devang Patel    delete *I;
481ab7752c1496c2913793305ba4b989a551c5617e1Devang Patel
482ab7752c1496c2913793305ba4b989a551c5617e1Devang Patel  PassManagers.clear();
483ab7752c1496c2913793305ba4b989a551c5617e1Devang Patel}
484ab7752c1496c2913793305ba4b989a551c5617e1Devang Patel
4851b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel//===----------------------------------------------------------------------===//
486419f0e95d698109541ad730cb45ba4caca78f458Devang Patel// PMDataManager implementation
487889739c4d188d28c167644bced9df0f3131317d7Devang Patel
4882c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel/// Return true IFF pass P's required analysis set does not required new
489889739c4d188d28c167644bced9df0f3131317d7Devang Patel/// manager.
490419f0e95d698109541ad730cb45ba4caca78f458Devang Patelbool PMDataManager::manageablePass(Pass *P) {
491889739c4d188d28c167644bced9df0f3131317d7Devang Patel
4924045af1175509c81d6a4708df233f0b1abe888fcDevang Patel  // TODO
4934045af1175509c81d6a4708df233f0b1abe888fcDevang Patel  // If this pass is not preserving information that is required by a
4944045af1175509c81d6a4708df233f0b1abe888fcDevang Patel  // pass maintained by higher level pass manager then do not insert
4954045af1175509c81d6a4708df233f0b1abe888fcDevang Patel  // this pass into current manager. Use new manager. For example,
4964045af1175509c81d6a4708df233f0b1abe888fcDevang Patel  // For example, If FunctionPass F is not preserving ModulePass Info M1
4974045af1175509c81d6a4708df233f0b1abe888fcDevang Patel  // that is used by another ModulePass M2 then do not insert F in
4984045af1175509c81d6a4708df233f0b1abe888fcDevang Patel  // current function pass manager.
499889739c4d188d28c167644bced9df0f3131317d7Devang Patel  return true;
500889739c4d188d28c167644bced9df0f3131317d7Devang Patel}
501889739c4d188d28c167644bced9df0f3131317d7Devang Patel
502b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel/// Augement AvailableAnalysis by adding analysis made available by pass P.
503f32b4dd13e421b3ad4696f984cb2043ce64e19cbDevang Patelvoid PMDataManager::recordAvailableAnalysis(Pass *P) {
504b899eed1bc0a64f96fa7aff8d7c6f999cf85bdfeDevang Patel
505b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel  if (const PassInfo *PI = P->getPassInfo()) {
506b899eed1bc0a64f96fa7aff8d7c6f999cf85bdfeDevang Patel    AvailableAnalysis[PI] = P;
507b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel
508f32b4dd13e421b3ad4696f984cb2043ce64e19cbDevang Patel    //This pass is the current implementation of all of the interfaces it
509f32b4dd13e421b3ad4696f984cb2043ce64e19cbDevang Patel    //implements as well.
510f32b4dd13e421b3ad4696f984cb2043ce64e19cbDevang Patel    const std::vector<const PassInfo*> &II = PI->getInterfacesImplemented();
511f32b4dd13e421b3ad4696f984cb2043ce64e19cbDevang Patel    for (unsigned i = 0, e = II.size(); i != e; ++i)
512f32b4dd13e421b3ad4696f984cb2043ce64e19cbDevang Patel      AvailableAnalysis[II[i]] = P;
513b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel  }
514b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel}
515b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel
516889739c4d188d28c167644bced9df0f3131317d7Devang Patel/// Remove Analyss not preserved by Pass P
517419f0e95d698109541ad730cb45ba4caca78f458Devang Patelvoid PMDataManager::removeNotPreservedAnalysis(Pass *P) {
51814d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel  AnalysisUsage AnUsage;
51914d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel  P->getAnalysisUsage(AnUsage);
52014d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel
52104b4e0595ffffab232a73a78d742e08efb6ebcfbDevang Patel  if (AnUsage.getPreservesAll())
52204b4e0595ffffab232a73a78d742e08efb6ebcfbDevang Patel    return;
52304b4e0595ffffab232a73a78d742e08efb6ebcfbDevang Patel
52404b4e0595ffffab232a73a78d742e08efb6ebcfbDevang Patel  const std::vector<AnalysisID> &PreservedSet = AnUsage.getPreservedSet();
525b899eed1bc0a64f96fa7aff8d7c6f999cf85bdfeDevang Patel  for (std::map<AnalysisID, Pass*>::iterator I = AvailableAnalysis.begin(),
52654e247d2d0c07544b3e638e80b816f352ec152c1Devang Patel         E = AvailableAnalysis.end(); I != E; ) {
5271a8038636c2998e37f2130b0ab89a3686d9c1f48Devang Patel    std::map<AnalysisID, Pass*>::iterator Info = I++;
5281a8038636c2998e37f2130b0ab89a3686d9c1f48Devang Patel    if (std::find(PreservedSet.begin(), PreservedSet.end(), Info->first) ==
52914d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel        PreservedSet.end()) {
53014d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel      // Remove this analysis
5311a8038636c2998e37f2130b0ab89a3686d9c1f48Devang Patel      if (!dynamic_cast<ImmutablePass*>(Info->second))
5321a8038636c2998e37f2130b0ab89a3686d9c1f48Devang Patel        AvailableAnalysis.erase(Info);
5331a8038636c2998e37f2130b0ab89a3686d9c1f48Devang Patel    }
53414d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel  }
535889739c4d188d28c167644bced9df0f3131317d7Devang Patel}
536889739c4d188d28c167644bced9df0f3131317d7Devang Patel
537df1a10ece6a75f230d98c6fb001349eede90387aDevang Patel/// Remove analysis passes that are not used any longer
5384eeea774ce1b24fa55c06aac31e02016d5dd77d6Devang Patelvoid PMDataManager::removeDeadPasses(Pass *P, std::string &Msg) {
539f9a60ae75d6fdc74160085323c14e92e7d3517d3Devang Patel
540f9a60ae75d6fdc74160085323c14e92e7d3517d3Devang Patel  std::vector<Pass *> DeadPasses;
541f9a60ae75d6fdc74160085323c14e92e7d3517d3Devang Patel  TPM->collectLastUses(DeadPasses, P);
542f9a60ae75d6fdc74160085323c14e92e7d3517d3Devang Patel
543f9a60ae75d6fdc74160085323c14e92e7d3517d3Devang Patel  for (std::vector<Pass *>::iterator I = DeadPasses.begin(),
544f9a60ae75d6fdc74160085323c14e92e7d3517d3Devang Patel         E = DeadPasses.end(); I != E; ++I) {
5454eeea774ce1b24fa55c06aac31e02016d5dd77d6Devang Patel
5464eeea774ce1b24fa55c06aac31e02016d5dd77d6Devang Patel    std::string Msg1 = "  Freeing Pass '";
5474eeea774ce1b24fa55c06aac31e02016d5dd77d6Devang Patel    dumpPassInfo(*I, Msg1, Msg);
5484eeea774ce1b24fa55c06aac31e02016d5dd77d6Devang Patel
5498e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel    if (TheTimeInfo) TheTimeInfo->passStarted(P);
550f9a60ae75d6fdc74160085323c14e92e7d3517d3Devang Patel    (*I)->releaseMemory();
5518e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel    if (TheTimeInfo) TheTimeInfo->passEnded(P);
5528e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel
553f9a60ae75d6fdc74160085323c14e92e7d3517d3Devang Patel    std::map<AnalysisID, Pass*>::iterator Pos =
554f9a60ae75d6fdc74160085323c14e92e7d3517d3Devang Patel      AvailableAnalysis.find((*I)->getPassInfo());
555f9a60ae75d6fdc74160085323c14e92e7d3517d3Devang Patel
556964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel    // It is possible that pass is already removed from the AvailableAnalysis
557f9a60ae75d6fdc74160085323c14e92e7d3517d3Devang Patel    if (Pos != AvailableAnalysis.end())
558f9a60ae75d6fdc74160085323c14e92e7d3517d3Devang Patel      AvailableAnalysis.erase(Pos);
559f9a60ae75d6fdc74160085323c14e92e7d3517d3Devang Patel  }
560df1a10ece6a75f230d98c6fb001349eede90387aDevang Patel}
561df1a10ece6a75f230d98c6fb001349eede90387aDevang Patel
5624045af1175509c81d6a4708df233f0b1abe888fcDevang Patel/// Add pass P into the PassVector. Update
563893a5a681585cdf3b5bfff7128ea522e8a47750aDevang Patel/// AvailableAnalysis appropriately if ProcessAnalysis is true.
564e24e0e1244dc273016e541948086a89ffce1f7e4Devang Patelvoid PMDataManager::add(Pass *P,
56566eeb49d8fcfdfa4946c41fd92b8165c0086689dDevang Patel                        bool ProcessAnalysis) {
566e253385b108cd946b1ac150302f246d3b218be77Devang Patel
567145e83dc12a3f962b999f348474ebb07a36a7b81Devang Patel  // This manager is going to manage pass P. Set up analysis resolver
568145e83dc12a3f962b999f348474ebb07a36a7b81Devang Patel  // to connect them.
569cde53d3c1e9d6a2add5de847b44818fbb1d69c20Devang Patel  AnalysisResolver *AR = new AnalysisResolver(*this);
570145e83dc12a3f962b999f348474ebb07a36a7b81Devang Patel  P->setResolver(AR);
571145e83dc12a3f962b999f348474ebb07a36a7b81Devang Patel
572893a5a681585cdf3b5bfff7128ea522e8a47750aDevang Patel  if (ProcessAnalysis) {
573e16634065021e36ae31f074f623a636924d6b8d1Devang Patel
574e16634065021e36ae31f074f623a636924d6b8d1Devang Patel    // At the moment, this pass is the last user of all required passes.
575e16634065021e36ae31f074f623a636924d6b8d1Devang Patel    std::vector<Pass *> LastUses;
576e16634065021e36ae31f074f623a636924d6b8d1Devang Patel    std::vector<Pass *> RequiredPasses;
577e16634065021e36ae31f074f623a636924d6b8d1Devang Patel    unsigned PDepth = this->getDepth();
578e16634065021e36ae31f074f623a636924d6b8d1Devang Patel
579e16634065021e36ae31f074f623a636924d6b8d1Devang Patel    collectRequiredAnalysisPasses(RequiredPasses, P);
580e16634065021e36ae31f074f623a636924d6b8d1Devang Patel    for (std::vector<Pass *>::iterator I = RequiredPasses.begin(),
581e16634065021e36ae31f074f623a636924d6b8d1Devang Patel           E = RequiredPasses.end(); I != E; ++I) {
582e16634065021e36ae31f074f623a636924d6b8d1Devang Patel      Pass *PRequired = *I;
583e16634065021e36ae31f074f623a636924d6b8d1Devang Patel      unsigned RDepth = 0;
584cd520b187a222bf99d4238590e6517e87666e39fDevang Patel
585cd520b187a222bf99d4238590e6517e87666e39fDevang Patel      PMDataManager &DM = PRequired->getResolver()->getPMDataManager();
586cd520b187a222bf99d4238590e6517e87666e39fDevang Patel      RDepth = DM.getDepth();
587cd520b187a222bf99d4238590e6517e87666e39fDevang Patel
588e16634065021e36ae31f074f623a636924d6b8d1Devang Patel      if (PDepth == RDepth)
589e16634065021e36ae31f074f623a636924d6b8d1Devang Patel        LastUses.push_back(PRequired);
590e16634065021e36ae31f074f623a636924d6b8d1Devang Patel      else if (PDepth >  RDepth) {
591e16634065021e36ae31f074f623a636924d6b8d1Devang Patel        // Let the parent claim responsibility of last use
592ef89c5594aaa5b97f303ba0de99940b79f2c0e0eDevang Patel        TransferLastUses.push_back(PRequired);
593e16634065021e36ae31f074f623a636924d6b8d1Devang Patel      } else {
594e16634065021e36ae31f074f623a636924d6b8d1Devang Patel        // Note : This feature is not yet implemented
595e16634065021e36ae31f074f623a636924d6b8d1Devang Patel        assert (0 &&
596e16634065021e36ae31f074f623a636924d6b8d1Devang Patel                "Unable to handle Pass that requires lower level Analysis pass");
597e16634065021e36ae31f074f623a636924d6b8d1Devang Patel      }
598e16634065021e36ae31f074f623a636924d6b8d1Devang Patel    }
599e16634065021e36ae31f074f623a636924d6b8d1Devang Patel
6003f5ecd7eb5526f75b4c36012b5b5194c69187a56Devang Patel    // Set P as P's last user until someone starts using P.
6013f5ecd7eb5526f75b4c36012b5b5194c69187a56Devang Patel    // However, if P is a Pass Manager then it does not need
6023f5ecd7eb5526f75b4c36012b5b5194c69187a56Devang Patel    // to record its last user.
6038df87095fc33af80e12fb883a6ccf8463518b8e2Devang Patel    if (!dynamic_cast<PMDataManager *>(P))
6043f5ecd7eb5526f75b4c36012b5b5194c69187a56Devang Patel      LastUses.push_back(P);
6058df87095fc33af80e12fb883a6ccf8463518b8e2Devang Patel    TPM->setLastUser(LastUses, P);
606e16634065021e36ae31f074f623a636924d6b8d1Devang Patel
6070ac961d9c1c511204abfb02f5c25c92da6b75eb6Devang Patel    // Take a note of analysis required and made available by this pass.
608893a5a681585cdf3b5bfff7128ea522e8a47750aDevang Patel    // Remove the analysis not preserved by this pass
609893a5a681585cdf3b5bfff7128ea522e8a47750aDevang Patel    removeNotPreservedAnalysis(P);
6100ac961d9c1c511204abfb02f5c25c92da6b75eb6Devang Patel    recordAvailableAnalysis(P);
611893a5a681585cdf3b5bfff7128ea522e8a47750aDevang Patel  }
612e253385b108cd946b1ac150302f246d3b218be77Devang Patel
613e253385b108cd946b1ac150302f246d3b218be77Devang Patel  // Add pass
614e253385b108cd946b1ac150302f246d3b218be77Devang Patel  PassVector.push_back(P);
615e253385b108cd946b1ac150302f246d3b218be77Devang Patel}
616e253385b108cd946b1ac150302f246d3b218be77Devang Patel
617c17bbb6da7e17c06c1f0ae7baa2f151db0e966d9Devang Patel/// Populate RequiredPasses with the analysis pass that are required by
618c17bbb6da7e17c06c1f0ae7baa2f151db0e966d9Devang Patel/// pass P.
619c17bbb6da7e17c06c1f0ae7baa2f151db0e966d9Devang Patelvoid PMDataManager::collectRequiredAnalysisPasses(std::vector<Pass *> &RP,
620c17bbb6da7e17c06c1f0ae7baa2f151db0e966d9Devang Patel                                                  Pass *P) {
621c17bbb6da7e17c06c1f0ae7baa2f151db0e966d9Devang Patel  AnalysisUsage AnUsage;
622c17bbb6da7e17c06c1f0ae7baa2f151db0e966d9Devang Patel  P->getAnalysisUsage(AnUsage);
623c17bbb6da7e17c06c1f0ae7baa2f151db0e966d9Devang Patel  const std::vector<AnalysisID> &RequiredSet = AnUsage.getRequiredSet();
624c17bbb6da7e17c06c1f0ae7baa2f151db0e966d9Devang Patel  for (std::vector<AnalysisID>::const_iterator
625c17bbb6da7e17c06c1f0ae7baa2f151db0e966d9Devang Patel         I = RequiredSet.begin(), E = RequiredSet.end();
626c17bbb6da7e17c06c1f0ae7baa2f151db0e966d9Devang Patel       I != E; ++I) {
62769867b511c732a7fac7301977bd6e880e46439f1Devang Patel    Pass *AnalysisPass = findAnalysisPass(*I, true);
628c17bbb6da7e17c06c1f0ae7baa2f151db0e966d9Devang Patel    assert (AnalysisPass && "Analysis pass is not available");
629c17bbb6da7e17c06c1f0ae7baa2f151db0e966d9Devang Patel    RP.push_back(AnalysisPass);
630c17bbb6da7e17c06c1f0ae7baa2f151db0e966d9Devang Patel  }
63127aaab2bd3c220d8466b34f6b959f74e1caac69bDevang Patel
63227aaab2bd3c220d8466b34f6b959f74e1caac69bDevang Patel  const std::vector<AnalysisID> &IDs = AnUsage.getRequiredTransitiveSet();
63327aaab2bd3c220d8466b34f6b959f74e1caac69bDevang Patel  for (std::vector<AnalysisID>::const_iterator I = IDs.begin(),
63427aaab2bd3c220d8466b34f6b959f74e1caac69bDevang Patel         E = IDs.end(); I != E; ++I) {
63527aaab2bd3c220d8466b34f6b959f74e1caac69bDevang Patel    Pass *AnalysisPass = findAnalysisPass(*I, true);
63627aaab2bd3c220d8466b34f6b959f74e1caac69bDevang Patel    assert (AnalysisPass && "Analysis pass is not available");
63727aaab2bd3c220d8466b34f6b959f74e1caac69bDevang Patel    RP.push_back(AnalysisPass);
63827aaab2bd3c220d8466b34f6b959f74e1caac69bDevang Patel  }
639c17bbb6da7e17c06c1f0ae7baa2f151db0e966d9Devang Patel}
640c17bbb6da7e17c06c1f0ae7baa2f151db0e966d9Devang Patel
6412f42ed6b0b5161296cdd7e573b49fe631599fc97Devang Patel// All Required analyses should be available to the pass as it runs!  Here
6422f42ed6b0b5161296cdd7e573b49fe631599fc97Devang Patel// we fill in the AnalysisImpls member of the pass so that it can
6432f42ed6b0b5161296cdd7e573b49fe631599fc97Devang Patel// successfully use the getAnalysis() method to retrieve the
6442f42ed6b0b5161296cdd7e573b49fe631599fc97Devang Patel// implementations it needs.
6452f42ed6b0b5161296cdd7e573b49fe631599fc97Devang Patel//
646419f0e95d698109541ad730cb45ba4caca78f458Devang Patelvoid PMDataManager::initializeAnalysisImpl(Pass *P) {
6473799f97d539f6c288d169063e1b335917fafcffbDevang Patel  AnalysisUsage AnUsage;
6483799f97d539f6c288d169063e1b335917fafcffbDevang Patel  P->getAnalysisUsage(AnUsage);
6492f42ed6b0b5161296cdd7e573b49fe631599fc97Devang Patel
6502f42ed6b0b5161296cdd7e573b49fe631599fc97Devang Patel  for (std::vector<const PassInfo *>::const_iterator
6512f42ed6b0b5161296cdd7e573b49fe631599fc97Devang Patel         I = AnUsage.getRequiredSet().begin(),
6522f42ed6b0b5161296cdd7e573b49fe631599fc97Devang Patel         E = AnUsage.getRequiredSet().end(); I != E; ++I) {
65369867b511c732a7fac7301977bd6e880e46439f1Devang Patel    Pass *Impl = findAnalysisPass(*I, true);
6542f42ed6b0b5161296cdd7e573b49fe631599fc97Devang Patel    if (Impl == 0)
6552f42ed6b0b5161296cdd7e573b49fe631599fc97Devang Patel      assert(0 && "Analysis used but not available!");
656cde53d3c1e9d6a2add5de847b44818fbb1d69c20Devang Patel    AnalysisResolver *AR = P->getResolver();
657298feadd7a547d50eb943c9ea15f6345a024bc9aDevang Patel    AR->addAnalysisImplsPair(*I, Impl);
6582f42ed6b0b5161296cdd7e573b49fe631599fc97Devang Patel  }
6592f42ed6b0b5161296cdd7e573b49fe631599fc97Devang Patel}
6602f42ed6b0b5161296cdd7e573b49fe631599fc97Devang Patel
66169867b511c732a7fac7301977bd6e880e46439f1Devang Patel/// Find the pass that implements Analysis AID. If desired pass is not found
66269867b511c732a7fac7301977bd6e880e46439f1Devang Patel/// then return NULL.
66369867b511c732a7fac7301977bd6e880e46439f1Devang PatelPass *PMDataManager::findAnalysisPass(AnalysisID AID, bool SearchParent) {
66469867b511c732a7fac7301977bd6e880e46439f1Devang Patel
66569867b511c732a7fac7301977bd6e880e46439f1Devang Patel  // Check if AvailableAnalysis map has one entry.
66669867b511c732a7fac7301977bd6e880e46439f1Devang Patel  std::map<AnalysisID, Pass*>::const_iterator I =  AvailableAnalysis.find(AID);
66769867b511c732a7fac7301977bd6e880e46439f1Devang Patel
66869867b511c732a7fac7301977bd6e880e46439f1Devang Patel  if (I != AvailableAnalysis.end())
66969867b511c732a7fac7301977bd6e880e46439f1Devang Patel    return I->second;
67069867b511c732a7fac7301977bd6e880e46439f1Devang Patel
67169867b511c732a7fac7301977bd6e880e46439f1Devang Patel  // Search Parents through TopLevelManager
67269867b511c732a7fac7301977bd6e880e46439f1Devang Patel  if (SearchParent)
67369867b511c732a7fac7301977bd6e880e46439f1Devang Patel    return TPM->findAnalysisPass(AID);
67469867b511c732a7fac7301977bd6e880e46439f1Devang Patel
6755b640e7edc606059717fb9c2ebcd85302c97fc21Devang Patel  return NULL;
67669867b511c732a7fac7301977bd6e880e46439f1Devang Patel}
67769867b511c732a7fac7301977bd6e880e46439f1Devang Patel
678a52035a062edf9bfbf95c92c615219b647042c17Devang Patel// Print list of passes that are last used by P.
679a52035a062edf9bfbf95c92c615219b647042c17Devang Patelvoid PMDataManager::dumpLastUses(Pass *P, unsigned Offset) const{
680a52035a062edf9bfbf95c92c615219b647042c17Devang Patel
681a52035a062edf9bfbf95c92c615219b647042c17Devang Patel  std::vector<Pass *> LUses;
682a52035a062edf9bfbf95c92c615219b647042c17Devang Patel
683a52035a062edf9bfbf95c92c615219b647042c17Devang Patel  assert (TPM && "Top Level Manager is missing");
684a52035a062edf9bfbf95c92c615219b647042c17Devang Patel  TPM->collectLastUses(LUses, P);
685a52035a062edf9bfbf95c92c615219b647042c17Devang Patel
686a52035a062edf9bfbf95c92c615219b647042c17Devang Patel  for (std::vector<Pass *>::iterator I = LUses.begin(),
687a52035a062edf9bfbf95c92c615219b647042c17Devang Patel         E = LUses.end(); I != E; ++I) {
688a52035a062edf9bfbf95c92c615219b647042c17Devang Patel    llvm::cerr << "--" << std::string(Offset*2, ' ');
689a52035a062edf9bfbf95c92c615219b647042c17Devang Patel    (*I)->dumpPassStructure(0);
690a52035a062edf9bfbf95c92c615219b647042c17Devang Patel  }
691a52035a062edf9bfbf95c92c615219b647042c17Devang Patel}
692a52035a062edf9bfbf95c92c615219b647042c17Devang Patel
693a52035a062edf9bfbf95c92c615219b647042c17Devang Patelvoid PMDataManager::dumpPassArguments() const {
694a52035a062edf9bfbf95c92c615219b647042c17Devang Patel  for(std::vector<Pass *>::const_iterator I = PassVector.begin(),
695a52035a062edf9bfbf95c92c615219b647042c17Devang Patel        E = PassVector.end(); I != E; ++I) {
696a52035a062edf9bfbf95c92c615219b647042c17Devang Patel    if (PMDataManager *PMD = dynamic_cast<PMDataManager *>(*I))
697a52035a062edf9bfbf95c92c615219b647042c17Devang Patel      PMD->dumpPassArguments();
698a52035a062edf9bfbf95c92c615219b647042c17Devang Patel    else
699a52035a062edf9bfbf95c92c615219b647042c17Devang Patel      if (const PassInfo *PI = (*I)->getPassInfo())
700a52035a062edf9bfbf95c92c615219b647042c17Devang Patel        if (!PI->isAnalysisGroup())
701a52035a062edf9bfbf95c92c615219b647042c17Devang Patel          cerr << " -" << PI->getPassArgument();
702a52035a062edf9bfbf95c92c615219b647042c17Devang Patel  }
703a52035a062edf9bfbf95c92c615219b647042c17Devang Patel}
704a52035a062edf9bfbf95c92c615219b647042c17Devang Patel
705a52035a062edf9bfbf95c92c615219b647042c17Devang Patelvoid PMDataManager:: dumpPassInfo(Pass *P,  std::string &Msg1,
706a52035a062edf9bfbf95c92c615219b647042c17Devang Patel                                  std::string &Msg2) const {
70726426949f33e5a77fbd2fa330f7df5626e8b177dDevang Patel  if (PassDebugging < Executions)
708a52035a062edf9bfbf95c92c615219b647042c17Devang Patel    return;
709a52035a062edf9bfbf95c92c615219b647042c17Devang Patel  cerr << (void*)this << std::string(getDepth()*2+1, ' ');
710a52035a062edf9bfbf95c92c615219b647042c17Devang Patel  cerr << Msg1;
711a52035a062edf9bfbf95c92c615219b647042c17Devang Patel  cerr << P->getPassName();
712a52035a062edf9bfbf95c92c615219b647042c17Devang Patel  cerr << Msg2;
713a52035a062edf9bfbf95c92c615219b647042c17Devang Patel}
714a52035a062edf9bfbf95c92c615219b647042c17Devang Patel
715a52035a062edf9bfbf95c92c615219b647042c17Devang Patelvoid PMDataManager::dumpAnalysisSetInfo(const char *Msg, Pass *P,
716a52035a062edf9bfbf95c92c615219b647042c17Devang Patel                                        const std::vector<AnalysisID> &Set)
717a52035a062edf9bfbf95c92c615219b647042c17Devang Patel  const {
71826426949f33e5a77fbd2fa330f7df5626e8b177dDevang Patel  if (PassDebugging >= Details && !Set.empty()) {
719a52035a062edf9bfbf95c92c615219b647042c17Devang Patel    cerr << (void*)P << std::string(getDepth()*2+3, ' ') << Msg << " Analyses:";
720a52035a062edf9bfbf95c92c615219b647042c17Devang Patel      for (unsigned i = 0; i != Set.size(); ++i) {
721a52035a062edf9bfbf95c92c615219b647042c17Devang Patel        if (i) cerr << ",";
722a52035a062edf9bfbf95c92c615219b647042c17Devang Patel        cerr << " " << Set[i]->getPassName();
723a52035a062edf9bfbf95c92c615219b647042c17Devang Patel      }
724a52035a062edf9bfbf95c92c615219b647042c17Devang Patel      cerr << "\n";
725a52035a062edf9bfbf95c92c615219b647042c17Devang Patel  }
726a52035a062edf9bfbf95c92c615219b647042c17Devang Patel}
727f3dc6d9f95d4ba7756105154df4a8075bbbcf931Devang Patel
728ab7752c1496c2913793305ba4b989a551c5617e1Devang Patel// Destructor
729ab7752c1496c2913793305ba4b989a551c5617e1Devang PatelPMDataManager::~PMDataManager() {
730ab7752c1496c2913793305ba4b989a551c5617e1Devang Patel
731ab7752c1496c2913793305ba4b989a551c5617e1Devang Patel  for (std::vector<Pass *>::iterator I = PassVector.begin(),
732ab7752c1496c2913793305ba4b989a551c5617e1Devang Patel         E = PassVector.end(); I != E; ++I)
733ab7752c1496c2913793305ba4b989a551c5617e1Devang Patel    delete *I;
734ab7752c1496c2913793305ba4b989a551c5617e1Devang Patel
735ab7752c1496c2913793305ba4b989a551c5617e1Devang Patel  PassVector.clear();
736ab7752c1496c2913793305ba4b989a551c5617e1Devang Patel}
737ab7752c1496c2913793305ba4b989a551c5617e1Devang Patel
738f3dc6d9f95d4ba7756105154df4a8075bbbcf931Devang Patel//===----------------------------------------------------------------------===//
739f3dc6d9f95d4ba7756105154df4a8075bbbcf931Devang Patel// NOTE: Is this the right place to define this method ?
740f3dc6d9f95d4ba7756105154df4a8075bbbcf931Devang Patel// getAnalysisToUpdate - Return an analysis result or null if it doesn't exist
741cde53d3c1e9d6a2add5de847b44818fbb1d69c20Devang PatelPass *AnalysisResolver::getAnalysisToUpdate(AnalysisID ID, bool dir) const {
742f3dc6d9f95d4ba7756105154df4a8075bbbcf931Devang Patel  return PM.findAnalysisPass(ID, dir);
743f3dc6d9f95d4ba7756105154df4a8075bbbcf931Devang Patel}
744f3dc6d9f95d4ba7756105154df4a8075bbbcf931Devang Patel
74506e86561a5261a59f5c391d5cc5cb4aa38dca83cDevang Patel//===----------------------------------------------------------------------===//
7465f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel// BBPassManager implementation
74755fd43f90913676682487f89f27c756adb827f66Devang Patel
74855fd43f90913676682487f89f27c756adb827f66Devang Patel/// Execute all of the passes scheduled for execution by invoking
74955fd43f90913676682487f89f27c756adb827f66Devang Patel/// runOnBasicBlock method.  Keep track of whether any of the passes modifies
75055fd43f90913676682487f89f27c756adb827f66Devang Patel/// the function, and if so, return true.
75155fd43f90913676682487f89f27c756adb827f66Devang Patelbool
7525f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang PatelBBPassManager::runOnFunction(Function &F) {
75355fd43f90913676682487f89f27c756adb827f66Devang Patel
7545cbf985dcbc89fba3208e7baf8b6f488b06d3ec9Reid Spencer  if (F.isDeclaration())
7551fbe2c9964d57b2a58235541175f069ae491a95eDevang Patel    return false;
7561fbe2c9964d57b2a58235541175f069ae491a95eDevang Patel
7573b14fbe300b96c353a9abfadf481b64324f17375Devang Patel  bool Changed = doInitialization(F);
758c1d6e1fc9c3a47529f417026df652f466ce67851Devang Patel
759693a74e4ee34e2058dab7121c17c98ec59258a8aDevang Patel  std::string Msg1 = "Executing Pass '";
760693a74e4ee34e2058dab7121c17c98ec59258a8aDevang Patel  std::string Msg3 = "' Made Modification '";
761693a74e4ee34e2058dab7121c17c98ec59258a8aDevang Patel
76255fd43f90913676682487f89f27c756adb827f66Devang Patel  for (Function::iterator I = F.begin(), E = F.end(); I != E; ++I)
7631554c8545651350569f08dc7370189da1a7e5814Devang Patel    for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
7641554c8545651350569f08dc7370189da1a7e5814Devang Patel      BasicBlockPass *BP = getContainedPass(Index);
765017b5d969b12119a88463fe2451f20ca9214c4ffDevang Patel      AnalysisUsage AnUsage;
7661554c8545651350569f08dc7370189da1a7e5814Devang Patel      BP->getAnalysisUsage(AnUsage);
767017b5d969b12119a88463fe2451f20ca9214c4ffDevang Patel
7684eeea774ce1b24fa55c06aac31e02016d5dd77d6Devang Patel      std::string Msg2 = "' on BasicBlock '" + (*I).getName() + "'...\n";
7691554c8545651350569f08dc7370189da1a7e5814Devang Patel      dumpPassInfo(BP, Msg1, Msg2);
7701554c8545651350569f08dc7370189da1a7e5814Devang Patel      dumpAnalysisSetInfo("Required", BP, AnUsage.getRequiredSet());
771017b5d969b12119a88463fe2451f20ca9214c4ffDevang Patel
7721554c8545651350569f08dc7370189da1a7e5814Devang Patel      initializeAnalysisImpl(BP);
773693a74e4ee34e2058dab7121c17c98ec59258a8aDevang Patel
7741554c8545651350569f08dc7370189da1a7e5814Devang Patel      if (TheTimeInfo) TheTimeInfo->passStarted(BP);
77555fd43f90913676682487f89f27c756adb827f66Devang Patel      Changed |= BP->runOnBasicBlock(*I);
7761554c8545651350569f08dc7370189da1a7e5814Devang Patel      if (TheTimeInfo) TheTimeInfo->passEnded(BP);
777693a74e4ee34e2058dab7121c17c98ec59258a8aDevang Patel
778693a74e4ee34e2058dab7121c17c98ec59258a8aDevang Patel      if (Changed)
7791554c8545651350569f08dc7370189da1a7e5814Devang Patel        dumpPassInfo(BP, Msg3, Msg2);
7801554c8545651350569f08dc7370189da1a7e5814Devang Patel      dumpAnalysisSetInfo("Preserved", BP, AnUsage.getPreservedSet());
781693a74e4ee34e2058dab7121c17c98ec59258a8aDevang Patel
7821554c8545651350569f08dc7370189da1a7e5814Devang Patel      removeNotPreservedAnalysis(BP);
7831554c8545651350569f08dc7370189da1a7e5814Devang Patel      recordAvailableAnalysis(BP);
7841554c8545651350569f08dc7370189da1a7e5814Devang Patel      removeDeadPasses(BP, Msg2);
78555fd43f90913676682487f89f27c756adb827f66Devang Patel    }
7861a8038636c2998e37f2130b0ab89a3686d9c1f48Devang Patel  return Changed |= doFinalization(F);
78755fd43f90913676682487f89f27c756adb827f66Devang Patel}
78855fd43f90913676682487f89f27c756adb827f66Devang Patel
789964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel// Implement doInitialization and doFinalization
7905f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patelinline bool BBPassManager::doInitialization(Module &M) {
791964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel  bool Changed = false;
792964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel
7931554c8545651350569f08dc7370189da1a7e5814Devang Patel  for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
7941554c8545651350569f08dc7370189da1a7e5814Devang Patel    BasicBlockPass *BP = getContainedPass(Index);
795964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel    Changed |= BP->doInitialization(M);
796964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel  }
797964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel
798964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel  return Changed;
799964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel}
800964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel
8015f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patelinline bool BBPassManager::doFinalization(Module &M) {
802964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel  bool Changed = false;
803964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel
8041554c8545651350569f08dc7370189da1a7e5814Devang Patel  for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
8051554c8545651350569f08dc7370189da1a7e5814Devang Patel    BasicBlockPass *BP = getContainedPass(Index);
806964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel    Changed |= BP->doFinalization(M);
807964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel  }
808964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel
809964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel  return Changed;
810964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel}
811964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel
8125f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patelinline bool BBPassManager::doInitialization(Function &F) {
813964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel  bool Changed = false;
814964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel
8151554c8545651350569f08dc7370189da1a7e5814Devang Patel  for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
8161554c8545651350569f08dc7370189da1a7e5814Devang Patel    BasicBlockPass *BP = getContainedPass(Index);
817964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel    Changed |= BP->doInitialization(F);
818964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel  }
819964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel
820964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel  return Changed;
821964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel}
822964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel
8235f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patelinline bool BBPassManager::doFinalization(Function &F) {
824964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel  bool Changed = false;
825964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel
8261554c8545651350569f08dc7370189da1a7e5814Devang Patel  for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
8271554c8545651350569f08dc7370189da1a7e5814Devang Patel    BasicBlockPass *BP = getContainedPass(Index);
828964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel    Changed |= BP->doFinalization(F);
829964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel  }
830964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel
831964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel  return Changed;
832964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel}
833964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel
834964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel
83506e86561a5261a59f5c391d5cc5cb4aa38dca83cDevang Patel//===----------------------------------------------------------------------===//
8363162691f69f85f740bc28f3ddca39b166d35187cDevang Patel// FunctionPassManager implementation
83706e86561a5261a59f5c391d5cc5cb4aa38dca83cDevang Patel
838c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// Create new Function pass manager
8393162691f69f85f740bc28f3ddca39b166d35187cDevang PatelFunctionPassManager::FunctionPassManager(ModuleProvider *P) {
8405f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  FPM = new FunctionPassManagerImpl(0);
841dff33ef8e863241193463fd0129657c5ebce4d58Devang Patel  // FPM is the top level manager.
842dff33ef8e863241193463fd0129657c5ebce4d58Devang Patel  FPM->setTopLevelManager(FPM);
843b920bd85adba95553568cef6a7078ee2509ab804Devang Patel
844b920bd85adba95553568cef6a7078ee2509ab804Devang Patel  PMDataManager *PMD = dynamic_cast<PMDataManager *>(FPM);
845cde53d3c1e9d6a2add5de847b44818fbb1d69c20Devang Patel  AnalysisResolver *AR = new AnalysisResolver(*PMD);
846b920bd85adba95553568cef6a7078ee2509ab804Devang Patel  FPM->setResolver(AR);
847b920bd85adba95553568cef6a7078ee2509ab804Devang Patel
848cc132cd9feef765fe70284183c0f997b4faa5483Devang Patel  MP = P;
849cc132cd9feef765fe70284183c0f997b4faa5483Devang Patel}
850cc132cd9feef765fe70284183c0f997b4faa5483Devang Patel
8513162691f69f85f740bc28f3ddca39b166d35187cDevang PatelFunctionPassManager::~FunctionPassManager() {
85237a6f7966c39f69a92419d37949a94a758c29e90Devang Patel  delete FPM;
85337a6f7966c39f69a92419d37949a94a758c29e90Devang Patel}
85437a6f7966c39f69a92419d37949a94a758c29e90Devang Patel
855c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// add - Add a pass to the queue of passes to run.  This passes
856c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// ownership of the Pass to the PassManager.  When the
857c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// PassManager_X is destroyed, the pass will be destroyed as well, so
858c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// there is no need to delete the pass. (TODO delete passes.)
859c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// This implies that all passes MUST be allocated with 'new'.
8603162691f69f85f740bc28f3ddca39b166d35187cDevang Patelvoid FunctionPassManager::add(Pass *P) {
861c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel  FPM->add(P);
862c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel}
863c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel
864214ca23aef8bd408c4ee4ce28ba93d57d2416587Devang Patel/// run - Execute all of the passes scheduled for execution.  Keep
865214ca23aef8bd408c4ee4ce28ba93d57d2416587Devang Patel/// track of whether any of the passes modifies the function, and if
866214ca23aef8bd408c4ee4ce28ba93d57d2416587Devang Patel/// so, return true.
867214ca23aef8bd408c4ee4ce28ba93d57d2416587Devang Patel///
8683162691f69f85f740bc28f3ddca39b166d35187cDevang Patelbool FunctionPassManager::run(Function &F) {
869214ca23aef8bd408c4ee4ce28ba93d57d2416587Devang Patel  std::string errstr;
870214ca23aef8bd408c4ee4ce28ba93d57d2416587Devang Patel  if (MP->materializeFunction(&F, &errstr)) {
871e81561909d128c6e2d8033cb5465a49b2596b26aBill Wendling    cerr << "Error reading bytecode file: " << errstr << "\n";
872214ca23aef8bd408c4ee4ce28ba93d57d2416587Devang Patel    abort();
873214ca23aef8bd408c4ee4ce28ba93d57d2416587Devang Patel  }
874c475692c5ee2f9c0c6988b7ec28768ef6690bfb0Devang Patel  return FPM->run(F);
875214ca23aef8bd408c4ee4ce28ba93d57d2416587Devang Patel}
876214ca23aef8bd408c4ee4ce28ba93d57d2416587Devang Patel
877214ca23aef8bd408c4ee4ce28ba93d57d2416587Devang Patel
8783799f97d539f6c288d169063e1b335917fafcffbDevang Patel/// doInitialization - Run all of the initializers for the function passes.
8793799f97d539f6c288d169063e1b335917fafcffbDevang Patel///
8803162691f69f85f740bc28f3ddca39b166d35187cDevang Patelbool FunctionPassManager::doInitialization() {
8813799f97d539f6c288d169063e1b335917fafcffbDevang Patel  return FPM->doInitialization(*MP->getModule());
8823799f97d539f6c288d169063e1b335917fafcffbDevang Patel}
8833799f97d539f6c288d169063e1b335917fafcffbDevang Patel
8843799f97d539f6c288d169063e1b335917fafcffbDevang Patel/// doFinalization - Run all of the initializers for the function passes.
8853799f97d539f6c288d169063e1b335917fafcffbDevang Patel///
8863162691f69f85f740bc28f3ddca39b166d35187cDevang Patelbool FunctionPassManager::doFinalization() {
8873799f97d539f6c288d169063e1b335917fafcffbDevang Patel  return FPM->doFinalization(*MP->getModule());
8883799f97d539f6c288d169063e1b335917fafcffbDevang Patel}
8893799f97d539f6c288d169063e1b335917fafcffbDevang Patel
89006e86561a5261a59f5c391d5cc5cb4aa38dca83cDevang Patel//===----------------------------------------------------------------------===//
8915f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel// FunctionPassManagerImpl implementation
8925f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel//
8935f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patelinline bool FunctionPassManagerImpl::doInitialization(Module &M) {
8945f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  bool Changed = false;
8955f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel
8965f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  for (unsigned Index = 0; Index < getNumContainedManagers(); ++Index) {
8975f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel    FPPassManager *FP = getContainedManager(Index);
8985f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel    Changed |= FP->doInitialization(M);
8995f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  }
9005f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel
9015f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  return Changed;
9025f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel}
9035f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel
9045f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patelinline bool FunctionPassManagerImpl::doFinalization(Module &M) {
9055f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  bool Changed = false;
9065f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel
9075f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  for (unsigned Index = 0; Index < getNumContainedManagers(); ++Index) {
9085f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel    FPPassManager *FP = getContainedManager(Index);
9095f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel    Changed |= FP->doFinalization(M);
9105f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  }
9115f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel
9125f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  return Changed;
9135f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel}
9145f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel
9155f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel// Execute all the passes managed by this top level manager.
9165f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel// Return true if any function is modified by a pass.
9175f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patelbool FunctionPassManagerImpl::run(Function &F) {
9185f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel
9195f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  bool Changed = false;
9205f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel
9215f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  TimingInfo::createTheTimeInfo();
9225f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel
9235f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  dumpArguments();
9245f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  dumpPasses();
9255f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel
9261336a6bf06e64a096217628d2cc9644e48a5d7d6Devang Patel  initializeAllAnalysisInfo();
9275f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  for (unsigned Index = 0; Index < getNumContainedManagers(); ++Index) {
9285f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel    FPPassManager *FP = getContainedManager(Index);
9295f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel    Changed |= FP->runOnFunction(F);
9305f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  }
9315f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  return Changed;
9325f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel}
9335f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel
9345f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel//===----------------------------------------------------------------------===//
9355f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel// FPPassManager implementation
936448d27cd795dc273249f123444509403f4fa4facDevang Patel
937ab7752c1496c2913793305ba4b989a551c5617e1Devang Patel/// Print passes managed by this manager
938ab7752c1496c2913793305ba4b989a551c5617e1Devang Patelvoid FPPassManager::dumpPassStructure(unsigned Offset) {
939ab7752c1496c2913793305ba4b989a551c5617e1Devang Patel  llvm::cerr << std::string(Offset*2, ' ') << "FunctionPass Manager\n";
940ab7752c1496c2913793305ba4b989a551c5617e1Devang Patel  for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
941ab7752c1496c2913793305ba4b989a551c5617e1Devang Patel    FunctionPass *FP = getContainedPass(Index);
942ab7752c1496c2913793305ba4b989a551c5617e1Devang Patel    FP->dumpPassStructure(Offset + 1);
943ab7752c1496c2913793305ba4b989a551c5617e1Devang Patel    dumpLastUses(FP, Offset+1);
944ab7752c1496c2913793305ba4b989a551c5617e1Devang Patel  }
945ab7752c1496c2913793305ba4b989a551c5617e1Devang Patel}
946ab7752c1496c2913793305ba4b989a551c5617e1Devang Patel
947ab7752c1496c2913793305ba4b989a551c5617e1Devang Patel
948448d27cd795dc273249f123444509403f4fa4facDevang Patel/// Execute all of the passes scheduled for execution by invoking
949448d27cd795dc273249f123444509403f4fa4facDevang Patel/// runOnFunction method.  Keep track of whether any of the passes modifies
950448d27cd795dc273249f123444509403f4fa4facDevang Patel/// the function, and if so, return true.
9515f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patelbool FPPassManager::runOnFunction(Function &F) {
952214ca23aef8bd408c4ee4ce28ba93d57d2416587Devang Patel
953214ca23aef8bd408c4ee4ce28ba93d57d2416587Devang Patel  bool Changed = false;
9541fbe2c9964d57b2a58235541175f069ae491a95eDevang Patel
9555cbf985dcbc89fba3208e7baf8b6f488b06d3ec9Reid Spencer  if (F.isDeclaration())
9561fbe2c9964d57b2a58235541175f069ae491a95eDevang Patel    return false;
9571fbe2c9964d57b2a58235541175f069ae491a95eDevang Patel
958693a74e4ee34e2058dab7121c17c98ec59258a8aDevang Patel  std::string Msg1 = "Executing Pass '";
959693a74e4ee34e2058dab7121c17c98ec59258a8aDevang Patel  std::string Msg3 = "' Made Modification '";
960693a74e4ee34e2058dab7121c17c98ec59258a8aDevang Patel
9611554c8545651350569f08dc7370189da1a7e5814Devang Patel  for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
9621554c8545651350569f08dc7370189da1a7e5814Devang Patel    FunctionPass *FP = getContainedPass(Index);
9631554c8545651350569f08dc7370189da1a7e5814Devang Patel
964017b5d969b12119a88463fe2451f20ca9214c4ffDevang Patel    AnalysisUsage AnUsage;
9651554c8545651350569f08dc7370189da1a7e5814Devang Patel    FP->getAnalysisUsage(AnUsage);
966693a74e4ee34e2058dab7121c17c98ec59258a8aDevang Patel
9674eeea774ce1b24fa55c06aac31e02016d5dd77d6Devang Patel    std::string Msg2 = "' on Function '" + F.getName() + "'...\n";
9681554c8545651350569f08dc7370189da1a7e5814Devang Patel    dumpPassInfo(FP, Msg1, Msg2);
9691554c8545651350569f08dc7370189da1a7e5814Devang Patel    dumpAnalysisSetInfo("Required", FP, AnUsage.getRequiredSet());
970693a74e4ee34e2058dab7121c17c98ec59258a8aDevang Patel
9711554c8545651350569f08dc7370189da1a7e5814Devang Patel    initializeAnalysisImpl(FP);
9728e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel
9731554c8545651350569f08dc7370189da1a7e5814Devang Patel    if (TheTimeInfo) TheTimeInfo->passStarted(FP);
974214ca23aef8bd408c4ee4ce28ba93d57d2416587Devang Patel    Changed |= FP->runOnFunction(F);
9751554c8545651350569f08dc7370189da1a7e5814Devang Patel    if (TheTimeInfo) TheTimeInfo->passEnded(FP);
976693a74e4ee34e2058dab7121c17c98ec59258a8aDevang Patel
977693a74e4ee34e2058dab7121c17c98ec59258a8aDevang Patel    if (Changed)
9781554c8545651350569f08dc7370189da1a7e5814Devang Patel      dumpPassInfo(FP, Msg3, Msg2);
9791554c8545651350569f08dc7370189da1a7e5814Devang Patel    dumpAnalysisSetInfo("Preserved", FP, AnUsage.getPreservedSet());
980693a74e4ee34e2058dab7121c17c98ec59258a8aDevang Patel
9811554c8545651350569f08dc7370189da1a7e5814Devang Patel    removeNotPreservedAnalysis(FP);
9821554c8545651350569f08dc7370189da1a7e5814Devang Patel    recordAvailableAnalysis(FP);
9831554c8545651350569f08dc7370189da1a7e5814Devang Patel    removeDeadPasses(FP, Msg2);
984214ca23aef8bd408c4ee4ce28ba93d57d2416587Devang Patel  }
985214ca23aef8bd408c4ee4ce28ba93d57d2416587Devang Patel  return Changed;
986214ca23aef8bd408c4ee4ce28ba93d57d2416587Devang Patel}
987214ca23aef8bd408c4ee4ce28ba93d57d2416587Devang Patel
9885f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patelbool FPPassManager::runOnModule(Module &M) {
989214ca23aef8bd408c4ee4ce28ba93d57d2416587Devang Patel
9905f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  bool Changed = doInitialization(M);
9915f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel
9925f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  for(Module::iterator I = M.begin(), E = M.end(); I != E; ++I)
9935f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel    this->runOnFunction(*I);
9945f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel
9955f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  return Changed |= doFinalization(M);
9965f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel}
9975f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel
9985f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patelinline bool FPPassManager::doInitialization(Module &M) {
9993799f97d539f6c288d169063e1b335917fafcffbDevang Patel  bool Changed = false;
10003799f97d539f6c288d169063e1b335917fafcffbDevang Patel
10011554c8545651350569f08dc7370189da1a7e5814Devang Patel  for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
10021554c8545651350569f08dc7370189da1a7e5814Devang Patel    FunctionPass *FP = getContainedPass(Index);
10033799f97d539f6c288d169063e1b335917fafcffbDevang Patel    Changed |= FP->doInitialization(M);
10043799f97d539f6c288d169063e1b335917fafcffbDevang Patel  }
10053799f97d539f6c288d169063e1b335917fafcffbDevang Patel
10063799f97d539f6c288d169063e1b335917fafcffbDevang Patel  return Changed;
10073799f97d539f6c288d169063e1b335917fafcffbDevang Patel}
10083799f97d539f6c288d169063e1b335917fafcffbDevang Patel
10095f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patelinline bool FPPassManager::doFinalization(Module &M) {
10103799f97d539f6c288d169063e1b335917fafcffbDevang Patel  bool Changed = false;
10113799f97d539f6c288d169063e1b335917fafcffbDevang Patel
10121554c8545651350569f08dc7370189da1a7e5814Devang Patel  for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
10131554c8545651350569f08dc7370189da1a7e5814Devang Patel    FunctionPass *FP = getContainedPass(Index);
10143799f97d539f6c288d169063e1b335917fafcffbDevang Patel    Changed |= FP->doFinalization(M);
10153799f97d539f6c288d169063e1b335917fafcffbDevang Patel  }
10163799f97d539f6c288d169063e1b335917fafcffbDevang Patel
10173799f97d539f6c288d169063e1b335917fafcffbDevang Patel  return Changed;
10183799f97d539f6c288d169063e1b335917fafcffbDevang Patel}
10193799f97d539f6c288d169063e1b335917fafcffbDevang Patel
102006e86561a5261a59f5c391d5cc5cb4aa38dca83cDevang Patel//===----------------------------------------------------------------------===//
10215f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel// MPPassManager implementation
102292c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel
102392c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel/// Execute all of the passes scheduled for execution by invoking
102492c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel/// runOnModule method.  Keep track of whether any of the passes modifies
102592c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel/// the module, and if so, return true.
102692c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patelbool
10275f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang PatelMPPassManager::runOnModule(Module &M) {
102892c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel  bool Changed = false;
1029c1d6e1fc9c3a47529f417026df652f466ce67851Devang Patel
1030693a74e4ee34e2058dab7121c17c98ec59258a8aDevang Patel  std::string Msg1 = "Executing Pass '";
1031693a74e4ee34e2058dab7121c17c98ec59258a8aDevang Patel  std::string Msg3 = "' Made Modification '";
1032693a74e4ee34e2058dab7121c17c98ec59258a8aDevang Patel
10331554c8545651350569f08dc7370189da1a7e5814Devang Patel  for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
10341554c8545651350569f08dc7370189da1a7e5814Devang Patel    ModulePass *MP = getContainedPass(Index);
10351554c8545651350569f08dc7370189da1a7e5814Devang Patel
1036017b5d969b12119a88463fe2451f20ca9214c4ffDevang Patel    AnalysisUsage AnUsage;
10371554c8545651350569f08dc7370189da1a7e5814Devang Patel    MP->getAnalysisUsage(AnUsage);
1038693a74e4ee34e2058dab7121c17c98ec59258a8aDevang Patel
10394eeea774ce1b24fa55c06aac31e02016d5dd77d6Devang Patel    std::string Msg2 = "' on Module '" + M.getModuleIdentifier() + "'...\n";
10401554c8545651350569f08dc7370189da1a7e5814Devang Patel    dumpPassInfo(MP, Msg1, Msg2);
10411554c8545651350569f08dc7370189da1a7e5814Devang Patel    dumpAnalysisSetInfo("Required", MP, AnUsage.getRequiredSet());
1042693a74e4ee34e2058dab7121c17c98ec59258a8aDevang Patel
10431554c8545651350569f08dc7370189da1a7e5814Devang Patel    initializeAnalysisImpl(MP);
10448e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel
10451554c8545651350569f08dc7370189da1a7e5814Devang Patel    if (TheTimeInfo) TheTimeInfo->passStarted(MP);
104692c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel    Changed |= MP->runOnModule(M);
10471554c8545651350569f08dc7370189da1a7e5814Devang Patel    if (TheTimeInfo) TheTimeInfo->passEnded(MP);
1048693a74e4ee34e2058dab7121c17c98ec59258a8aDevang Patel
1049693a74e4ee34e2058dab7121c17c98ec59258a8aDevang Patel    if (Changed)
10501554c8545651350569f08dc7370189da1a7e5814Devang Patel      dumpPassInfo(MP, Msg3, Msg2);
10511554c8545651350569f08dc7370189da1a7e5814Devang Patel    dumpAnalysisSetInfo("Preserved", MP, AnUsage.getPreservedSet());
1052017b5d969b12119a88463fe2451f20ca9214c4ffDevang Patel
10531554c8545651350569f08dc7370189da1a7e5814Devang Patel    removeNotPreservedAnalysis(MP);
10541554c8545651350569f08dc7370189da1a7e5814Devang Patel    recordAvailableAnalysis(MP);
10551554c8545651350569f08dc7370189da1a7e5814Devang Patel    removeDeadPasses(MP, Msg2);
105692c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel  }
105792c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel  return Changed;
105892c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel}
105992c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel
106006e86561a5261a59f5c391d5cc5cb4aa38dca83cDevang Patel//===----------------------------------------------------------------------===//
106106e86561a5261a59f5c391d5cc5cb4aa38dca83cDevang Patel// PassManagerImpl implementation
106237a6f7966c39f69a92419d37949a94a758c29e90Devang Patel//
1063b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel/// run - Execute all of the passes scheduled for execution.  Keep track of
1064b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel/// whether any of the passes modifies the module, and if so, return true.
10655f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patelbool PassManagerImpl::run(Module &M) {
1066b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel
1067b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel  bool Changed = false;
106845dc02d6f97447785ee7ffe08c36a34bc8921b0bDevang Patel
10698e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel  TimingInfo::createTheTimeInfo();
10708e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel
1071c32cf54101ecaf336d161fecd58667870149169cDevang Patel  dumpArguments();
10725f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  dumpPasses();
107345dc02d6f97447785ee7ffe08c36a34bc8921b0bDevang Patel
10741336a6bf06e64a096217628d2cc9644e48a5d7d6Devang Patel  initializeAllAnalysisInfo();
10755f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  for (unsigned Index = 0; Index < getNumContainedManagers(); ++Index) {
10765f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel    MPPassManager *MP = getContainedManager(Index);
1077a083e94f7971ddafb817b1bcd86992d9fc4d8f9eDevang Patel    Changed |= MP->runOnModule(M);
1078b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel  }
1079b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel  return Changed;
1080b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel}
10815a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
108206e86561a5261a59f5c391d5cc5cb4aa38dca83cDevang Patel//===----------------------------------------------------------------------===//
108306e86561a5261a59f5c391d5cc5cb4aa38dca83cDevang Patel// PassManager implementation
108406e86561a5261a59f5c391d5cc5cb4aa38dca83cDevang Patel
10855a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel/// Create new pass manager
10863162691f69f85f740bc28f3ddca39b166d35187cDevang PatelPassManager::PassManager() {
10875f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel  PM = new PassManagerImpl(0);
1088dff33ef8e863241193463fd0129657c5ebce4d58Devang Patel  // PM is the top level manager
1089dff33ef8e863241193463fd0129657c5ebce4d58Devang Patel  PM->setTopLevelManager(PM);
10905a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel}
10915a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
10923162691f69f85f740bc28f3ddca39b166d35187cDevang PatelPassManager::~PassManager() {
109337a6f7966c39f69a92419d37949a94a758c29e90Devang Patel  delete PM;
109437a6f7966c39f69a92419d37949a94a758c29e90Devang Patel}
109537a6f7966c39f69a92419d37949a94a758c29e90Devang Patel
10965a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel/// add - Add a pass to the queue of passes to run.  This passes ownership of
10975a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel/// the Pass to the PassManager.  When the PassManager is destroyed, the pass
10985a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel/// will be destroyed as well, so there is no need to delete the pass.  This
10995a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel/// implies that all passes MUST be allocated with 'new'.
11005a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patelvoid
11013162691f69f85f740bc28f3ddca39b166d35187cDevang PatelPassManager::add(Pass *P) {
11025a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  PM->add(P);
11035a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel}
11045a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
11055a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel/// run - Execute all of the passes scheduled for execution.  Keep track of
11065a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel/// whether any of the passes modifies the module, and if so, return true.
11075a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patelbool
11083162691f69f85f740bc28f3ddca39b166d35187cDevang PatelPassManager::run(Module &M) {
11095a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel  return PM->run(M);
11105a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel}
11115a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel
11128e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel//===----------------------------------------------------------------------===//
11138e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel// TimingInfo Class - This class is used to calculate information about the
11148e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel// amount of time each pass takes to execute.  This only happens with
11158e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel// -time-passes is enabled on the command line.
11168e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel//
11178e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patelbool llvm::TimePassesIsEnabled = false;
11188e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patelstatic cl::opt<bool,true>
11198e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang PatelEnableTiming("time-passes", cl::location(TimePassesIsEnabled),
11208e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel            cl::desc("Time each pass, printing elapsed time for each on exit"));
11218e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel
11228e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel// createTheTimeInfo - This method either initializes the TheTimeInfo pointer to
11238e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel// a non null value (if the -time-passes option is enabled) or it leaves it
11248e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel// null.  It may be called multiple times.
11258e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patelvoid TimingInfo::createTheTimeInfo() {
11268e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel  if (!TimePassesIsEnabled || TheTimeInfo) return;
11278e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel
11288e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel  // Constructed the first time this is called, iff -time-passes is enabled.
11298e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel  // This guarantees that the object will be constructed before static globals,
11308e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel  // thus it will be destroyed before them.
11318e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel  static ManagedStatic<TimingInfo> TTI;
11328e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel  TheTimeInfo = &*TTI;
11338e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel}
11348e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel
1135c874eb54ecf57f493c49934a327e0e4e49f0ff10Devang Patel/// If TimingInfo is enabled then start pass timer.
1136c874eb54ecf57f493c49934a327e0e4e49f0ff10Devang Patelvoid StartPassTimer(Pass *P) {
1137c874eb54ecf57f493c49934a327e0e4e49f0ff10Devang Patel  if (TheTimeInfo)
1138c874eb54ecf57f493c49934a327e0e4e49f0ff10Devang Patel    TheTimeInfo->passStarted(P);
1139c874eb54ecf57f493c49934a327e0e4e49f0ff10Devang Patel}
1140c874eb54ecf57f493c49934a327e0e4e49f0ff10Devang Patel
1141c874eb54ecf57f493c49934a327e0e4e49f0ff10Devang Patel/// If TimingInfo is enabled then stop pass timer.
1142c874eb54ecf57f493c49934a327e0e4e49f0ff10Devang Patelvoid StopPassTimer(Pass *P) {
1143c874eb54ecf57f493c49934a327e0e4e49f0ff10Devang Patel  if (TheTimeInfo)
1144c874eb54ecf57f493c49934a327e0e4e49f0ff10Devang Patel    TheTimeInfo->passEnded(P);
1145c874eb54ecf57f493c49934a327e0e4e49f0ff10Devang Patel}
1146c874eb54ecf57f493c49934a327e0e4e49f0ff10Devang Patel
114709e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel//===----------------------------------------------------------------------===//
114809e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel// PMStack implementation
114909e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel//
115036bcb82c3f7acd7cc3a79f51102c5995db2fb723Devang Patel
115109e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel// Pop Pass Manager from the stack and clear its analysis info.
115209e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patelvoid PMStack::pop() {
115309e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel
115409e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel  PMDataManager *Top = this->top();
115509e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel  Top->initializeAnalysisInfo();
115609e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel
115709e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel  S.pop_back();
115809e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel}
115909e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel
116009e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel// Push PM on the stack and set its top level manager.
116197149737f27457b0411e49af3e4539688e29848fDevang Patelvoid PMStack::push(Pass *P) {
116209e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel
116397149737f27457b0411e49af3e4539688e29848fDevang Patel  PMDataManager *Top = NULL;
116497149737f27457b0411e49af3e4539688e29848fDevang Patel  PMDataManager *PM = dynamic_cast<PMDataManager *>(P);
116597149737f27457b0411e49af3e4539688e29848fDevang Patel  assert (PM && "Unable to push. Pass Manager expected");
116697149737f27457b0411e49af3e4539688e29848fDevang Patel
116797149737f27457b0411e49af3e4539688e29848fDevang Patel  if (this->empty()) {
116897149737f27457b0411e49af3e4539688e29848fDevang Patel    Top = PM;
116997149737f27457b0411e49af3e4539688e29848fDevang Patel  }
117097149737f27457b0411e49af3e4539688e29848fDevang Patel  else {
117197149737f27457b0411e49af3e4539688e29848fDevang Patel    Top = this->top();
117297149737f27457b0411e49af3e4539688e29848fDevang Patel    PMTopLevelManager *TPM = Top->getTopLevelManager();
117397149737f27457b0411e49af3e4539688e29848fDevang Patel
117497149737f27457b0411e49af3e4539688e29848fDevang Patel    assert (TPM && "Unable to find top level manager");
117597149737f27457b0411e49af3e4539688e29848fDevang Patel    TPM->addIndirectPassManager(PM);
117697149737f27457b0411e49af3e4539688e29848fDevang Patel    PM->setTopLevelManager(TPM);
117797149737f27457b0411e49af3e4539688e29848fDevang Patel  }
117897149737f27457b0411e49af3e4539688e29848fDevang Patel
117997149737f27457b0411e49af3e4539688e29848fDevang Patel  AnalysisResolver *AR = new AnalysisResolver(*Top);
118097149737f27457b0411e49af3e4539688e29848fDevang Patel  P->setResolver(AR);
118197149737f27457b0411e49af3e4539688e29848fDevang Patel
118297149737f27457b0411e49af3e4539688e29848fDevang Patel  S.push_back(PM);
118397149737f27457b0411e49af3e4539688e29848fDevang Patel}
118409e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel
118597149737f27457b0411e49af3e4539688e29848fDevang Patel// Dump content of the pass manager stack.
118697149737f27457b0411e49af3e4539688e29848fDevang Patelvoid PMStack::dump() {
118797149737f27457b0411e49af3e4539688e29848fDevang Patel  for(std::deque<PMDataManager *>::iterator I = S.begin(),
118897149737f27457b0411e49af3e4539688e29848fDevang Patel        E = S.end(); I != E; ++I) {
118997149737f27457b0411e49af3e4539688e29848fDevang Patel    Pass *P = dynamic_cast<Pass *>(*I);
119097149737f27457b0411e49af3e4539688e29848fDevang Patel    printf ("%s ", P->getPassName());
119197149737f27457b0411e49af3e4539688e29848fDevang Patel  }
119297149737f27457b0411e49af3e4539688e29848fDevang Patel  if (!S.empty())
119397149737f27457b0411e49af3e4539688e29848fDevang Patel    printf ("\n");
119409e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel}
119509e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel
119609e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel// Walk Pass Manager stack and set LastUse markers if any
119709e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel// manager is transfering this priviledge to its parent manager
119809e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patelvoid PMStack::handleLastUserOverflow() {
119909e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel
120009e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel  for(PMStack::iterator I = this->begin(), E = this->end(); I != E;) {
120109e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel
120209e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel    PMDataManager *Child = *I++;
120309e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel    if (I != E) {
120409e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel      PMDataManager *Parent = *I++;
120509e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel      PMTopLevelManager *TPM = Parent->getTopLevelManager();
120609e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel      std::vector<Pass *> &TLU = Child->getTransferredLastUses();
120709e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel      if (!TLU.empty()) {
120809e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel        Pass *P = dynamic_cast<Pass *>(Parent);
120909e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel        TPM->setLastUser(TLU, P);
121009e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel      }
121109e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel    }
121209e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel  }
121309e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel}
121409e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel
121509e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel/// Find appropriate Module Pass Manager in the PM Stack and
121609e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel/// add self into that manager.
1217be1ffc6b8d3db7b1a9d512a1d53afd075d8e58c9Devang Patelvoid ModulePass::assignPassManager(PMStack &PMS,
1218be1ffc6b8d3db7b1a9d512a1d53afd075d8e58c9Devang Patel				   PassManagerType PreferredType) {
121909e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel
122009e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel  // Find Module Pass Manager
122109e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel  while(!PMS.empty()) {
122244b0d29802ea87d68648dec798fd564eb3cbaa32Devang Patel    PassManagerType TopPMType = PMS.top()->getPassManagerType();
122344b0d29802ea87d68648dec798fd564eb3cbaa32Devang Patel    if (TopPMType == PreferredType)
122444b0d29802ea87d68648dec798fd564eb3cbaa32Devang Patel      break; // We found desired pass manager
122544b0d29802ea87d68648dec798fd564eb3cbaa32Devang Patel    else if (TopPMType > PMT_ModulePassManager)
122609e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel      PMS.pop();    // Pop children pass managers
12276b9420e94392040fbe6b2af5e49adbcbc6b32615Devang Patel    else
12286b9420e94392040fbe6b2af5e49adbcbc6b32615Devang Patel      break;
122909e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel  }
123009e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel
123144b0d29802ea87d68648dec798fd564eb3cbaa32Devang Patel  PMS.top()->add(this);
123209e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel}
123309e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel
12349d133e150faac44b8d8d1b53516cbad4d9bbf84aDevang Patel/// Find appropriate Function Pass Manager or Call Graph Pass Manager
12359d133e150faac44b8d8d1b53516cbad4d9bbf84aDevang Patel/// in the PM Stack and add self into that manager.
1236be1ffc6b8d3db7b1a9d512a1d53afd075d8e58c9Devang Patelvoid FunctionPass::assignPassManager(PMStack &PMS,
1237be1ffc6b8d3db7b1a9d512a1d53afd075d8e58c9Devang Patel				     PassManagerType PreferredType) {
123809e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel
123997149737f27457b0411e49af3e4539688e29848fDevang Patel  // Find Module Pass Manager (TODO : Or Call Graph Pass Manager)
124009e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel  while(!PMS.empty()) {
12416b9420e94392040fbe6b2af5e49adbcbc6b32615Devang Patel    if (PMS.top()->getPassManagerType() > PMT_FunctionPassManager)
12426b9420e94392040fbe6b2af5e49adbcbc6b32615Devang Patel      PMS.pop();
124309e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel    else
12449d133e150faac44b8d8d1b53516cbad4d9bbf84aDevang Patel      break;
124509e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel  }
12469d133e150faac44b8d8d1b53516cbad4d9bbf84aDevang Patel  FPPassManager *FPP = dynamic_cast<FPPassManager *>(PMS.top());
124709e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel
12489d133e150faac44b8d8d1b53516cbad4d9bbf84aDevang Patel  // Create new Function Pass Manager
12499d133e150faac44b8d8d1b53516cbad4d9bbf84aDevang Patel  if (!FPP) {
12509d133e150faac44b8d8d1b53516cbad4d9bbf84aDevang Patel    assert(!PMS.empty() && "Unable to create Function Pass Manager");
12519d133e150faac44b8d8d1b53516cbad4d9bbf84aDevang Patel    PMDataManager *PMD = PMS.top();
125297149737f27457b0411e49af3e4539688e29848fDevang Patel
12539d133e150faac44b8d8d1b53516cbad4d9bbf84aDevang Patel    // [1] Create new Function Pass Manager
12549d133e150faac44b8d8d1b53516cbad4d9bbf84aDevang Patel    FPP = new FPPassManager(PMD->getDepth() + 1);
125597149737f27457b0411e49af3e4539688e29848fDevang Patel
12569d133e150faac44b8d8d1b53516cbad4d9bbf84aDevang Patel    // [2] Set up new manager's top level manager
12579d133e150faac44b8d8d1b53516cbad4d9bbf84aDevang Patel    PMTopLevelManager *TPM = PMD->getTopLevelManager();
12589d133e150faac44b8d8d1b53516cbad4d9bbf84aDevang Patel    TPM->addIndirectPassManager(FPP);
125997149737f27457b0411e49af3e4539688e29848fDevang Patel
12609d133e150faac44b8d8d1b53516cbad4d9bbf84aDevang Patel    // [3] Assign manager to manage this new manager. This may create
12619d133e150faac44b8d8d1b53516cbad4d9bbf84aDevang Patel    // and push new managers into PMS
12629d133e150faac44b8d8d1b53516cbad4d9bbf84aDevang Patel    Pass *P = dynamic_cast<Pass *>(FPP);
1263be1ffc6b8d3db7b1a9d512a1d53afd075d8e58c9Devang Patel
1264be1ffc6b8d3db7b1a9d512a1d53afd075d8e58c9Devang Patel    // If Call Graph Pass Manager is active then use it to manage
1265be1ffc6b8d3db7b1a9d512a1d53afd075d8e58c9Devang Patel    // this new Function Pass manager.
1266be1ffc6b8d3db7b1a9d512a1d53afd075d8e58c9Devang Patel    if (PMD->getPassManagerType() == PMT_CallGraphPassManager)
1267be1ffc6b8d3db7b1a9d512a1d53afd075d8e58c9Devang Patel      P->assignPassManager(PMS, PMT_CallGraphPassManager);
1268be1ffc6b8d3db7b1a9d512a1d53afd075d8e58c9Devang Patel    else
1269be1ffc6b8d3db7b1a9d512a1d53afd075d8e58c9Devang Patel      P->assignPassManager(PMS);
12709d133e150faac44b8d8d1b53516cbad4d9bbf84aDevang Patel
12719d133e150faac44b8d8d1b53516cbad4d9bbf84aDevang Patel    // [4] Push new manager into PMS
12729d133e150faac44b8d8d1b53516cbad4d9bbf84aDevang Patel    PMS.push(FPP);
12739d133e150faac44b8d8d1b53516cbad4d9bbf84aDevang Patel  }
127409e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel
12759d133e150faac44b8d8d1b53516cbad4d9bbf84aDevang Patel  // Assign FPP as the manager of this pass.
12769d133e150faac44b8d8d1b53516cbad4d9bbf84aDevang Patel  FPP->add(this);
127709e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel}
127809e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel
12799d133e150faac44b8d8d1b53516cbad4d9bbf84aDevang Patel/// Find appropriate Basic Pass Manager or Call Graph Pass Manager
12809d133e150faac44b8d8d1b53516cbad4d9bbf84aDevang Patel/// in the PM Stack and add self into that manager.
1281be1ffc6b8d3db7b1a9d512a1d53afd075d8e58c9Devang Patelvoid BasicBlockPass::assignPassManager(PMStack &PMS,
1282be1ffc6b8d3db7b1a9d512a1d53afd075d8e58c9Devang Patel				       PassManagerType PreferredType) {
128309e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel
128409e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel  BBPassManager *BBP = NULL;
128509e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel
128697149737f27457b0411e49af3e4539688e29848fDevang Patel  // Basic Pass Manager is a leaf pass manager. It does not handle
128797149737f27457b0411e49af3e4539688e29848fDevang Patel  // any other pass manager.
128897149737f27457b0411e49af3e4539688e29848fDevang Patel  if (!PMS.empty()) {
128909e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel    BBP = dynamic_cast<BBPassManager *>(PMS.top());
129009e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel  }
129109e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel
12929d133e150faac44b8d8d1b53516cbad4d9bbf84aDevang Patel  // If leaf manager is not Basic Block Pass manager then create new
12939d133e150faac44b8d8d1b53516cbad4d9bbf84aDevang Patel  // basic Block Pass manager.
12949d133e150faac44b8d8d1b53516cbad4d9bbf84aDevang Patel
12959d133e150faac44b8d8d1b53516cbad4d9bbf84aDevang Patel  if (!BBP) {
12969d133e150faac44b8d8d1b53516cbad4d9bbf84aDevang Patel    assert(!PMS.empty() && "Unable to create BasicBlock Pass Manager");
12979d133e150faac44b8d8d1b53516cbad4d9bbf84aDevang Patel    PMDataManager *PMD = PMS.top();
12989d133e150faac44b8d8d1b53516cbad4d9bbf84aDevang Patel
12999d133e150faac44b8d8d1b53516cbad4d9bbf84aDevang Patel    // [1] Create new Basic Block Manager
13009d133e150faac44b8d8d1b53516cbad4d9bbf84aDevang Patel    BBP = new BBPassManager(PMD->getDepth() + 1);
13019d133e150faac44b8d8d1b53516cbad4d9bbf84aDevang Patel
13029d133e150faac44b8d8d1b53516cbad4d9bbf84aDevang Patel    // [2] Set up new manager's top level manager
13039d133e150faac44b8d8d1b53516cbad4d9bbf84aDevang Patel    // Basic Block Pass Manager does not live by itself
13049d133e150faac44b8d8d1b53516cbad4d9bbf84aDevang Patel    PMTopLevelManager *TPM = PMD->getTopLevelManager();
13059d133e150faac44b8d8d1b53516cbad4d9bbf84aDevang Patel    TPM->addIndirectPassManager(BBP);
130697149737f27457b0411e49af3e4539688e29848fDevang Patel
130797149737f27457b0411e49af3e4539688e29848fDevang Patel    // [3] Assign manager to manage this new manager. This may create
130897149737f27457b0411e49af3e4539688e29848fDevang Patel    // and push new managers into PMS
13099d133e150faac44b8d8d1b53516cbad4d9bbf84aDevang Patel    Pass *P = dynamic_cast<Pass *>(BBP);
13109d133e150faac44b8d8d1b53516cbad4d9bbf84aDevang Patel    P->assignPassManager(PMS);
1311531f01f878915fc51ccf5e1194a2dc8d73c207cdDevang Patel
13129d133e150faac44b8d8d1b53516cbad4d9bbf84aDevang Patel    // [4] Push new manager into PMS
13139d133e150faac44b8d8d1b53516cbad4d9bbf84aDevang Patel    PMS.push(BBP);
13149d133e150faac44b8d8d1b53516cbad4d9bbf84aDevang Patel  }
131509e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel
13169d133e150faac44b8d8d1b53516cbad4d9bbf84aDevang Patel  // Assign BBP as the manager of this pass.
13179d133e150faac44b8d8d1b53516cbad4d9bbf84aDevang Patel  BBP->add(this);
131809e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel}
131909e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel
1320cccd80dfa316019047f053c55f1b94f63b17c043Devang Patel
1321