PassManager.cpp revision 6b9420e94392040fbe6b2af5e49adbcbc6b32615
155fd43f90913676682487f89f27c756adb827f66Devang Patel//===- PassManager.cpp - LLVM Pass Infrastructure Implementation ----------===// 255fd43f90913676682487f89f27c756adb827f66Devang Patel// 355fd43f90913676682487f89f27c756adb827f66Devang Patel// The LLVM Compiler Infrastructure 455fd43f90913676682487f89f27c756adb827f66Devang Patel// 5c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel// This file was developed by Devang Patel and is distributed under 655fd43f90913676682487f89f27c756adb827f66Devang Patel// the University of Illinois Open Source License. See LICENSE.TXT for details. 755fd43f90913676682487f89f27c756adb827f66Devang Patel// 855fd43f90913676682487f89f27c756adb827f66Devang Patel//===----------------------------------------------------------------------===// 955fd43f90913676682487f89f27c756adb827f66Devang Patel// 1055fd43f90913676682487f89f27c756adb827f66Devang Patel// This file implements the LLVM Pass Manager infrastructure. 1155fd43f90913676682487f89f27c756adb827f66Devang Patel// 1255fd43f90913676682487f89f27c756adb827f66Devang Patel//===----------------------------------------------------------------------===// 1355fd43f90913676682487f89f27c756adb827f66Devang Patel 1455fd43f90913676682487f89f27c756adb827f66Devang Patel 1555fd43f90913676682487f89f27c756adb827f66Devang Patel#include "llvm/PassManager.h" 1645dc02d6f97447785ee7ffe08c36a34bc8921b0bDevang Patel#include "llvm/Support/CommandLine.h" 178e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel#include "llvm/Support/Timer.h" 1855fd43f90913676682487f89f27c756adb827f66Devang Patel#include "llvm/Module.h" 193799f97d539f6c288d169063e1b335917fafcffbDevang Patel#include "llvm/ModuleProvider.h" 208f487662869d10c866b9ebdccb8f6a7509d3ab56Bill Wendling#include "llvm/Support/Streams.h" 218e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel#include "llvm/Support/ManagedStatic.h" 2285d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel#include <vector> 23b899eed1bc0a64f96fa7aff8d7c6f999cf85bdfeDevang Patel#include <map> 24c2ff962bf97761a54c94d2dadb555060403d49c6Devang Patel 2555fd43f90913676682487f89f27c756adb827f66Devang Patelusing namespace llvm; 26c2ff962bf97761a54c94d2dadb555060403d49c6Devang Patelclass llvm::PMDataManager; 2755fd43f90913676682487f89f27c756adb827f66Devang Patel 28e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel//===----------------------------------------------------------------------===// 29e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel// Overview: 30e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel// The Pass Manager Infrastructure manages passes. It's responsibilities are: 31e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel// 32e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel// o Manage optimization pass execution order 33e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel// o Make required Analysis information available before pass P is run 34e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel// o Release memory occupied by dead passes 35e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel// o If Analysis information is dirtied by a pass then regenerate Analysis 36e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel// information before it is consumed by another pass. 37e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel// 38a84b3025ca7d437d2eab22d7c3002c8d89c31858Chris Lattner// Pass Manager Infrastructure uses multiple pass managers. They are 395f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel// PassManager, FunctionPassManager, MPPassManager, FPPassManager, BBPassManager. 40a84b3025ca7d437d2eab22d7c3002c8d89c31858Chris Lattner// This class hierarcy uses multiple inheritance but pass managers do not derive 41a84b3025ca7d437d2eab22d7c3002c8d89c31858Chris Lattner// from another pass manager. 42e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel// 43a84b3025ca7d437d2eab22d7c3002c8d89c31858Chris Lattner// PassManager and FunctionPassManager are two top-level pass manager that 44e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel// represents the external interface of this entire pass manager infrastucture. 45e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel// 46e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel// Important classes : 47e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel// 48e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel// [o] class PMTopLevelManager; 49e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel// 50e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel// Two top level managers, PassManager and FunctionPassManager, derive from 51e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel// PMTopLevelManager. PMTopLevelManager manages information used by top level 52e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel// managers such as last user info. 53e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel// 54e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel// [o] class PMDataManager; 55e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel// 56e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel// PMDataManager manages information, e.g. list of available analysis info, 57e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel// used by a pass manager to manage execution order of passes. It also provides 58e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel// a place to implement common pass manager APIs. All pass managers derive from 59e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel// PMDataManager. 60e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel// 615f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel// [o] class BBPassManager : public FunctionPass, public PMDataManager; 62e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel// 635f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel// BBPassManager manages BasicBlockPasses. 64e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel// 65e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel// [o] class FunctionPassManager; 66e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel// 67e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel// This is a external interface used by JIT to manage FunctionPasses. This 68e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel// interface relies on FunctionPassManagerImpl to do all the tasks. 69e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel// 70e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel// [o] class FunctionPassManagerImpl : public ModulePass, PMDataManager, 71e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel// public PMTopLevelManager; 72e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel// 735f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel// FunctionPassManagerImpl is a top level manager. It manages FPPassManagers 74e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel// 755f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel// [o] class FPPassManager : public ModulePass, public PMDataManager; 76e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel// 775f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel// FPPassManager manages FunctionPasses and BBPassManagers 785f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel// 795f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel// [o] class MPPassManager : public Pass, public PMDataManager; 805f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel// 815f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel// MPPassManager manages ModulePasses and FPPassManagers 82e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel// 83e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel// [o] class PassManager; 84e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel// 85e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel// This is a external interface used by various tools to manages passes. It 86e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel// relies on PassManagerImpl to do all the tasks. 87e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel// 88e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel// [o] class PassManagerImpl : public Pass, public PMDataManager, 89e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel// public PMDTopLevelManager 90e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel// 91e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel// PassManagerImpl is a top level pass manager responsible for managing 925f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel// MPPassManagers. 93e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel//===----------------------------------------------------------------------===// 94e77242c3d5843a5a6484794254623c8552dc6a4fDevang Patel 9545dc02d6f97447785ee7ffe08c36a34bc8921b0bDevang Patelnamespace llvm { 9645dc02d6f97447785ee7ffe08c36a34bc8921b0bDevang Patel 9745dc02d6f97447785ee7ffe08c36a34bc8921b0bDevang Patel//===----------------------------------------------------------------------===// 9845dc02d6f97447785ee7ffe08c36a34bc8921b0bDevang Patel// Pass debugging information. Often it is useful to find out what pass is 9945dc02d6f97447785ee7ffe08c36a34bc8921b0bDevang Patel// running when a crash occurs in a utility. When this library is compiled with 10045dc02d6f97447785ee7ffe08c36a34bc8921b0bDevang Patel// debugging on, a command line option (--debug-pass) is enabled that causes the 10145dc02d6f97447785ee7ffe08c36a34bc8921b0bDevang Patel// pass name to be printed before it executes. 10245dc02d6f97447785ee7ffe08c36a34bc8921b0bDevang Patel// 10345dc02d6f97447785ee7ffe08c36a34bc8921b0bDevang Patel 104e8ff1ce7343c697ff90d940c8c5fa8fccc09220dDevang Patel// Different debug levels that can be enabled... 105e8ff1ce7343c697ff90d940c8c5fa8fccc09220dDevang Patelenum PassDebugLevel { 106e8ff1ce7343c697ff90d940c8c5fa8fccc09220dDevang Patel None, Arguments, Structure, Executions, Details 107e8ff1ce7343c697ff90d940c8c5fa8fccc09220dDevang Patel}; 108e8ff1ce7343c697ff90d940c8c5fa8fccc09220dDevang Patel 10945dc02d6f97447785ee7ffe08c36a34bc8921b0bDevang Patelstatic cl::opt<enum PassDebugLevel> 11045dc02d6f97447785ee7ffe08c36a34bc8921b0bDevang PatelPassDebugging_New("debug-pass", cl::Hidden, 11145dc02d6f97447785ee7ffe08c36a34bc8921b0bDevang Patel cl::desc("Print PassManager debugging information"), 11245dc02d6f97447785ee7ffe08c36a34bc8921b0bDevang Patel cl::values( 113e8ff1ce7343c697ff90d940c8c5fa8fccc09220dDevang Patel clEnumVal(None , "disable debug output"), 114e8ff1ce7343c697ff90d940c8c5fa8fccc09220dDevang Patel clEnumVal(Arguments , "print pass arguments to pass to 'opt'"), 115e8ff1ce7343c697ff90d940c8c5fa8fccc09220dDevang Patel clEnumVal(Structure , "print pass structure before run()"), 116e8ff1ce7343c697ff90d940c8c5fa8fccc09220dDevang Patel clEnumVal(Executions, "print pass name before it is executed"), 117e8ff1ce7343c697ff90d940c8c5fa8fccc09220dDevang Patel clEnumVal(Details , "print pass details when it is executed"), 11845dc02d6f97447785ee7ffe08c36a34bc8921b0bDevang Patel clEnumValEnd)); 11945dc02d6f97447785ee7ffe08c36a34bc8921b0bDevang Patel} // End of llvm namespace 12045dc02d6f97447785ee7ffe08c36a34bc8921b0bDevang Patel 121c2ff962bf97761a54c94d2dadb555060403d49c6Devang Patelnamespace { 1221b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel 1233f5d2b58b84cb12a9520dd33921ca556d539eb4dDevang Patel//===----------------------------------------------------------------------===// 1243f5d2b58b84cb12a9520dd33921ca556d539eb4dDevang Patel// PMTopLevelManager 1253f5d2b58b84cb12a9520dd33921ca556d539eb4dDevang Patel// 1263f5d2b58b84cb12a9520dd33921ca556d539eb4dDevang Patel/// PMTopLevelManager manages LastUser info and collects common APIs used by 1273f5d2b58b84cb12a9520dd33921ca556d539eb4dDevang Patel/// top level pass managers. 128c2ff962bf97761a54c94d2dadb555060403d49c6Devang Patelclass VISIBILITY_HIDDEN PMTopLevelManager { 1293f5d2b58b84cb12a9520dd33921ca556d539eb4dDevang Patelpublic: 1303f5d2b58b84cb12a9520dd33921ca556d539eb4dDevang Patel 1315f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel virtual unsigned getNumContainedManagers() { 1325f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel return PassManagers.size(); 1333f5d2b58b84cb12a9520dd33921ca556d539eb4dDevang Patel } 1343f5d2b58b84cb12a9520dd33921ca556d539eb4dDevang Patel 1353f5d2b58b84cb12a9520dd33921ca556d539eb4dDevang Patel /// Schedule pass P for execution. Make sure that passes required by 1363f5d2b58b84cb12a9520dd33921ca556d539eb4dDevang Patel /// P are run before P is run. Update analysis info maintained by 1373f5d2b58b84cb12a9520dd33921ca556d539eb4dDevang Patel /// the manager. Remove dead passes. This is a recursive function. 138e61b7478e53cea3183d4aee3799a4f0977b850a0Devang Patel void schedulePass(Pass *P); 1393f5d2b58b84cb12a9520dd33921ca556d539eb4dDevang Patel 1403f5d2b58b84cb12a9520dd33921ca556d539eb4dDevang Patel /// This is implemented by top level pass manager and used by 1413f5d2b58b84cb12a9520dd33921ca556d539eb4dDevang Patel /// schedulePass() to add analysis info passes that are not available. 1423f5d2b58b84cb12a9520dd33921ca556d539eb4dDevang Patel virtual void addTopLevelPass(Pass *P) = 0; 1433f5d2b58b84cb12a9520dd33921ca556d539eb4dDevang Patel 1443f5d2b58b84cb12a9520dd33921ca556d539eb4dDevang Patel /// Set pass P as the last user of the given analysis passes. 1453f5d2b58b84cb12a9520dd33921ca556d539eb4dDevang Patel void setLastUser(std::vector<Pass *> &AnalysisPasses, Pass *P); 1463f5d2b58b84cb12a9520dd33921ca556d539eb4dDevang Patel 1473f5d2b58b84cb12a9520dd33921ca556d539eb4dDevang Patel /// Collect passes whose last user is P 1483f5d2b58b84cb12a9520dd33921ca556d539eb4dDevang Patel void collectLastUses(std::vector<Pass *> &LastUses, Pass *P); 1493f5d2b58b84cb12a9520dd33921ca556d539eb4dDevang Patel 15069867b511c732a7fac7301977bd6e880e46439f1Devang Patel /// Find the pass that implements Analysis AID. Search immutable 15169867b511c732a7fac7301977bd6e880e46439f1Devang Patel /// passes and all pass managers. If desired pass is not found 15269867b511c732a7fac7301977bd6e880e46439f1Devang Patel /// then return NULL. 15369867b511c732a7fac7301977bd6e880e46439f1Devang Patel Pass *findAnalysisPass(AnalysisID AID); 15469867b511c732a7fac7301977bd6e880e46439f1Devang Patel 1553f5d2b58b84cb12a9520dd33921ca556d539eb4dDevang Patel virtual ~PMTopLevelManager() { 15637a6f7966c39f69a92419d37949a94a758c29e90Devang Patel for (std::vector<Pass *>::iterator I = PassManagers.begin(), 15737a6f7966c39f69a92419d37949a94a758c29e90Devang Patel E = PassManagers.end(); I != E; ++I) 15837a6f7966c39f69a92419d37949a94a758c29e90Devang Patel delete *I; 15937a6f7966c39f69a92419d37949a94a758c29e90Devang Patel 16037a6f7966c39f69a92419d37949a94a758c29e90Devang Patel for (std::vector<ImmutablePass *>::iterator 16137a6f7966c39f69a92419d37949a94a758c29e90Devang Patel I = ImmutablePasses.begin(), E = ImmutablePasses.end(); I != E; ++I) 16237a6f7966c39f69a92419d37949a94a758c29e90Devang Patel delete *I; 16337a6f7966c39f69a92419d37949a94a758c29e90Devang Patel 1643f5d2b58b84cb12a9520dd33921ca556d539eb4dDevang Patel PassManagers.clear(); 1653f5d2b58b84cb12a9520dd33921ca556d539eb4dDevang Patel } 1663f5d2b58b84cb12a9520dd33921ca556d539eb4dDevang Patel 1673e44559d0137f2c3e3bf7a0c1e0004e0a5c81137Devang Patel /// Add immutable pass and initialize it. 1683e44559d0137f2c3e3bf7a0c1e0004e0a5c81137Devang Patel inline void addImmutablePass(ImmutablePass *P) { 1693e44559d0137f2c3e3bf7a0c1e0004e0a5c81137Devang Patel P->initializePass(); 1703e44559d0137f2c3e3bf7a0c1e0004e0a5c81137Devang Patel ImmutablePasses.push_back(P); 1713e44559d0137f2c3e3bf7a0c1e0004e0a5c81137Devang Patel } 1723e44559d0137f2c3e3bf7a0c1e0004e0a5c81137Devang Patel 1733e44559d0137f2c3e3bf7a0c1e0004e0a5c81137Devang Patel inline std::vector<ImmutablePass *>& getImmutablePasses() { 1743e44559d0137f2c3e3bf7a0c1e0004e0a5c81137Devang Patel return ImmutablePasses; 1753e44559d0137f2c3e3bf7a0c1e0004e0a5c81137Devang Patel } 1763e44559d0137f2c3e3bf7a0c1e0004e0a5c81137Devang Patel 177a083e94f7971ddafb817b1bcd86992d9fc4d8f9eDevang Patel void addPassManager(Pass *Manager) { 178a083e94f7971ddafb817b1bcd86992d9fc4d8f9eDevang Patel PassManagers.push_back(Manager); 179a083e94f7971ddafb817b1bcd86992d9fc4d8f9eDevang Patel } 180a083e94f7971ddafb817b1bcd86992d9fc4d8f9eDevang Patel 181591b1b7526ed9c099de23cc995853a250c20502fDevang Patel // Add Manager into the list of managers that are not directly 182591b1b7526ed9c099de23cc995853a250c20502fDevang Patel // maintained by this top level pass manager 1831b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel inline void addIndirectPassManager(PMDataManager *Manager) { 1841b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel IndirectPassManagers.push_back(Manager); 185591b1b7526ed9c099de23cc995853a250c20502fDevang Patel } 186591b1b7526ed9c099de23cc995853a250c20502fDevang Patel 187ebc0922eeb5b728d33a68d4bea8128413f62e369Devang Patel // Print passes managed by this top level manager. 188a52035a062edf9bfbf95c92c615219b647042c17Devang Patel void dumpPasses() const; 189a52035a062edf9bfbf95c92c615219b647042c17Devang Patel void dumpArguments() const; 190ebc0922eeb5b728d33a68d4bea8128413f62e369Devang Patel 1911336a6bf06e64a096217628d2cc9644e48a5d7d6Devang Patel void initializeAllAnalysisInfo(); 1921336a6bf06e64a096217628d2cc9644e48a5d7d6Devang Patel 1935f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patelprotected: 1943f5d2b58b84cb12a9520dd33921ca556d539eb4dDevang Patel 1953f5d2b58b84cb12a9520dd33921ca556d539eb4dDevang Patel /// Collection of pass managers 1963f5d2b58b84cb12a9520dd33921ca556d539eb4dDevang Patel std::vector<Pass *> PassManagers; 1973f5d2b58b84cb12a9520dd33921ca556d539eb4dDevang Patel 1985f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patelprivate: 1995f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel 200591b1b7526ed9c099de23cc995853a250c20502fDevang Patel /// Collection of pass managers that are not directly maintained 201591b1b7526ed9c099de23cc995853a250c20502fDevang Patel /// by this pass manager 2021b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel std::vector<PMDataManager *> IndirectPassManagers; 203591b1b7526ed9c099de23cc995853a250c20502fDevang Patel 2043f5d2b58b84cb12a9520dd33921ca556d539eb4dDevang Patel // Map to keep track of last user of the analysis pass. 2053f5d2b58b84cb12a9520dd33921ca556d539eb4dDevang Patel // LastUser->second is the last user of Lastuser->first. 2063f5d2b58b84cb12a9520dd33921ca556d539eb4dDevang Patel std::map<Pass *, Pass *> LastUser; 2073e44559d0137f2c3e3bf7a0c1e0004e0a5c81137Devang Patel 2083e44559d0137f2c3e3bf7a0c1e0004e0a5c81137Devang Patel /// Immutable passes are managed by top level manager. 2093e44559d0137f2c3e3bf7a0c1e0004e0a5c81137Devang Patel std::vector<ImmutablePass *> ImmutablePasses; 2103f5d2b58b84cb12a9520dd33921ca556d539eb4dDevang Patel}; 211c2ff962bf97761a54c94d2dadb555060403d49c6Devang Patel 212c2ff962bf97761a54c94d2dadb555060403d49c6Devang Patel} // End of anon namespace 2133f5d2b58b84cb12a9520dd33921ca556d539eb4dDevang Patel 214dc48f203cdc5a0b8f79d28bab6219161061fd73bDevang Patel//===----------------------------------------------------------------------===// 215dc48f203cdc5a0b8f79d28bab6219161061fd73bDevang Patel// PMDataManager 2163f5d2b58b84cb12a9520dd33921ca556d539eb4dDevang Patel 217c2ff962bf97761a54c94d2dadb555060403d49c6Devang Patelnamespace llvm { 218419f0e95d698109541ad730cb45ba4caca78f458Devang Patel/// PMDataManager provides the common place to manage the analysis data 219419f0e95d698109541ad730cb45ba4caca78f458Devang Patel/// used by pass managers. 220419f0e95d698109541ad730cb45ba4caca78f458Devang Patelclass PMDataManager { 22185d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patelpublic: 2221a8038636c2998e37f2130b0ab89a3686d9c1f48Devang Patel PMDataManager(int Depth) : TPM(NULL), Depth(Depth) { 223dc48f203cdc5a0b8f79d28bab6219161061fd73bDevang Patel initializeAnalysisInfo(); 224dc48f203cdc5a0b8f79d28bab6219161061fd73bDevang Patel } 225dc48f203cdc5a0b8f79d28bab6219161061fd73bDevang Patel 22637a6f7966c39f69a92419d37949a94a758c29e90Devang Patel virtual ~PMDataManager() { 22737a6f7966c39f69a92419d37949a94a758c29e90Devang Patel 22837a6f7966c39f69a92419d37949a94a758c29e90Devang Patel for (std::vector<Pass *>::iterator I = PassVector.begin(), 22937a6f7966c39f69a92419d37949a94a758c29e90Devang Patel E = PassVector.end(); I != E; ++I) 23037a6f7966c39f69a92419d37949a94a758c29e90Devang Patel delete *I; 23137a6f7966c39f69a92419d37949a94a758c29e90Devang Patel 23237a6f7966c39f69a92419d37949a94a758c29e90Devang Patel PassVector.clear(); 23337a6f7966c39f69a92419d37949a94a758c29e90Devang Patel } 23437a6f7966c39f69a92419d37949a94a758c29e90Devang Patel 23585d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel /// Return true IFF pass P's required analysis set does not required new 23685d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel /// manager. 23785d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel bool manageablePass(Pass *P); 23885d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel 23985d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel /// Augment AvailableAnalysis by adding analysis made available by pass P. 240f32b4dd13e421b3ad4696f984cb2043ce64e19cbDevang Patel void recordAvailableAnalysis(Pass *P); 24185d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel 24285d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel /// Remove Analysis that is not preserved by the pass 24385d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel void removeNotPreservedAnalysis(Pass *P); 24485d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel 24585d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel /// Remove dead passes 2464eeea774ce1b24fa55c06aac31e02016d5dd77d6Devang Patel void removeDeadPasses(Pass *P, std::string &Msg); 24785d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel 2484045af1175509c81d6a4708df233f0b1abe888fcDevang Patel /// Add pass P into the PassVector. Update 249893a5a681585cdf3b5bfff7128ea522e8a47750aDevang Patel /// AvailableAnalysis appropriately if ProcessAnalysis is true. 250a84b3025ca7d437d2eab22d7c3002c8d89c31858Chris Lattner void addPassToManager(Pass *P, bool ProcessAnalysis = true); 251e253385b108cd946b1ac150302f246d3b218be77Devang Patel 252c17bbb6da7e17c06c1f0ae7baa2f151db0e966d9Devang Patel /// Initialize available analysis information. 253cbfd29d0da5810949ba66701b91c1b954122077aDevang Patel void initializeAnalysisInfo() { 254ef89c5594aaa5b97f303ba0de99940b79f2c0e0eDevang Patel TransferLastUses.clear(); 255c1d6e1fc9c3a47529f417026df652f466ce67851Devang Patel AvailableAnalysis.clear(); 256c1d6e1fc9c3a47529f417026df652f466ce67851Devang Patel } 257c1d6e1fc9c3a47529f417026df652f466ce67851Devang Patel 258c17bbb6da7e17c06c1f0ae7baa2f151db0e966d9Devang Patel /// Populate RequiredPasses with the analysis pass that are required by 259c17bbb6da7e17c06c1f0ae7baa2f151db0e966d9Devang Patel /// pass P. 260c17bbb6da7e17c06c1f0ae7baa2f151db0e966d9Devang Patel void collectRequiredAnalysisPasses(std::vector<Pass *> &RequiredPasses, 261c17bbb6da7e17c06c1f0ae7baa2f151db0e966d9Devang Patel Pass *P); 262c17bbb6da7e17c06c1f0ae7baa2f151db0e966d9Devang Patel 263c17bbb6da7e17c06c1f0ae7baa2f151db0e966d9Devang Patel /// All Required analyses should be available to the pass as it runs! Here 264c17bbb6da7e17c06c1f0ae7baa2f151db0e966d9Devang Patel /// we fill in the AnalysisImpls member of the pass so that it can 265c17bbb6da7e17c06c1f0ae7baa2f151db0e966d9Devang Patel /// successfully use the getAnalysis() method to retrieve the 266c17bbb6da7e17c06c1f0ae7baa2f151db0e966d9Devang Patel /// implementations it needs. 267c17bbb6da7e17c06c1f0ae7baa2f151db0e966d9Devang Patel void initializeAnalysisImpl(Pass *P); 268b899eed1bc0a64f96fa7aff8d7c6f999cf85bdfeDevang Patel 26969867b511c732a7fac7301977bd6e880e46439f1Devang Patel /// Find the pass that implements Analysis AID. If desired pass is not found 27069867b511c732a7fac7301977bd6e880e46439f1Devang Patel /// then return NULL. 27169867b511c732a7fac7301977bd6e880e46439f1Devang Patel Pass *findAnalysisPass(AnalysisID AID, bool Direction); 27269867b511c732a7fac7301977bd6e880e46439f1Devang Patel 273dc48f203cdc5a0b8f79d28bab6219161061fd73bDevang Patel // Access toplevel manager 274dc48f203cdc5a0b8f79d28bab6219161061fd73bDevang Patel PMTopLevelManager *getTopLevelManager() { return TPM; } 275dc48f203cdc5a0b8f79d28bab6219161061fd73bDevang Patel void setTopLevelManager(PMTopLevelManager *T) { TPM = T; } 276dc48f203cdc5a0b8f79d28bab6219161061fd73bDevang Patel 277a52035a062edf9bfbf95c92c615219b647042c17Devang Patel unsigned getDepth() const { return Depth; } 2784eeea774ce1b24fa55c06aac31e02016d5dd77d6Devang Patel 279a52035a062edf9bfbf95c92c615219b647042c17Devang Patel // Print routines used by debug-pass 280a52035a062edf9bfbf95c92c615219b647042c17Devang Patel void dumpLastUses(Pass *P, unsigned Offset) const; 281a52035a062edf9bfbf95c92c615219b647042c17Devang Patel void dumpPassArguments() const; 282a52035a062edf9bfbf95c92c615219b647042c17Devang Patel void dumpPassInfo(Pass *P, std::string &Msg1, std::string &Msg2) const; 283017b5d969b12119a88463fe2451f20ca9214c4ffDevang Patel void dumpAnalysisSetInfo(const char *Msg, Pass *P, 284a52035a062edf9bfbf95c92c615219b647042c17Devang Patel const std::vector<AnalysisID> &Set) const; 285ef89c5594aaa5b97f303ba0de99940b79f2c0e0eDevang Patel 286ef89c5594aaa5b97f303ba0de99940b79f2c0e0eDevang Patel std::vector<Pass *>& getTransferredLastUses() { 287ef89c5594aaa5b97f303ba0de99940b79f2c0e0eDevang Patel return TransferLastUses; 288ef89c5594aaa5b97f303ba0de99940b79f2c0e0eDevang Patel } 289ef89c5594aaa5b97f303ba0de99940b79f2c0e0eDevang Patel 2901554c8545651350569f08dc7370189da1a7e5814Devang Patel virtual unsigned getNumContainedPasses() { 2911554c8545651350569f08dc7370189da1a7e5814Devang Patel return PassVector.size(); 2921554c8545651350569f08dc7370189da1a7e5814Devang Patel } 2931554c8545651350569f08dc7370189da1a7e5814Devang Patel 29425919cb7802f2682b159a040ba07c5bd12b54efaDevang Patel virtual PassManagerType getPassManagerType() { 29525919cb7802f2682b159a040ba07c5bd12b54efaDevang Patel assert ( 0 && "Invalid use of getPassManagerType"); 29625919cb7802f2682b159a040ba07c5bd12b54efaDevang Patel return PMT_Unknown; 29725919cb7802f2682b159a040ba07c5bd12b54efaDevang Patel } 298e16634065021e36ae31f074f623a636924d6b8d1Devang Patelprotected: 299e16634065021e36ae31f074f623a636924d6b8d1Devang Patel 300ef89c5594aaa5b97f303ba0de99940b79f2c0e0eDevang Patel // If a FunctionPass F is the last user of ModulePass info M 301e16634065021e36ae31f074f623a636924d6b8d1Devang Patel // then the F's manager, not F, records itself as a last user of M. 302ef89c5594aaa5b97f303ba0de99940b79f2c0e0eDevang Patel // Current pass manage is requesting parent manager to record parent 303ef89c5594aaa5b97f303ba0de99940b79f2c0e0eDevang Patel // manager as the last user of these TrransferLastUses passes. 304ef89c5594aaa5b97f303ba0de99940b79f2c0e0eDevang Patel std::vector<Pass *> TransferLastUses; 305e16634065021e36ae31f074f623a636924d6b8d1Devang Patel 306e16634065021e36ae31f074f623a636924d6b8d1Devang Patel // Top level manager. 307e16634065021e36ae31f074f623a636924d6b8d1Devang Patel PMTopLevelManager *TPM; 308e16634065021e36ae31f074f623a636924d6b8d1Devang Patel 3091554c8545651350569f08dc7370189da1a7e5814Devang Patel // Collection of pass that are managed by this manager 3101554c8545651350569f08dc7370189da1a7e5814Devang Patel std::vector<Pass *> PassVector; 3111554c8545651350569f08dc7370189da1a7e5814Devang Patel 31285d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patelprivate: 3135770c7cd52d6a3dfd9a5815cc9153d94afc6dd31Devang Patel // Set of available Analysis. This information is used while scheduling 3145770c7cd52d6a3dfd9a5815cc9153d94afc6dd31Devang Patel // pass. If a pass requires an analysis which is not not available then 3155770c7cd52d6a3dfd9a5815cc9153d94afc6dd31Devang Patel // equired analysis pass is scheduled to run before the pass itself is 3165770c7cd52d6a3dfd9a5815cc9153d94afc6dd31Devang Patel // scheduled to run. 317b899eed1bc0a64f96fa7aff8d7c6f999cf85bdfeDevang Patel std::map<AnalysisID, Pass*> AvailableAnalysis; 318e253385b108cd946b1ac150302f246d3b218be77Devang Patel 319f72d29c540bf32b9c0e8914484cbbdeac70ee12aDevang Patel unsigned Depth; 32085d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel}; 32185d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel 3227e601a70fcaf0a3090368425bbb339aab038d3e3Devang Patel//===----------------------------------------------------------------------===// 3235f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel// BBPassManager 3247e601a70fcaf0a3090368425bbb339aab038d3e3Devang Patel// 3255f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel/// BBPassManager manages BasicBlockPass. It batches all the 326c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel/// pass together and sequence them to process one basic block before 327c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel/// processing next basic block. 3285f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patelclass VISIBILITY_HIDDEN BBPassManager : public PMDataManager, 3295f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel public FunctionPass { 330c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel 331c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patelpublic: 3325f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel BBPassManager(int Depth) : PMDataManager(Depth) { } 333c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel 334c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel /// Add a pass into a passmanager queue. 335c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel bool addPass(Pass *p); 336c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel 337c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel /// Execute all of the passes scheduled for execution. Keep track of 338c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel /// whether any of the passes modifies the function, and if so, return true. 339c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel bool runOnFunction(Function &F); 340c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel 34166d72e140bf7bdfe03383bfb4d3fe53a420d147bDevang Patel /// Pass Manager itself does not invalidate any analysis info. 34266d72e140bf7bdfe03383bfb4d3fe53a420d147bDevang Patel void getAnalysisUsage(AnalysisUsage &Info) const { 34366d72e140bf7bdfe03383bfb4d3fe53a420d147bDevang Patel Info.setPreservesAll(); 34466d72e140bf7bdfe03383bfb4d3fe53a420d147bDevang Patel } 34566d72e140bf7bdfe03383bfb4d3fe53a420d147bDevang Patel 346964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel bool doInitialization(Module &M); 347964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel bool doInitialization(Function &F); 348964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel bool doFinalization(Module &M); 349964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel bool doFinalization(Function &F); 350964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel 351ebc0922eeb5b728d33a68d4bea8128413f62e369Devang Patel // Print passes managed by this manager 352ebc0922eeb5b728d33a68d4bea8128413f62e369Devang Patel void dumpPassStructure(unsigned Offset) { 353c2ff962bf97761a54c94d2dadb555060403d49c6Devang Patel llvm::cerr << std::string(Offset*2, ' ') << "BasicBlockPass Manager\n"; 3541554c8545651350569f08dc7370189da1a7e5814Devang Patel for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) { 3551554c8545651350569f08dc7370189da1a7e5814Devang Patel BasicBlockPass *BP = getContainedPass(Index); 3561554c8545651350569f08dc7370189da1a7e5814Devang Patel BP->dumpPassStructure(Offset + 1); 3571554c8545651350569f08dc7370189da1a7e5814Devang Patel dumpLastUses(BP, Offset+1); 358ebc0922eeb5b728d33a68d4bea8128413f62e369Devang Patel } 359ebc0922eeb5b728d33a68d4bea8128413f62e369Devang Patel } 3601554c8545651350569f08dc7370189da1a7e5814Devang Patel 3611554c8545651350569f08dc7370189da1a7e5814Devang Patel BasicBlockPass *getContainedPass(unsigned N) { 3621554c8545651350569f08dc7370189da1a7e5814Devang Patel assert ( N < PassVector.size() && "Pass number out of range!"); 3631554c8545651350569f08dc7370189da1a7e5814Devang Patel BasicBlockPass *BP = static_cast<BasicBlockPass *>(PassVector[N]); 3641554c8545651350569f08dc7370189da1a7e5814Devang Patel return BP; 3651554c8545651350569f08dc7370189da1a7e5814Devang Patel } 36625919cb7802f2682b159a040ba07c5bd12b54efaDevang Patel 36725919cb7802f2682b159a040ba07c5bd12b54efaDevang Patel virtual PassManagerType getPassManagerType() { 36825919cb7802f2682b159a040ba07c5bd12b54efaDevang Patel return PMT_BasicBlockPassManager; 36925919cb7802f2682b159a040ba07c5bd12b54efaDevang Patel } 370c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel}; 371c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel 3727e601a70fcaf0a3090368425bbb339aab038d3e3Devang Patel//===----------------------------------------------------------------------===// 3735f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel// FPPassManager 3747e601a70fcaf0a3090368425bbb339aab038d3e3Devang Patel// 3755f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel/// FPPassManager manages BBPassManagers and FunctionPasses. 3765f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel/// It batches all function passes and basic block pass managers together and 3775f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel/// sequence them to process one function at a time before processing next 3785f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel/// function. 379145e83dc12a3f962b999f348474ebb07a36a7b81Devang Patel 3805f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patelclass FPPassManager : public ModulePass, public PMDataManager { 3815f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel 3825f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patelpublic: 3835f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel FPPassManager(int Depth) : PMDataManager(Depth) { 3845f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel activeBBPassManager = NULL; 385877bfbb9ef75e7fe333d93abecaf0579780ccf54Devang Patel } 3865f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel 3875f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel /// Add a pass into a passmanager queue. 3885f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel bool addPass(Pass *p); 3895f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel 3905f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel /// run - Execute all of the passes scheduled for execution. Keep track of 3915f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel /// whether any of the passes modifies the module, and if so, return true. 392214ca23aef8bd408c4ee4ce28ba93d57d2416587Devang Patel bool runOnFunction(Function &F); 3935f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel bool runOnModule(Module &M); 394c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel 3953799f97d539f6c288d169063e1b335917fafcffbDevang Patel /// doInitialization - Run all of the initializers for the function passes. 3963799f97d539f6c288d169063e1b335917fafcffbDevang Patel /// 3973799f97d539f6c288d169063e1b335917fafcffbDevang Patel bool doInitialization(Module &M); 3983799f97d539f6c288d169063e1b335917fafcffbDevang Patel 3993799f97d539f6c288d169063e1b335917fafcffbDevang Patel /// doFinalization - Run all of the initializers for the function passes. 4003799f97d539f6c288d169063e1b335917fafcffbDevang Patel /// 4013799f97d539f6c288d169063e1b335917fafcffbDevang Patel bool doFinalization(Module &M); 40266d72e140bf7bdfe03383bfb4d3fe53a420d147bDevang Patel 40366d72e140bf7bdfe03383bfb4d3fe53a420d147bDevang Patel /// Pass Manager itself does not invalidate any analysis info. 40466d72e140bf7bdfe03383bfb4d3fe53a420d147bDevang Patel void getAnalysisUsage(AnalysisUsage &Info) const { 40566d72e140bf7bdfe03383bfb4d3fe53a420d147bDevang Patel Info.setPreservesAll(); 40666d72e140bf7bdfe03383bfb4d3fe53a420d147bDevang Patel } 40766d72e140bf7bdfe03383bfb4d3fe53a420d147bDevang Patel 408ebc0922eeb5b728d33a68d4bea8128413f62e369Devang Patel // Print passes managed by this manager 409ebc0922eeb5b728d33a68d4bea8128413f62e369Devang Patel void dumpPassStructure(unsigned Offset) { 4105f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel llvm::cerr << std::string(Offset*2, ' ') << "FunctionPass Manager\n"; 4111554c8545651350569f08dc7370189da1a7e5814Devang Patel for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) { 4121554c8545651350569f08dc7370189da1a7e5814Devang Patel FunctionPass *FP = getContainedPass(Index); 4131554c8545651350569f08dc7370189da1a7e5814Devang Patel FP->dumpPassStructure(Offset + 1); 4141554c8545651350569f08dc7370189da1a7e5814Devang Patel dumpLastUses(FP, Offset+1); 415ebc0922eeb5b728d33a68d4bea8128413f62e369Devang Patel } 416ebc0922eeb5b728d33a68d4bea8128413f62e369Devang Patel } 417ebc0922eeb5b728d33a68d4bea8128413f62e369Devang Patel 4181554c8545651350569f08dc7370189da1a7e5814Devang Patel FunctionPass *getContainedPass(unsigned N) { 4191554c8545651350569f08dc7370189da1a7e5814Devang Patel assert ( N < PassVector.size() && "Pass number out of range!"); 4201554c8545651350569f08dc7370189da1a7e5814Devang Patel FunctionPass *FP = static_cast<FunctionPass *>(PassVector[N]); 4211554c8545651350569f08dc7370189da1a7e5814Devang Patel return FP; 4221554c8545651350569f08dc7370189da1a7e5814Devang Patel } 4231554c8545651350569f08dc7370189da1a7e5814Devang Patel 42425919cb7802f2682b159a040ba07c5bd12b54efaDevang Patel virtual PassManagerType getPassManagerType() { 42525919cb7802f2682b159a040ba07c5bd12b54efaDevang Patel return PMT_FunctionPassManager; 42625919cb7802f2682b159a040ba07c5bd12b54efaDevang Patel } 427c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patelprivate: 4285f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel // Active Pass Manager 4295f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel BBPassManager *activeBBPassManager; 4305f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel}; 4315f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel 4325f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel//===----------------------------------------------------------------------===// 4335f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel// FunctionPassManagerImpl 4345f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel// 4355f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel/// FunctionPassManagerImpl manages FPPassManagers 4365f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patelclass FunctionPassManagerImpl : public Pass, 4375f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel public PMDataManager, 4385f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel public PMTopLevelManager { 4395f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel 4405f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patelpublic: 4415f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel 4425f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel FunctionPassManagerImpl(int Depth) : PMDataManager(Depth) { 4435f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel activeManager = NULL; 4445f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel } 4455f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel 4465f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel /// add - Add a pass to the queue of passes to run. This passes ownership of 4475f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel /// the Pass to the PassManager. When the PassManager is destroyed, the pass 4485f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel /// will be destroyed as well, so there is no need to delete the pass. This 4495f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel /// implies that all passes MUST be allocated with 'new'. 4505f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel void add(Pass *P) { 4515f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel schedulePass(P); 4525f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel } 4535f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel 4545f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel /// run - Execute all of the passes scheduled for execution. Keep track of 4555f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel /// whether any of the passes modifies the module, and if so, return true. 4565f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel bool run(Function &F); 4575f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel 4585f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel /// doInitialization - Run all of the initializers for the function passes. 4595f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel /// 4605f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel bool doInitialization(Module &M); 4615f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel 4625f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel /// doFinalization - Run all of the initializers for the function passes. 4635f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel /// 4645f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel bool doFinalization(Module &M); 4655f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel 4665f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel /// Pass Manager itself does not invalidate any analysis info. 4675f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel void getAnalysisUsage(AnalysisUsage &Info) const { 4685f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel Info.setPreservesAll(); 4695f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel } 4705f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel 4715f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel inline void addTopLevelPass(Pass *P) { 4725f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel 4735f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel if (ImmutablePass *IP = dynamic_cast<ImmutablePass *> (P)) { 4745f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel 4755f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel // P is a immutable pass and it will be managed by this 4765f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel // top level manager. Set up analysis resolver to connect them. 477cde53d3c1e9d6a2add5de847b44818fbb1d69c20Devang Patel AnalysisResolver *AR = new AnalysisResolver(*this); 4785f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel P->setResolver(AR); 4795f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel initializeAnalysisImpl(P); 4805f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel addImmutablePass(IP); 4815f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel recordAvailableAnalysis(IP); 4825f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel } 4835f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel else 4845f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel addPass(P); 4855f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel } 4865f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel 4875f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel FPPassManager *getContainedManager(unsigned N) { 4885f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel assert ( N < PassManagers.size() && "Pass number out of range!"); 4895f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel FPPassManager *FP = static_cast<FPPassManager *>(PassManagers[N]); 4905f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel return FP; 4915f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel } 4925f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel 4935f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel /// Add a pass into a passmanager queue. 4945f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel bool addPass(Pass *p); 4955f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel 4965f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patelprivate: 4975f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel 4985f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel // Active Pass Manager 4995f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel FPPassManager *activeManager; 500c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel}; 501c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel 5027e601a70fcaf0a3090368425bbb339aab038d3e3Devang Patel//===----------------------------------------------------------------------===// 5035f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel// MPPassManager 5047e601a70fcaf0a3090368425bbb339aab038d3e3Devang Patel// 5055f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel/// MPPassManager manages ModulePasses and function pass managers. 506c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel/// It batches all Module passes passes and function pass managers together and 507c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel/// sequence them to process one module. 5085f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patelclass MPPassManager : public Pass, public PMDataManager { 509c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel 510c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patelpublic: 5115f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel MPPassManager(int Depth) : PMDataManager(Depth) { 512f72d29c540bf32b9c0e8914484cbbdeac70ee12aDevang Patel activeFunctionPassManager = NULL; 513f72d29c540bf32b9c0e8914484cbbdeac70ee12aDevang Patel } 514c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel 515c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel /// Add a pass into a passmanager queue. 516c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel bool addPass(Pass *p); 517c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel 518c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel /// run - Execute all of the passes scheduled for execution. Keep track of 519c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel /// whether any of the passes modifies the module, and if so, return true. 520c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel bool runOnModule(Module &M); 521be6d515f481756ff549f355e32be1ac398e141d5Devang Patel 52266d72e140bf7bdfe03383bfb4d3fe53a420d147bDevang Patel /// Pass Manager itself does not invalidate any analysis info. 52366d72e140bf7bdfe03383bfb4d3fe53a420d147bDevang Patel void getAnalysisUsage(AnalysisUsage &Info) const { 52466d72e140bf7bdfe03383bfb4d3fe53a420d147bDevang Patel Info.setPreservesAll(); 52566d72e140bf7bdfe03383bfb4d3fe53a420d147bDevang Patel } 52666d72e140bf7bdfe03383bfb4d3fe53a420d147bDevang Patel 527ebc0922eeb5b728d33a68d4bea8128413f62e369Devang Patel // Print passes managed by this manager 528ebc0922eeb5b728d33a68d4bea8128413f62e369Devang Patel void dumpPassStructure(unsigned Offset) { 529ebc0922eeb5b728d33a68d4bea8128413f62e369Devang Patel llvm::cerr << std::string(Offset*2, ' ') << "ModulePass Manager\n"; 5301554c8545651350569f08dc7370189da1a7e5814Devang Patel for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) { 5311554c8545651350569f08dc7370189da1a7e5814Devang Patel ModulePass *MP = getContainedPass(Index); 5321554c8545651350569f08dc7370189da1a7e5814Devang Patel MP->dumpPassStructure(Offset + 1); 5331554c8545651350569f08dc7370189da1a7e5814Devang Patel dumpLastUses(MP, Offset+1); 534ebc0922eeb5b728d33a68d4bea8128413f62e369Devang Patel } 535ebc0922eeb5b728d33a68d4bea8128413f62e369Devang Patel } 536ebc0922eeb5b728d33a68d4bea8128413f62e369Devang Patel 5371554c8545651350569f08dc7370189da1a7e5814Devang Patel ModulePass *getContainedPass(unsigned N) { 5381554c8545651350569f08dc7370189da1a7e5814Devang Patel assert ( N < PassVector.size() && "Pass number out of range!"); 5391554c8545651350569f08dc7370189da1a7e5814Devang Patel ModulePass *MP = static_cast<ModulePass *>(PassVector[N]); 5401554c8545651350569f08dc7370189da1a7e5814Devang Patel return MP; 5411554c8545651350569f08dc7370189da1a7e5814Devang Patel } 5421554c8545651350569f08dc7370189da1a7e5814Devang Patel 54325919cb7802f2682b159a040ba07c5bd12b54efaDevang Patel virtual PassManagerType getPassManagerType() { return PMT_ModulePassManager; } 544c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patelprivate: 545c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel // Active Pass Manager 5465f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel FPPassManager *activeFunctionPassManager; 547c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel}; 548c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel 5497e601a70fcaf0a3090368425bbb339aab038d3e3Devang Patel//===----------------------------------------------------------------------===// 5505f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel// PassManagerImpl 5517e601a70fcaf0a3090368425bbb339aab038d3e3Devang Patel// 5525f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel/// PassManagerImpl manages MPPassManagers 5535f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patelclass PassManagerImpl : public Pass, 554877bfbb9ef75e7fe333d93abecaf0579780ccf54Devang Patel public PMDataManager, 555eb0d613ef6755f93610e08534a203c41ec14b56aDevang Patel public PMTopLevelManager { 5565a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel 5575a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patelpublic: 5585a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel 5595f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel PassManagerImpl(int Depth) : PMDataManager(Depth) { 560395ed739849a0507a2faae0829287c039c3589f8Devang Patel activeManager = NULL; 561395ed739849a0507a2faae0829287c039c3589f8Devang Patel } 562f72d29c540bf32b9c0e8914484cbbdeac70ee12aDevang Patel 5635a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel /// add - Add a pass to the queue of passes to run. This passes ownership of 5645a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel /// the Pass to the PassManager. When the PassManager is destroyed, the pass 5655a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel /// will be destroyed as well, so there is no need to delete the pass. This 5665a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel /// implies that all passes MUST be allocated with 'new'. 567877bfbb9ef75e7fe333d93abecaf0579780ccf54Devang Patel void add(Pass *P) { 568e61b7478e53cea3183d4aee3799a4f0977b850a0Devang Patel schedulePass(P); 569877bfbb9ef75e7fe333d93abecaf0579780ccf54Devang Patel } 5705a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel 5715a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel /// run - Execute all of the passes scheduled for execution. Keep track of 5725a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel /// whether any of the passes modifies the module, and if so, return true. 5735a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel bool run(Module &M); 5745a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel 57566d72e140bf7bdfe03383bfb4d3fe53a420d147bDevang Patel /// Pass Manager itself does not invalidate any analysis info. 57666d72e140bf7bdfe03383bfb4d3fe53a420d147bDevang Patel void getAnalysisUsage(AnalysisUsage &Info) const { 57766d72e140bf7bdfe03383bfb4d3fe53a420d147bDevang Patel Info.setPreservesAll(); 57866d72e140bf7bdfe03383bfb4d3fe53a420d147bDevang Patel } 57966d72e140bf7bdfe03383bfb4d3fe53a420d147bDevang Patel 580eb0d613ef6755f93610e08534a203c41ec14b56aDevang Patel inline void addTopLevelPass(Pass *P) { 581145e83dc12a3f962b999f348474ebb07a36a7b81Devang Patel 582c9a6293af7b433146d8f7ecf8fa494b530af9376Devang Patel if (ImmutablePass *IP = dynamic_cast<ImmutablePass *> (P)) { 583145e83dc12a3f962b999f348474ebb07a36a7b81Devang Patel 584145e83dc12a3f962b999f348474ebb07a36a7b81Devang Patel // P is a immutable pass and it will be managed by this 585145e83dc12a3f962b999f348474ebb07a36a7b81Devang Patel // top level manager. Set up analysis resolver to connect them. 586cde53d3c1e9d6a2add5de847b44818fbb1d69c20Devang Patel AnalysisResolver *AR = new AnalysisResolver(*this); 587145e83dc12a3f962b999f348474ebb07a36a7b81Devang Patel P->setResolver(AR); 588689c683bccbb28b4d18a3dbe1b1c28ee6b90b17aDevang Patel initializeAnalysisImpl(P); 589c9a6293af7b433146d8f7ecf8fa494b530af9376Devang Patel addImmutablePass(IP); 590689c683bccbb28b4d18a3dbe1b1c28ee6b90b17aDevang Patel recordAvailableAnalysis(IP); 591145e83dc12a3f962b999f348474ebb07a36a7b81Devang Patel } 592c9a6293af7b433146d8f7ecf8fa494b530af9376Devang Patel else 593c9a6293af7b433146d8f7ecf8fa494b530af9376Devang Patel addPass(P); 594eb0d613ef6755f93610e08534a203c41ec14b56aDevang Patel } 595eb0d613ef6755f93610e08534a203c41ec14b56aDevang Patel 5965f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel MPPassManager *getContainedManager(unsigned N) { 5975f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel assert ( N < PassManagers.size() && "Pass number out of range!"); 5985f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel MPPassManager *MP = static_cast<MPPassManager *>(PassManagers[N]); 5995f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel return MP; 6005f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel } 6015f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel 6025a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patelprivate: 6035a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel 6041209f416cf2f2ec0f335d91a7c115e3b0a37d603Devang Patel /// Add a pass into a passmanager queue. 6055a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel bool addPass(Pass *p); 6065a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel 6075a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel // Active Pass Manager 6085f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel MPPassManager *activeManager; 6095a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel}; 6105a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel 611c2ff962bf97761a54c94d2dadb555060403d49c6Devang Patel} // End of llvm namespace 612c2ff962bf97761a54c94d2dadb555060403d49c6Devang Patel 613c2ff962bf97761a54c94d2dadb555060403d49c6Devang Patelnamespace { 614c2ff962bf97761a54c94d2dadb555060403d49c6Devang Patel 6158e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel//===----------------------------------------------------------------------===// 6168e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel// TimingInfo Class - This class is used to calculate information about the 6178e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel// amount of time each pass takes to execute. This only happens when 6188e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel// -time-passes is enabled on the command line. 6198e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel// 6208e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel 621c2ff962bf97761a54c94d2dadb555060403d49c6Devang Patelclass VISIBILITY_HIDDEN TimingInfo { 6228e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel std::map<Pass*, Timer> TimingData; 6238e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel TimerGroup TG; 6248e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel 6258e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patelpublic: 6268e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel // Use 'create' member to get this. 6278e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel TimingInfo() : TG("... Pass execution timing report ...") {} 6288e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel 6298e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel // TimingDtor - Print out information about timing information 6308e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel ~TimingInfo() { 6318e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel // Delete all of the timers... 6328e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel TimingData.clear(); 6338e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel // TimerGroup is deleted next, printing the report. 6348e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel } 6358e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel 6368e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel // createTheTimeInfo - This method either initializes the TheTimeInfo pointer 6378e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel // to a non null value (if the -time-passes option is enabled) or it leaves it 6388e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel // null. It may be called multiple times. 6398e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel static void createTheTimeInfo(); 6408e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel 6418e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel void passStarted(Pass *P) { 6428e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel 6438e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel if (dynamic_cast<PMDataManager *>(P)) 6448e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel return; 6458e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel 6468e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel std::map<Pass*, Timer>::iterator I = TimingData.find(P); 6478e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel if (I == TimingData.end()) 6488e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel I=TimingData.insert(std::make_pair(P, Timer(P->getPassName(), TG))).first; 6498e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel I->second.startTimer(); 6508e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel } 6518e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel void passEnded(Pass *P) { 6528e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel 6538e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel if (dynamic_cast<PMDataManager *>(P)) 6548e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel return; 6558e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel 6568e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel std::map<Pass*, Timer>::iterator I = TimingData.find(P); 6578e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel assert (I != TimingData.end() && "passStarted/passEnded not nested right!"); 6588e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel I->second.stopTimer(); 6598e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel } 6608e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel}; 6618e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel 6628e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patelstatic TimingInfo *TheTimeInfo; 6638e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel 664c2ff962bf97761a54c94d2dadb555060403d49c6Devang Patel} // End of anon namespace 665c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel 66606e86561a5261a59f5c391d5cc5cb4aa38dca83cDevang Patel//===----------------------------------------------------------------------===// 6671b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel// PMTopLevelManager implementation 6681b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel 6691b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel/// Set pass P as the last user of the given analysis passes. 6701b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patelvoid PMTopLevelManager::setLastUser(std::vector<Pass *> &AnalysisPasses, 6711b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel Pass *P) { 6721b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel 6731b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel for (std::vector<Pass *>::iterator I = AnalysisPasses.begin(), 6741b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel E = AnalysisPasses.end(); I != E; ++I) { 6751b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel Pass *AP = *I; 6761b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel LastUser[AP] = P; 6771b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel // If AP is the last user of other passes then make P last user of 6781b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel // such passes. 6791b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel for (std::map<Pass *, Pass *>::iterator LUI = LastUser.begin(), 6801b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel LUE = LastUser.end(); LUI != LUE; ++LUI) { 6811b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel if (LUI->second == AP) 6821b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel LastUser[LUI->first] = P; 6831b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel } 6841b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel } 6851b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel} 6861b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel 6871b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel/// Collect passes whose last user is P 6881b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patelvoid PMTopLevelManager::collectLastUses(std::vector<Pass *> &LastUses, 6891b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel Pass *P) { 6901b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel for (std::map<Pass *, Pass *>::iterator LUI = LastUser.begin(), 6911b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel LUE = LastUser.end(); LUI != LUE; ++LUI) 6921b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel if (LUI->second == P) 6931b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel LastUses.push_back(LUI->first); 6941b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel} 6951b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel 6961b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel/// Schedule pass P for execution. Make sure that passes required by 6971b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel/// P are run before P is run. Update analysis info maintained by 6981b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel/// the manager. Remove dead passes. This is a recursive function. 6991b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patelvoid PMTopLevelManager::schedulePass(Pass *P) { 7001b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel 7011b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel // TODO : Allocate function manager for this pass, other wise required set 7021b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel // may be inserted into previous function manager 7031b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel 7041b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel AnalysisUsage AnUsage; 7051b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel P->getAnalysisUsage(AnUsage); 7061b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel const std::vector<AnalysisID> &RequiredSet = AnUsage.getRequiredSet(); 7071b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel for (std::vector<AnalysisID>::const_iterator I = RequiredSet.begin(), 7081b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel E = RequiredSet.end(); I != E; ++I) { 7091b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel 7101b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel Pass *AnalysisPass = findAnalysisPass(*I); 7111b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel if (!AnalysisPass) { 7121b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel // Schedule this analysis run first. 7131b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel AnalysisPass = (*I)->createPass(); 7141b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel schedulePass(AnalysisPass); 7151b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel } 7161b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel } 7171b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel 7181b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel // Now all required passes are available. 7191b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel addTopLevelPass(P); 7201b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel} 7211b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel 7221b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel/// Find the pass that implements Analysis AID. Search immutable 7231b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel/// passes and all pass managers. If desired pass is not found 7241b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel/// then return NULL. 7251b8d015066dca364a1b11b6dbe5b80248b111cd5Devang PatelPass *PMTopLevelManager::findAnalysisPass(AnalysisID AID) { 7261b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel 7271b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel Pass *P = NULL; 728d0fa16c33615bb6f21685c4e4e3d948ac6780160Devang Patel // Check pass managers 729d0fa16c33615bb6f21685c4e4e3d948ac6780160Devang Patel for (std::vector<Pass *>::iterator I = PassManagers.begin(), 730d0fa16c33615bb6f21685c4e4e3d948ac6780160Devang Patel E = PassManagers.end(); P == NULL && I != E; ++I) { 731d0fa16c33615bb6f21685c4e4e3d948ac6780160Devang Patel PMDataManager *PMD = dynamic_cast<PMDataManager *>(*I); 732d0fa16c33615bb6f21685c4e4e3d948ac6780160Devang Patel assert(PMD && "This is not a PassManager"); 733d0fa16c33615bb6f21685c4e4e3d948ac6780160Devang Patel P = PMD->findAnalysisPass(AID, false); 734d0fa16c33615bb6f21685c4e4e3d948ac6780160Devang Patel } 735d0fa16c33615bb6f21685c4e4e3d948ac6780160Devang Patel 736d0fa16c33615bb6f21685c4e4e3d948ac6780160Devang Patel // Check other pass managers 737d0fa16c33615bb6f21685c4e4e3d948ac6780160Devang Patel for (std::vector<PMDataManager *>::iterator I = IndirectPassManagers.begin(), 738d0fa16c33615bb6f21685c4e4e3d948ac6780160Devang Patel E = IndirectPassManagers.end(); P == NULL && I != E; ++I) 739d0fa16c33615bb6f21685c4e4e3d948ac6780160Devang Patel P = (*I)->findAnalysisPass(AID, false); 740d0fa16c33615bb6f21685c4e4e3d948ac6780160Devang Patel 7411b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel for (std::vector<ImmutablePass *>::iterator I = ImmutablePasses.begin(), 7421b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel E = ImmutablePasses.end(); P == NULL && I != E; ++I) { 7431b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel const PassInfo *PI = (*I)->getPassInfo(); 7441b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel if (PI == AID) 7451b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel P = *I; 7461b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel 7471b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel // If Pass not found then check the interfaces implemented by Immutable Pass 7481b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel if (!P) { 7491a8038636c2998e37f2130b0ab89a3686d9c1f48Devang Patel const std::vector<const PassInfo*> &ImmPI = PI->getInterfacesImplemented(); 7501a8038636c2998e37f2130b0ab89a3686d9c1f48Devang Patel if (std::find(ImmPI.begin(), ImmPI.end(), AID) != ImmPI.end()) 7511a8038636c2998e37f2130b0ab89a3686d9c1f48Devang Patel P = *I; 7521b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel } 7531b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel } 7541b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel 7551b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel return P; 7561b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel} 7571b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel 758ebc0922eeb5b728d33a68d4bea8128413f62e369Devang Patel// Print passes managed by this top level manager. 759a52035a062edf9bfbf95c92c615219b647042c17Devang Patelvoid PMTopLevelManager::dumpPasses() const { 760ebc0922eeb5b728d33a68d4bea8128413f62e369Devang Patel 7615f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel if (PassDebugging_New < Structure) 7625f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel return; 7635f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel 764ebc0922eeb5b728d33a68d4bea8128413f62e369Devang Patel // Print out the immutable passes 765ebc0922eeb5b728d33a68d4bea8128413f62e369Devang Patel for (unsigned i = 0, e = ImmutablePasses.size(); i != e; ++i) { 766ebc0922eeb5b728d33a68d4bea8128413f62e369Devang Patel ImmutablePasses[i]->dumpPassStructure(0); 767ebc0922eeb5b728d33a68d4bea8128413f62e369Devang Patel } 768ebc0922eeb5b728d33a68d4bea8128413f62e369Devang Patel 769a52035a062edf9bfbf95c92c615219b647042c17Devang Patel for (std::vector<Pass *>::const_iterator I = PassManagers.begin(), 770ebc0922eeb5b728d33a68d4bea8128413f62e369Devang Patel E = PassManagers.end(); I != E; ++I) 771ebc0922eeb5b728d33a68d4bea8128413f62e369Devang Patel (*I)->dumpPassStructure(1); 772ebc0922eeb5b728d33a68d4bea8128413f62e369Devang Patel} 773ebc0922eeb5b728d33a68d4bea8128413f62e369Devang Patel 774a52035a062edf9bfbf95c92c615219b647042c17Devang Patelvoid PMTopLevelManager::dumpArguments() const { 775c32cf54101ecaf336d161fecd58667870149169cDevang Patel 776c32cf54101ecaf336d161fecd58667870149169cDevang Patel if (PassDebugging_New < Arguments) 777c32cf54101ecaf336d161fecd58667870149169cDevang Patel return; 778c32cf54101ecaf336d161fecd58667870149169cDevang Patel 779c32cf54101ecaf336d161fecd58667870149169cDevang Patel cerr << "Pass Arguments: "; 780a52035a062edf9bfbf95c92c615219b647042c17Devang Patel for (std::vector<Pass *>::const_iterator I = PassManagers.begin(), 781c32cf54101ecaf336d161fecd58667870149169cDevang Patel E = PassManagers.end(); I != E; ++I) { 782c32cf54101ecaf336d161fecd58667870149169cDevang Patel PMDataManager *PMD = dynamic_cast<PMDataManager *>(*I); 783c32cf54101ecaf336d161fecd58667870149169cDevang Patel assert(PMD && "This is not a PassManager"); 784c32cf54101ecaf336d161fecd58667870149169cDevang Patel PMD->dumpPassArguments(); 785c32cf54101ecaf336d161fecd58667870149169cDevang Patel } 786c32cf54101ecaf336d161fecd58667870149169cDevang Patel cerr << "\n"; 787c32cf54101ecaf336d161fecd58667870149169cDevang Patel} 788c32cf54101ecaf336d161fecd58667870149169cDevang Patel 7891336a6bf06e64a096217628d2cc9644e48a5d7d6Devang Patelvoid PMTopLevelManager::initializeAllAnalysisInfo() { 7901336a6bf06e64a096217628d2cc9644e48a5d7d6Devang Patel 7911336a6bf06e64a096217628d2cc9644e48a5d7d6Devang Patel for (std::vector<Pass *>::iterator I = PassManagers.begin(), 7921336a6bf06e64a096217628d2cc9644e48a5d7d6Devang Patel E = PassManagers.end(); I != E; ++I) { 7931336a6bf06e64a096217628d2cc9644e48a5d7d6Devang Patel PMDataManager *PMD = dynamic_cast<PMDataManager *>(*I); 7941336a6bf06e64a096217628d2cc9644e48a5d7d6Devang Patel assert(PMD && "This is not a PassManager"); 7951336a6bf06e64a096217628d2cc9644e48a5d7d6Devang Patel PMD->initializeAnalysisInfo(); 7961336a6bf06e64a096217628d2cc9644e48a5d7d6Devang Patel } 7971336a6bf06e64a096217628d2cc9644e48a5d7d6Devang Patel 7981336a6bf06e64a096217628d2cc9644e48a5d7d6Devang Patel // Initailize other pass managers 7991336a6bf06e64a096217628d2cc9644e48a5d7d6Devang Patel for (std::vector<PMDataManager *>::iterator I = IndirectPassManagers.begin(), 8001336a6bf06e64a096217628d2cc9644e48a5d7d6Devang Patel E = IndirectPassManagers.end(); I != E; ++I) 8011336a6bf06e64a096217628d2cc9644e48a5d7d6Devang Patel (*I)->initializeAnalysisInfo(); 8021336a6bf06e64a096217628d2cc9644e48a5d7d6Devang Patel} 8031336a6bf06e64a096217628d2cc9644e48a5d7d6Devang Patel 8041b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel//===----------------------------------------------------------------------===// 805419f0e95d698109541ad730cb45ba4caca78f458Devang Patel// PMDataManager implementation 806889739c4d188d28c167644bced9df0f3131317d7Devang Patel 8072c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel/// Return true IFF pass P's required analysis set does not required new 808889739c4d188d28c167644bced9df0f3131317d7Devang Patel/// manager. 809419f0e95d698109541ad730cb45ba4caca78f458Devang Patelbool PMDataManager::manageablePass(Pass *P) { 810889739c4d188d28c167644bced9df0f3131317d7Devang Patel 8114045af1175509c81d6a4708df233f0b1abe888fcDevang Patel // TODO 8124045af1175509c81d6a4708df233f0b1abe888fcDevang Patel // If this pass is not preserving information that is required by a 8134045af1175509c81d6a4708df233f0b1abe888fcDevang Patel // pass maintained by higher level pass manager then do not insert 8144045af1175509c81d6a4708df233f0b1abe888fcDevang Patel // this pass into current manager. Use new manager. For example, 8154045af1175509c81d6a4708df233f0b1abe888fcDevang Patel // For example, If FunctionPass F is not preserving ModulePass Info M1 8164045af1175509c81d6a4708df233f0b1abe888fcDevang Patel // that is used by another ModulePass M2 then do not insert F in 8174045af1175509c81d6a4708df233f0b1abe888fcDevang Patel // current function pass manager. 818889739c4d188d28c167644bced9df0f3131317d7Devang Patel return true; 819889739c4d188d28c167644bced9df0f3131317d7Devang Patel} 820889739c4d188d28c167644bced9df0f3131317d7Devang Patel 821b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel/// Augement AvailableAnalysis by adding analysis made available by pass P. 822f32b4dd13e421b3ad4696f984cb2043ce64e19cbDevang Patelvoid PMDataManager::recordAvailableAnalysis(Pass *P) { 823b899eed1bc0a64f96fa7aff8d7c6f999cf85bdfeDevang Patel 824b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel if (const PassInfo *PI = P->getPassInfo()) { 825b899eed1bc0a64f96fa7aff8d7c6f999cf85bdfeDevang Patel AvailableAnalysis[PI] = P; 826b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel 827f32b4dd13e421b3ad4696f984cb2043ce64e19cbDevang Patel //This pass is the current implementation of all of the interfaces it 828f32b4dd13e421b3ad4696f984cb2043ce64e19cbDevang Patel //implements as well. 829f32b4dd13e421b3ad4696f984cb2043ce64e19cbDevang Patel const std::vector<const PassInfo*> &II = PI->getInterfacesImplemented(); 830f32b4dd13e421b3ad4696f984cb2043ce64e19cbDevang Patel for (unsigned i = 0, e = II.size(); i != e; ++i) 831f32b4dd13e421b3ad4696f984cb2043ce64e19cbDevang Patel AvailableAnalysis[II[i]] = P; 832b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel } 833b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel} 834b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel 835889739c4d188d28c167644bced9df0f3131317d7Devang Patel/// Remove Analyss not preserved by Pass P 836419f0e95d698109541ad730cb45ba4caca78f458Devang Patelvoid PMDataManager::removeNotPreservedAnalysis(Pass *P) { 83714d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel AnalysisUsage AnUsage; 83814d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel P->getAnalysisUsage(AnUsage); 83914d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel 84004b4e0595ffffab232a73a78d742e08efb6ebcfbDevang Patel if (AnUsage.getPreservesAll()) 84104b4e0595ffffab232a73a78d742e08efb6ebcfbDevang Patel return; 84204b4e0595ffffab232a73a78d742e08efb6ebcfbDevang Patel 84304b4e0595ffffab232a73a78d742e08efb6ebcfbDevang Patel const std::vector<AnalysisID> &PreservedSet = AnUsage.getPreservedSet(); 844b899eed1bc0a64f96fa7aff8d7c6f999cf85bdfeDevang Patel for (std::map<AnalysisID, Pass*>::iterator I = AvailableAnalysis.begin(), 84554e247d2d0c07544b3e638e80b816f352ec152c1Devang Patel E = AvailableAnalysis.end(); I != E; ) { 8461a8038636c2998e37f2130b0ab89a3686d9c1f48Devang Patel std::map<AnalysisID, Pass*>::iterator Info = I++; 8471a8038636c2998e37f2130b0ab89a3686d9c1f48Devang Patel if (std::find(PreservedSet.begin(), PreservedSet.end(), Info->first) == 84814d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel PreservedSet.end()) { 84914d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel // Remove this analysis 8501a8038636c2998e37f2130b0ab89a3686d9c1f48Devang Patel if (!dynamic_cast<ImmutablePass*>(Info->second)) 8511a8038636c2998e37f2130b0ab89a3686d9c1f48Devang Patel AvailableAnalysis.erase(Info); 8521a8038636c2998e37f2130b0ab89a3686d9c1f48Devang Patel } 85314d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel } 854889739c4d188d28c167644bced9df0f3131317d7Devang Patel} 855889739c4d188d28c167644bced9df0f3131317d7Devang Patel 856df1a10ece6a75f230d98c6fb001349eede90387aDevang Patel/// Remove analysis passes that are not used any longer 8574eeea774ce1b24fa55c06aac31e02016d5dd77d6Devang Patelvoid PMDataManager::removeDeadPasses(Pass *P, std::string &Msg) { 858f9a60ae75d6fdc74160085323c14e92e7d3517d3Devang Patel 859f9a60ae75d6fdc74160085323c14e92e7d3517d3Devang Patel std::vector<Pass *> DeadPasses; 860f9a60ae75d6fdc74160085323c14e92e7d3517d3Devang Patel TPM->collectLastUses(DeadPasses, P); 861f9a60ae75d6fdc74160085323c14e92e7d3517d3Devang Patel 862f9a60ae75d6fdc74160085323c14e92e7d3517d3Devang Patel for (std::vector<Pass *>::iterator I = DeadPasses.begin(), 863f9a60ae75d6fdc74160085323c14e92e7d3517d3Devang Patel E = DeadPasses.end(); I != E; ++I) { 8644eeea774ce1b24fa55c06aac31e02016d5dd77d6Devang Patel 8654eeea774ce1b24fa55c06aac31e02016d5dd77d6Devang Patel std::string Msg1 = " Freeing Pass '"; 8664eeea774ce1b24fa55c06aac31e02016d5dd77d6Devang Patel dumpPassInfo(*I, Msg1, Msg); 8674eeea774ce1b24fa55c06aac31e02016d5dd77d6Devang Patel 8688e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel if (TheTimeInfo) TheTimeInfo->passStarted(P); 869f9a60ae75d6fdc74160085323c14e92e7d3517d3Devang Patel (*I)->releaseMemory(); 8708e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel if (TheTimeInfo) TheTimeInfo->passEnded(P); 8718e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel 872f9a60ae75d6fdc74160085323c14e92e7d3517d3Devang Patel std::map<AnalysisID, Pass*>::iterator Pos = 873f9a60ae75d6fdc74160085323c14e92e7d3517d3Devang Patel AvailableAnalysis.find((*I)->getPassInfo()); 874f9a60ae75d6fdc74160085323c14e92e7d3517d3Devang Patel 875964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel // It is possible that pass is already removed from the AvailableAnalysis 876f9a60ae75d6fdc74160085323c14e92e7d3517d3Devang Patel if (Pos != AvailableAnalysis.end()) 877f9a60ae75d6fdc74160085323c14e92e7d3517d3Devang Patel AvailableAnalysis.erase(Pos); 878f9a60ae75d6fdc74160085323c14e92e7d3517d3Devang Patel } 879df1a10ece6a75f230d98c6fb001349eede90387aDevang Patel} 880df1a10ece6a75f230d98c6fb001349eede90387aDevang Patel 8814045af1175509c81d6a4708df233f0b1abe888fcDevang Patel/// Add pass P into the PassVector. Update 882893a5a681585cdf3b5bfff7128ea522e8a47750aDevang Patel/// AvailableAnalysis appropriately if ProcessAnalysis is true. 88304b4e0595ffffab232a73a78d742e08efb6ebcfbDevang Patelvoid PMDataManager::addPassToManager(Pass *P, 88404b4e0595ffffab232a73a78d742e08efb6ebcfbDevang Patel bool ProcessAnalysis) { 885e253385b108cd946b1ac150302f246d3b218be77Devang Patel 886145e83dc12a3f962b999f348474ebb07a36a7b81Devang Patel // This manager is going to manage pass P. Set up analysis resolver 887145e83dc12a3f962b999f348474ebb07a36a7b81Devang Patel // to connect them. 888cde53d3c1e9d6a2add5de847b44818fbb1d69c20Devang Patel AnalysisResolver *AR = new AnalysisResolver(*this); 889145e83dc12a3f962b999f348474ebb07a36a7b81Devang Patel P->setResolver(AR); 890145e83dc12a3f962b999f348474ebb07a36a7b81Devang Patel 891893a5a681585cdf3b5bfff7128ea522e8a47750aDevang Patel if (ProcessAnalysis) { 892e16634065021e36ae31f074f623a636924d6b8d1Devang Patel 893e16634065021e36ae31f074f623a636924d6b8d1Devang Patel // At the moment, this pass is the last user of all required passes. 894e16634065021e36ae31f074f623a636924d6b8d1Devang Patel std::vector<Pass *> LastUses; 895e16634065021e36ae31f074f623a636924d6b8d1Devang Patel std::vector<Pass *> RequiredPasses; 896e16634065021e36ae31f074f623a636924d6b8d1Devang Patel unsigned PDepth = this->getDepth(); 897e16634065021e36ae31f074f623a636924d6b8d1Devang Patel 898e16634065021e36ae31f074f623a636924d6b8d1Devang Patel collectRequiredAnalysisPasses(RequiredPasses, P); 899e16634065021e36ae31f074f623a636924d6b8d1Devang Patel for (std::vector<Pass *>::iterator I = RequiredPasses.begin(), 900e16634065021e36ae31f074f623a636924d6b8d1Devang Patel E = RequiredPasses.end(); I != E; ++I) { 901e16634065021e36ae31f074f623a636924d6b8d1Devang Patel Pass *PRequired = *I; 902e16634065021e36ae31f074f623a636924d6b8d1Devang Patel unsigned RDepth = 0; 903cd520b187a222bf99d4238590e6517e87666e39fDevang Patel 904cd520b187a222bf99d4238590e6517e87666e39fDevang Patel PMDataManager &DM = PRequired->getResolver()->getPMDataManager(); 905cd520b187a222bf99d4238590e6517e87666e39fDevang Patel RDepth = DM.getDepth(); 906cd520b187a222bf99d4238590e6517e87666e39fDevang Patel 907e16634065021e36ae31f074f623a636924d6b8d1Devang Patel if (PDepth == RDepth) 908e16634065021e36ae31f074f623a636924d6b8d1Devang Patel LastUses.push_back(PRequired); 909e16634065021e36ae31f074f623a636924d6b8d1Devang Patel else if (PDepth > RDepth) { 910e16634065021e36ae31f074f623a636924d6b8d1Devang Patel // Let the parent claim responsibility of last use 911ef89c5594aaa5b97f303ba0de99940b79f2c0e0eDevang Patel TransferLastUses.push_back(PRequired); 912e16634065021e36ae31f074f623a636924d6b8d1Devang Patel } else { 913e16634065021e36ae31f074f623a636924d6b8d1Devang Patel // Note : This feature is not yet implemented 914e16634065021e36ae31f074f623a636924d6b8d1Devang Patel assert (0 && 915e16634065021e36ae31f074f623a636924d6b8d1Devang Patel "Unable to handle Pass that requires lower level Analysis pass"); 916e16634065021e36ae31f074f623a636924d6b8d1Devang Patel } 917e16634065021e36ae31f074f623a636924d6b8d1Devang Patel } 918e16634065021e36ae31f074f623a636924d6b8d1Devang Patel 919ef89c5594aaa5b97f303ba0de99940b79f2c0e0eDevang Patel LastUses.push_back(P); 920ef89c5594aaa5b97f303ba0de99940b79f2c0e0eDevang Patel TPM->setLastUser(LastUses, P); 921e16634065021e36ae31f074f623a636924d6b8d1Devang Patel 9220ac961d9c1c511204abfb02f5c25c92da6b75eb6Devang Patel // Take a note of analysis required and made available by this pass. 923893a5a681585cdf3b5bfff7128ea522e8a47750aDevang Patel // Remove the analysis not preserved by this pass 924893a5a681585cdf3b5bfff7128ea522e8a47750aDevang Patel removeNotPreservedAnalysis(P); 9250ac961d9c1c511204abfb02f5c25c92da6b75eb6Devang Patel recordAvailableAnalysis(P); 926893a5a681585cdf3b5bfff7128ea522e8a47750aDevang Patel } 927e253385b108cd946b1ac150302f246d3b218be77Devang Patel 928e253385b108cd946b1ac150302f246d3b218be77Devang Patel // Add pass 929e253385b108cd946b1ac150302f246d3b218be77Devang Patel PassVector.push_back(P); 930e253385b108cd946b1ac150302f246d3b218be77Devang Patel} 931e253385b108cd946b1ac150302f246d3b218be77Devang Patel 932c17bbb6da7e17c06c1f0ae7baa2f151db0e966d9Devang Patel/// Populate RequiredPasses with the analysis pass that are required by 933c17bbb6da7e17c06c1f0ae7baa2f151db0e966d9Devang Patel/// pass P. 934c17bbb6da7e17c06c1f0ae7baa2f151db0e966d9Devang Patelvoid PMDataManager::collectRequiredAnalysisPasses(std::vector<Pass *> &RP, 935c17bbb6da7e17c06c1f0ae7baa2f151db0e966d9Devang Patel Pass *P) { 936c17bbb6da7e17c06c1f0ae7baa2f151db0e966d9Devang Patel AnalysisUsage AnUsage; 937c17bbb6da7e17c06c1f0ae7baa2f151db0e966d9Devang Patel P->getAnalysisUsage(AnUsage); 938c17bbb6da7e17c06c1f0ae7baa2f151db0e966d9Devang Patel const std::vector<AnalysisID> &RequiredSet = AnUsage.getRequiredSet(); 939c17bbb6da7e17c06c1f0ae7baa2f151db0e966d9Devang Patel for (std::vector<AnalysisID>::const_iterator 940c17bbb6da7e17c06c1f0ae7baa2f151db0e966d9Devang Patel I = RequiredSet.begin(), E = RequiredSet.end(); 941c17bbb6da7e17c06c1f0ae7baa2f151db0e966d9Devang Patel I != E; ++I) { 94269867b511c732a7fac7301977bd6e880e46439f1Devang Patel Pass *AnalysisPass = findAnalysisPass(*I, true); 943c17bbb6da7e17c06c1f0ae7baa2f151db0e966d9Devang Patel assert (AnalysisPass && "Analysis pass is not available"); 944c17bbb6da7e17c06c1f0ae7baa2f151db0e966d9Devang Patel RP.push_back(AnalysisPass); 945c17bbb6da7e17c06c1f0ae7baa2f151db0e966d9Devang Patel } 94627aaab2bd3c220d8466b34f6b959f74e1caac69bDevang Patel 94727aaab2bd3c220d8466b34f6b959f74e1caac69bDevang Patel const std::vector<AnalysisID> &IDs = AnUsage.getRequiredTransitiveSet(); 94827aaab2bd3c220d8466b34f6b959f74e1caac69bDevang Patel for (std::vector<AnalysisID>::const_iterator I = IDs.begin(), 94927aaab2bd3c220d8466b34f6b959f74e1caac69bDevang Patel E = IDs.end(); I != E; ++I) { 95027aaab2bd3c220d8466b34f6b959f74e1caac69bDevang Patel Pass *AnalysisPass = findAnalysisPass(*I, true); 95127aaab2bd3c220d8466b34f6b959f74e1caac69bDevang Patel assert (AnalysisPass && "Analysis pass is not available"); 95227aaab2bd3c220d8466b34f6b959f74e1caac69bDevang Patel RP.push_back(AnalysisPass); 95327aaab2bd3c220d8466b34f6b959f74e1caac69bDevang Patel } 954c17bbb6da7e17c06c1f0ae7baa2f151db0e966d9Devang Patel} 955c17bbb6da7e17c06c1f0ae7baa2f151db0e966d9Devang Patel 9562f42ed6b0b5161296cdd7e573b49fe631599fc97Devang Patel// All Required analyses should be available to the pass as it runs! Here 9572f42ed6b0b5161296cdd7e573b49fe631599fc97Devang Patel// we fill in the AnalysisImpls member of the pass so that it can 9582f42ed6b0b5161296cdd7e573b49fe631599fc97Devang Patel// successfully use the getAnalysis() method to retrieve the 9592f42ed6b0b5161296cdd7e573b49fe631599fc97Devang Patel// implementations it needs. 9602f42ed6b0b5161296cdd7e573b49fe631599fc97Devang Patel// 961419f0e95d698109541ad730cb45ba4caca78f458Devang Patelvoid PMDataManager::initializeAnalysisImpl(Pass *P) { 9623799f97d539f6c288d169063e1b335917fafcffbDevang Patel AnalysisUsage AnUsage; 9633799f97d539f6c288d169063e1b335917fafcffbDevang Patel P->getAnalysisUsage(AnUsage); 9642f42ed6b0b5161296cdd7e573b49fe631599fc97Devang Patel 9652f42ed6b0b5161296cdd7e573b49fe631599fc97Devang Patel for (std::vector<const PassInfo *>::const_iterator 9662f42ed6b0b5161296cdd7e573b49fe631599fc97Devang Patel I = AnUsage.getRequiredSet().begin(), 9672f42ed6b0b5161296cdd7e573b49fe631599fc97Devang Patel E = AnUsage.getRequiredSet().end(); I != E; ++I) { 96869867b511c732a7fac7301977bd6e880e46439f1Devang Patel Pass *Impl = findAnalysisPass(*I, true); 9692f42ed6b0b5161296cdd7e573b49fe631599fc97Devang Patel if (Impl == 0) 9702f42ed6b0b5161296cdd7e573b49fe631599fc97Devang Patel assert(0 && "Analysis used but not available!"); 971cde53d3c1e9d6a2add5de847b44818fbb1d69c20Devang Patel AnalysisResolver *AR = P->getResolver(); 972298feadd7a547d50eb943c9ea15f6345a024bc9aDevang Patel AR->addAnalysisImplsPair(*I, Impl); 9732f42ed6b0b5161296cdd7e573b49fe631599fc97Devang Patel } 9742f42ed6b0b5161296cdd7e573b49fe631599fc97Devang Patel} 9752f42ed6b0b5161296cdd7e573b49fe631599fc97Devang Patel 97669867b511c732a7fac7301977bd6e880e46439f1Devang Patel/// Find the pass that implements Analysis AID. If desired pass is not found 97769867b511c732a7fac7301977bd6e880e46439f1Devang Patel/// then return NULL. 97869867b511c732a7fac7301977bd6e880e46439f1Devang PatelPass *PMDataManager::findAnalysisPass(AnalysisID AID, bool SearchParent) { 97969867b511c732a7fac7301977bd6e880e46439f1Devang Patel 98069867b511c732a7fac7301977bd6e880e46439f1Devang Patel // Check if AvailableAnalysis map has one entry. 98169867b511c732a7fac7301977bd6e880e46439f1Devang Patel std::map<AnalysisID, Pass*>::const_iterator I = AvailableAnalysis.find(AID); 98269867b511c732a7fac7301977bd6e880e46439f1Devang Patel 98369867b511c732a7fac7301977bd6e880e46439f1Devang Patel if (I != AvailableAnalysis.end()) 98469867b511c732a7fac7301977bd6e880e46439f1Devang Patel return I->second; 98569867b511c732a7fac7301977bd6e880e46439f1Devang Patel 98669867b511c732a7fac7301977bd6e880e46439f1Devang Patel // Search Parents through TopLevelManager 98769867b511c732a7fac7301977bd6e880e46439f1Devang Patel if (SearchParent) 98869867b511c732a7fac7301977bd6e880e46439f1Devang Patel return TPM->findAnalysisPass(AID); 98969867b511c732a7fac7301977bd6e880e46439f1Devang Patel 9905b640e7edc606059717fb9c2ebcd85302c97fc21Devang Patel return NULL; 99169867b511c732a7fac7301977bd6e880e46439f1Devang Patel} 99269867b511c732a7fac7301977bd6e880e46439f1Devang Patel 993a52035a062edf9bfbf95c92c615219b647042c17Devang Patel// Print list of passes that are last used by P. 994a52035a062edf9bfbf95c92c615219b647042c17Devang Patelvoid PMDataManager::dumpLastUses(Pass *P, unsigned Offset) const{ 995a52035a062edf9bfbf95c92c615219b647042c17Devang Patel 996a52035a062edf9bfbf95c92c615219b647042c17Devang Patel std::vector<Pass *> LUses; 997a52035a062edf9bfbf95c92c615219b647042c17Devang Patel 998a52035a062edf9bfbf95c92c615219b647042c17Devang Patel assert (TPM && "Top Level Manager is missing"); 999a52035a062edf9bfbf95c92c615219b647042c17Devang Patel TPM->collectLastUses(LUses, P); 1000a52035a062edf9bfbf95c92c615219b647042c17Devang Patel 1001a52035a062edf9bfbf95c92c615219b647042c17Devang Patel for (std::vector<Pass *>::iterator I = LUses.begin(), 1002a52035a062edf9bfbf95c92c615219b647042c17Devang Patel E = LUses.end(); I != E; ++I) { 1003a52035a062edf9bfbf95c92c615219b647042c17Devang Patel llvm::cerr << "--" << std::string(Offset*2, ' '); 1004a52035a062edf9bfbf95c92c615219b647042c17Devang Patel (*I)->dumpPassStructure(0); 1005a52035a062edf9bfbf95c92c615219b647042c17Devang Patel } 1006a52035a062edf9bfbf95c92c615219b647042c17Devang Patel} 1007a52035a062edf9bfbf95c92c615219b647042c17Devang Patel 1008a52035a062edf9bfbf95c92c615219b647042c17Devang Patelvoid PMDataManager::dumpPassArguments() const { 1009a52035a062edf9bfbf95c92c615219b647042c17Devang Patel for(std::vector<Pass *>::const_iterator I = PassVector.begin(), 1010a52035a062edf9bfbf95c92c615219b647042c17Devang Patel E = PassVector.end(); I != E; ++I) { 1011a52035a062edf9bfbf95c92c615219b647042c17Devang Patel if (PMDataManager *PMD = dynamic_cast<PMDataManager *>(*I)) 1012a52035a062edf9bfbf95c92c615219b647042c17Devang Patel PMD->dumpPassArguments(); 1013a52035a062edf9bfbf95c92c615219b647042c17Devang Patel else 1014a52035a062edf9bfbf95c92c615219b647042c17Devang Patel if (const PassInfo *PI = (*I)->getPassInfo()) 1015a52035a062edf9bfbf95c92c615219b647042c17Devang Patel if (!PI->isAnalysisGroup()) 1016a52035a062edf9bfbf95c92c615219b647042c17Devang Patel cerr << " -" << PI->getPassArgument(); 1017a52035a062edf9bfbf95c92c615219b647042c17Devang Patel } 1018a52035a062edf9bfbf95c92c615219b647042c17Devang Patel} 1019a52035a062edf9bfbf95c92c615219b647042c17Devang Patel 1020a52035a062edf9bfbf95c92c615219b647042c17Devang Patelvoid PMDataManager:: dumpPassInfo(Pass *P, std::string &Msg1, 1021a52035a062edf9bfbf95c92c615219b647042c17Devang Patel std::string &Msg2) const { 1022a52035a062edf9bfbf95c92c615219b647042c17Devang Patel if (PassDebugging_New < Executions) 1023a52035a062edf9bfbf95c92c615219b647042c17Devang Patel return; 1024a52035a062edf9bfbf95c92c615219b647042c17Devang Patel cerr << (void*)this << std::string(getDepth()*2+1, ' '); 1025a52035a062edf9bfbf95c92c615219b647042c17Devang Patel cerr << Msg1; 1026a52035a062edf9bfbf95c92c615219b647042c17Devang Patel cerr << P->getPassName(); 1027a52035a062edf9bfbf95c92c615219b647042c17Devang Patel cerr << Msg2; 1028a52035a062edf9bfbf95c92c615219b647042c17Devang Patel} 1029a52035a062edf9bfbf95c92c615219b647042c17Devang Patel 1030a52035a062edf9bfbf95c92c615219b647042c17Devang Patelvoid PMDataManager::dumpAnalysisSetInfo(const char *Msg, Pass *P, 1031a52035a062edf9bfbf95c92c615219b647042c17Devang Patel const std::vector<AnalysisID> &Set) 1032a52035a062edf9bfbf95c92c615219b647042c17Devang Patel const { 1033a52035a062edf9bfbf95c92c615219b647042c17Devang Patel if (PassDebugging_New >= Details && !Set.empty()) { 1034a52035a062edf9bfbf95c92c615219b647042c17Devang Patel cerr << (void*)P << std::string(getDepth()*2+3, ' ') << Msg << " Analyses:"; 1035a52035a062edf9bfbf95c92c615219b647042c17Devang Patel for (unsigned i = 0; i != Set.size(); ++i) { 1036a52035a062edf9bfbf95c92c615219b647042c17Devang Patel if (i) cerr << ","; 1037a52035a062edf9bfbf95c92c615219b647042c17Devang Patel cerr << " " << Set[i]->getPassName(); 1038a52035a062edf9bfbf95c92c615219b647042c17Devang Patel } 1039a52035a062edf9bfbf95c92c615219b647042c17Devang Patel cerr << "\n"; 1040a52035a062edf9bfbf95c92c615219b647042c17Devang Patel } 1041a52035a062edf9bfbf95c92c615219b647042c17Devang Patel} 1042f3dc6d9f95d4ba7756105154df4a8075bbbcf931Devang Patel 1043f3dc6d9f95d4ba7756105154df4a8075bbbcf931Devang Patel//===----------------------------------------------------------------------===// 1044f3dc6d9f95d4ba7756105154df4a8075bbbcf931Devang Patel// NOTE: Is this the right place to define this method ? 1045f3dc6d9f95d4ba7756105154df4a8075bbbcf931Devang Patel// getAnalysisToUpdate - Return an analysis result or null if it doesn't exist 1046cde53d3c1e9d6a2add5de847b44818fbb1d69c20Devang PatelPass *AnalysisResolver::getAnalysisToUpdate(AnalysisID ID, bool dir) const { 1047f3dc6d9f95d4ba7756105154df4a8075bbbcf931Devang Patel return PM.findAnalysisPass(ID, dir); 1048f3dc6d9f95d4ba7756105154df4a8075bbbcf931Devang Patel} 1049f3dc6d9f95d4ba7756105154df4a8075bbbcf931Devang Patel 105006e86561a5261a59f5c391d5cc5cb4aa38dca83cDevang Patel//===----------------------------------------------------------------------===// 10515f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel// BBPassManager implementation 105255fd43f90913676682487f89f27c756adb827f66Devang Patel 10532c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel/// Add pass P into PassVector and return true. If this pass is not 10542c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel/// manageable by this manager then return false. 105555fd43f90913676682487f89f27c756adb827f66Devang Patelbool 10565f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang PatelBBPassManager::addPass(Pass *P) { 105755fd43f90913676682487f89f27c756adb827f66Devang Patel 105855fd43f90913676682487f89f27c756adb827f66Devang Patel BasicBlockPass *BP = dynamic_cast<BasicBlockPass*>(P); 105955fd43f90913676682487f89f27c756adb827f66Devang Patel if (!BP) 106055fd43f90913676682487f89f27c756adb827f66Devang Patel return false; 106155fd43f90913676682487f89f27c756adb827f66Devang Patel 10621a8038636c2998e37f2130b0ab89a3686d9c1f48Devang Patel // If this pass does not preserve analysis that is used by other passes 10631a8038636c2998e37f2130b0ab89a3686d9c1f48Devang Patel // managed by this manager than it is not a suitable pass for this manager. 10642c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel if (!manageablePass(P)) 106553596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel return false; 106653596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel 1067a84b3025ca7d437d2eab22d7c3002c8d89c31858Chris Lattner addPassToManager(BP); 106814d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel 106955fd43f90913676682487f89f27c756adb827f66Devang Patel return true; 107055fd43f90913676682487f89f27c756adb827f66Devang Patel} 107155fd43f90913676682487f89f27c756adb827f66Devang Patel 107255fd43f90913676682487f89f27c756adb827f66Devang Patel/// Execute all of the passes scheduled for execution by invoking 107355fd43f90913676682487f89f27c756adb827f66Devang Patel/// runOnBasicBlock method. Keep track of whether any of the passes modifies 107455fd43f90913676682487f89f27c756adb827f66Devang Patel/// the function, and if so, return true. 107555fd43f90913676682487f89f27c756adb827f66Devang Patelbool 10765f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang PatelBBPassManager::runOnFunction(Function &F) { 107755fd43f90913676682487f89f27c756adb827f66Devang Patel 10781fbe2c9964d57b2a58235541175f069ae491a95eDevang Patel if (F.isExternal()) 10791fbe2c9964d57b2a58235541175f069ae491a95eDevang Patel return false; 10801fbe2c9964d57b2a58235541175f069ae491a95eDevang Patel 10813b14fbe300b96c353a9abfadf481b64324f17375Devang Patel bool Changed = doInitialization(F); 1082c1d6e1fc9c3a47529f417026df652f466ce67851Devang Patel 1083693a74e4ee34e2058dab7121c17c98ec59258a8aDevang Patel std::string Msg1 = "Executing Pass '"; 1084693a74e4ee34e2058dab7121c17c98ec59258a8aDevang Patel std::string Msg3 = "' Made Modification '"; 1085693a74e4ee34e2058dab7121c17c98ec59258a8aDevang Patel 108655fd43f90913676682487f89f27c756adb827f66Devang Patel for (Function::iterator I = F.begin(), E = F.end(); I != E; ++I) 10871554c8545651350569f08dc7370189da1a7e5814Devang Patel for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) { 10881554c8545651350569f08dc7370189da1a7e5814Devang Patel BasicBlockPass *BP = getContainedPass(Index); 1089017b5d969b12119a88463fe2451f20ca9214c4ffDevang Patel AnalysisUsage AnUsage; 10901554c8545651350569f08dc7370189da1a7e5814Devang Patel BP->getAnalysisUsage(AnUsage); 1091017b5d969b12119a88463fe2451f20ca9214c4ffDevang Patel 10924eeea774ce1b24fa55c06aac31e02016d5dd77d6Devang Patel std::string Msg2 = "' on BasicBlock '" + (*I).getName() + "'...\n"; 10931554c8545651350569f08dc7370189da1a7e5814Devang Patel dumpPassInfo(BP, Msg1, Msg2); 10941554c8545651350569f08dc7370189da1a7e5814Devang Patel dumpAnalysisSetInfo("Required", BP, AnUsage.getRequiredSet()); 1095017b5d969b12119a88463fe2451f20ca9214c4ffDevang Patel 10961554c8545651350569f08dc7370189da1a7e5814Devang Patel initializeAnalysisImpl(BP); 1097693a74e4ee34e2058dab7121c17c98ec59258a8aDevang Patel 10981554c8545651350569f08dc7370189da1a7e5814Devang Patel if (TheTimeInfo) TheTimeInfo->passStarted(BP); 109955fd43f90913676682487f89f27c756adb827f66Devang Patel Changed |= BP->runOnBasicBlock(*I); 11001554c8545651350569f08dc7370189da1a7e5814Devang Patel if (TheTimeInfo) TheTimeInfo->passEnded(BP); 1101693a74e4ee34e2058dab7121c17c98ec59258a8aDevang Patel 1102693a74e4ee34e2058dab7121c17c98ec59258a8aDevang Patel if (Changed) 11031554c8545651350569f08dc7370189da1a7e5814Devang Patel dumpPassInfo(BP, Msg3, Msg2); 11041554c8545651350569f08dc7370189da1a7e5814Devang Patel dumpAnalysisSetInfo("Preserved", BP, AnUsage.getPreservedSet()); 1105693a74e4ee34e2058dab7121c17c98ec59258a8aDevang Patel 11061554c8545651350569f08dc7370189da1a7e5814Devang Patel removeNotPreservedAnalysis(BP); 11071554c8545651350569f08dc7370189da1a7e5814Devang Patel recordAvailableAnalysis(BP); 11081554c8545651350569f08dc7370189da1a7e5814Devang Patel removeDeadPasses(BP, Msg2); 110955fd43f90913676682487f89f27c756adb827f66Devang Patel } 11101a8038636c2998e37f2130b0ab89a3686d9c1f48Devang Patel return Changed |= doFinalization(F); 111155fd43f90913676682487f89f27c756adb827f66Devang Patel} 111255fd43f90913676682487f89f27c756adb827f66Devang Patel 1113964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel// Implement doInitialization and doFinalization 11145f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patelinline bool BBPassManager::doInitialization(Module &M) { 1115964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel bool Changed = false; 1116964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel 11171554c8545651350569f08dc7370189da1a7e5814Devang Patel for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) { 11181554c8545651350569f08dc7370189da1a7e5814Devang Patel BasicBlockPass *BP = getContainedPass(Index); 1119964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel Changed |= BP->doInitialization(M); 1120964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel } 1121964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel 1122964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel return Changed; 1123964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel} 1124964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel 11255f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patelinline bool BBPassManager::doFinalization(Module &M) { 1126964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel bool Changed = false; 1127964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel 11281554c8545651350569f08dc7370189da1a7e5814Devang Patel for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) { 11291554c8545651350569f08dc7370189da1a7e5814Devang Patel BasicBlockPass *BP = getContainedPass(Index); 1130964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel Changed |= BP->doFinalization(M); 1131964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel } 1132964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel 1133964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel return Changed; 1134964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel} 1135964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel 11365f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patelinline bool BBPassManager::doInitialization(Function &F) { 1137964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel bool Changed = false; 1138964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel 11391554c8545651350569f08dc7370189da1a7e5814Devang Patel for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) { 11401554c8545651350569f08dc7370189da1a7e5814Devang Patel BasicBlockPass *BP = getContainedPass(Index); 1141964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel Changed |= BP->doInitialization(F); 1142964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel } 1143964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel 1144964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel return Changed; 1145964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel} 1146964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel 11475f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patelinline bool BBPassManager::doFinalization(Function &F) { 1148964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel bool Changed = false; 1149964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel 11501554c8545651350569f08dc7370189da1a7e5814Devang Patel for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) { 11511554c8545651350569f08dc7370189da1a7e5814Devang Patel BasicBlockPass *BP = getContainedPass(Index); 1152964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel Changed |= BP->doFinalization(F); 1153964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel } 1154964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel 1155964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel return Changed; 1156964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel} 1157964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel 1158964e45e60769ccdb4ee0230a179f84f37f6c371aDevang Patel 115906e86561a5261a59f5c391d5cc5cb4aa38dca83cDevang Patel//===----------------------------------------------------------------------===// 11603162691f69f85f740bc28f3ddca39b166d35187cDevang Patel// FunctionPassManager implementation 116106e86561a5261a59f5c391d5cc5cb4aa38dca83cDevang Patel 1162c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// Create new Function pass manager 11633162691f69f85f740bc28f3ddca39b166d35187cDevang PatelFunctionPassManager::FunctionPassManager(ModuleProvider *P) { 11645f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel FPM = new FunctionPassManagerImpl(0); 1165dff33ef8e863241193463fd0129657c5ebce4d58Devang Patel // FPM is the top level manager. 1166dff33ef8e863241193463fd0129657c5ebce4d58Devang Patel FPM->setTopLevelManager(FPM); 1167b920bd85adba95553568cef6a7078ee2509ab804Devang Patel 1168b920bd85adba95553568cef6a7078ee2509ab804Devang Patel PMDataManager *PMD = dynamic_cast<PMDataManager *>(FPM); 1169cde53d3c1e9d6a2add5de847b44818fbb1d69c20Devang Patel AnalysisResolver *AR = new AnalysisResolver(*PMD); 1170b920bd85adba95553568cef6a7078ee2509ab804Devang Patel FPM->setResolver(AR); 1171b920bd85adba95553568cef6a7078ee2509ab804Devang Patel 1172cc132cd9feef765fe70284183c0f997b4faa5483Devang Patel MP = P; 1173cc132cd9feef765fe70284183c0f997b4faa5483Devang Patel} 1174cc132cd9feef765fe70284183c0f997b4faa5483Devang Patel 11753162691f69f85f740bc28f3ddca39b166d35187cDevang PatelFunctionPassManager::~FunctionPassManager() { 117637a6f7966c39f69a92419d37949a94a758c29e90Devang Patel delete FPM; 117737a6f7966c39f69a92419d37949a94a758c29e90Devang Patel} 117837a6f7966c39f69a92419d37949a94a758c29e90Devang Patel 1179c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// add - Add a pass to the queue of passes to run. This passes 1180c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// ownership of the Pass to the PassManager. When the 1181c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// PassManager_X is destroyed, the pass will be destroyed as well, so 1182c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// there is no need to delete the pass. (TODO delete passes.) 1183c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// This implies that all passes MUST be allocated with 'new'. 11843162691f69f85f740bc28f3ddca39b166d35187cDevang Patelvoid FunctionPassManager::add(Pass *P) { 1185c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel FPM->add(P); 1186c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel} 1187c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel 1188214ca23aef8bd408c4ee4ce28ba93d57d2416587Devang Patel/// run - Execute all of the passes scheduled for execution. Keep 1189214ca23aef8bd408c4ee4ce28ba93d57d2416587Devang Patel/// track of whether any of the passes modifies the function, and if 1190214ca23aef8bd408c4ee4ce28ba93d57d2416587Devang Patel/// so, return true. 1191214ca23aef8bd408c4ee4ce28ba93d57d2416587Devang Patel/// 11923162691f69f85f740bc28f3ddca39b166d35187cDevang Patelbool FunctionPassManager::run(Function &F) { 1193214ca23aef8bd408c4ee4ce28ba93d57d2416587Devang Patel std::string errstr; 1194214ca23aef8bd408c4ee4ce28ba93d57d2416587Devang Patel if (MP->materializeFunction(&F, &errstr)) { 1195e81561909d128c6e2d8033cb5465a49b2596b26aBill Wendling cerr << "Error reading bytecode file: " << errstr << "\n"; 1196214ca23aef8bd408c4ee4ce28ba93d57d2416587Devang Patel abort(); 1197214ca23aef8bd408c4ee4ce28ba93d57d2416587Devang Patel } 1198c475692c5ee2f9c0c6988b7ec28768ef6690bfb0Devang Patel return FPM->run(F); 1199214ca23aef8bd408c4ee4ce28ba93d57d2416587Devang Patel} 1200214ca23aef8bd408c4ee4ce28ba93d57d2416587Devang Patel 1201214ca23aef8bd408c4ee4ce28ba93d57d2416587Devang Patel 12023799f97d539f6c288d169063e1b335917fafcffbDevang Patel/// doInitialization - Run all of the initializers for the function passes. 12033799f97d539f6c288d169063e1b335917fafcffbDevang Patel/// 12043162691f69f85f740bc28f3ddca39b166d35187cDevang Patelbool FunctionPassManager::doInitialization() { 12053799f97d539f6c288d169063e1b335917fafcffbDevang Patel return FPM->doInitialization(*MP->getModule()); 12063799f97d539f6c288d169063e1b335917fafcffbDevang Patel} 12073799f97d539f6c288d169063e1b335917fafcffbDevang Patel 12083799f97d539f6c288d169063e1b335917fafcffbDevang Patel/// doFinalization - Run all of the initializers for the function passes. 12093799f97d539f6c288d169063e1b335917fafcffbDevang Patel/// 12103162691f69f85f740bc28f3ddca39b166d35187cDevang Patelbool FunctionPassManager::doFinalization() { 12113799f97d539f6c288d169063e1b335917fafcffbDevang Patel return FPM->doFinalization(*MP->getModule()); 12123799f97d539f6c288d169063e1b335917fafcffbDevang Patel} 12133799f97d539f6c288d169063e1b335917fafcffbDevang Patel 121406e86561a5261a59f5c391d5cc5cb4aa38dca83cDevang Patel//===----------------------------------------------------------------------===// 12155f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel// FunctionPassManagerImpl implementation 12165f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel// 12175f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel/// Add P into active pass manager or use new module pass manager to 12185f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel/// manage it. 12195f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patelbool FunctionPassManagerImpl::addPass(Pass *P) { 12205f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel 12215f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel if (!activeManager || !activeManager->addPass(P)) { 12225f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel activeManager = new FPPassManager(getDepth() + 1); 12235f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel // Inherit top level manager 12245f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel activeManager->setTopLevelManager(this->getTopLevelManager()); 12255f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel 12265f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel // This top level manager is going to manage activeManager. 12275f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel // Set up analysis resolver to connect them. 1228cde53d3c1e9d6a2add5de847b44818fbb1d69c20Devang Patel AnalysisResolver *AR = new AnalysisResolver(*this); 12295f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel activeManager->setResolver(AR); 12305f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel 12315f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel addPassManager(activeManager); 12325f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel return activeManager->addPass(P); 12335f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel } 12345f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel return true; 12355f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel} 12365f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel 12375f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patelinline bool FunctionPassManagerImpl::doInitialization(Module &M) { 12385f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel bool Changed = false; 12395f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel 12405f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel for (unsigned Index = 0; Index < getNumContainedManagers(); ++Index) { 12415f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel FPPassManager *FP = getContainedManager(Index); 12425f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel Changed |= FP->doInitialization(M); 12435f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel } 12445f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel 12455f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel return Changed; 12465f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel} 12475f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel 12485f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patelinline bool FunctionPassManagerImpl::doFinalization(Module &M) { 12495f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel bool Changed = false; 12505f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel 12515f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel for (unsigned Index = 0; Index < getNumContainedManagers(); ++Index) { 12525f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel FPPassManager *FP = getContainedManager(Index); 12535f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel Changed |= FP->doFinalization(M); 12545f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel } 12555f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel 12565f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel return Changed; 12575f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel} 12585f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel 12595f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel// Execute all the passes managed by this top level manager. 12605f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel// Return true if any function is modified by a pass. 12615f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patelbool FunctionPassManagerImpl::run(Function &F) { 12625f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel 12635f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel bool Changed = false; 12645f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel 12655f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel TimingInfo::createTheTimeInfo(); 12665f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel 12675f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel dumpArguments(); 12685f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel dumpPasses(); 12695f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel 12701336a6bf06e64a096217628d2cc9644e48a5d7d6Devang Patel initializeAllAnalysisInfo(); 12715f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel for (unsigned Index = 0; Index < getNumContainedManagers(); ++Index) { 12725f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel FPPassManager *FP = getContainedManager(Index); 12735f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel Changed |= FP->runOnFunction(F); 12745f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel } 12755f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel return Changed; 12765f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel} 12775f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel 12785f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel//===----------------------------------------------------------------------===// 12795f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel// FPPassManager implementation 1280448d27cd795dc273249f123444509403f4fa4facDevang Patel 1281448d27cd795dc273249f123444509403f4fa4facDevang Patel/// Add pass P into the pass manager queue. If P is a BasicBlockPass then 1282448d27cd795dc273249f123444509403f4fa4facDevang Patel/// either use it into active basic block pass manager or create new basic 1283448d27cd795dc273249f123444509403f4fa4facDevang Patel/// block pass manager to handle pass P. 1284448d27cd795dc273249f123444509403f4fa4facDevang Patelbool 12855f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang PatelFPPassManager::addPass(Pass *P) { 1286448d27cd795dc273249f123444509403f4fa4facDevang Patel 12875f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel // If P is a BasicBlockPass then use BBPassManager. 1288448d27cd795dc273249f123444509403f4fa4facDevang Patel if (BasicBlockPass *BP = dynamic_cast<BasicBlockPass*>(P)) { 1289448d27cd795dc273249f123444509403f4fa4facDevang Patel 1290badc4fae531cc0fdaa8e58f481c3b1d23ea7dd56Devang Patel if (!activeBBPassManager || !activeBBPassManager->addPass(BP)) { 1291448d27cd795dc273249f123444509403f4fa4facDevang Patel 1292badc4fae531cc0fdaa8e58f481c3b1d23ea7dd56Devang Patel // If active manager exists then clear its analysis info. 1293badc4fae531cc0fdaa8e58f481c3b1d23ea7dd56Devang Patel if (activeBBPassManager) 1294badc4fae531cc0fdaa8e58f481c3b1d23ea7dd56Devang Patel activeBBPassManager->initializeAnalysisInfo(); 1295b917e38c84fa9c7c434762a0e587af63eec939e5Devang Patel 1296badc4fae531cc0fdaa8e58f481c3b1d23ea7dd56Devang Patel // Create and add new manager 12975f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel activeBBPassManager = new BBPassManager(getDepth() + 1); 1298dff33ef8e863241193463fd0129657c5ebce4d58Devang Patel // Inherit top level manager 1299dff33ef8e863241193463fd0129657c5ebce4d58Devang Patel activeBBPassManager->setTopLevelManager(this->getTopLevelManager()); 13001b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel 13011b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel // Add new manager into current manager's list. 1302893a5a681585cdf3b5bfff7128ea522e8a47750aDevang Patel addPassToManager(activeBBPassManager, false); 13031b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel 13041b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel // Add new manager into top level manager's indirect passes list 13051b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel PMDataManager *PMD = dynamic_cast<PMDataManager *>(activeBBPassManager); 13061b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel assert (PMD && "Manager is not Pass Manager"); 13071b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel TPM->addIndirectPassManager(PMD); 1308badc4fae531cc0fdaa8e58f481c3b1d23ea7dd56Devang Patel 1309badc4fae531cc0fdaa8e58f481c3b1d23ea7dd56Devang Patel // Add pass into new manager. This time it must succeed. 13102c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel if (!activeBBPassManager->addPass(BP)) 13112c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel assert(0 && "Unable to add Pass"); 1312ef89c5594aaa5b97f303ba0de99940b79f2c0e0eDevang Patel 1313ef89c5594aaa5b97f303ba0de99940b79f2c0e0eDevang Patel // If activeBBPassManager transfered any Last Uses then handle them here. 1314ef89c5594aaa5b97f303ba0de99940b79f2c0e0eDevang Patel std::vector<Pass *> &TLU = activeBBPassManager->getTransferredLastUses(); 1315ef89c5594aaa5b97f303ba0de99940b79f2c0e0eDevang Patel if (!TLU.empty()) 1316ef89c5594aaa5b97f303ba0de99940b79f2c0e0eDevang Patel TPM->setLastUser(TLU, this); 1317ef89c5594aaa5b97f303ba0de99940b79f2c0e0eDevang Patel 1318448d27cd795dc273249f123444509403f4fa4facDevang Patel } 1319e16634065021e36ae31f074f623a636924d6b8d1Devang Patel 1320448d27cd795dc273249f123444509403f4fa4facDevang Patel return true; 1321448d27cd795dc273249f123444509403f4fa4facDevang Patel } 1322448d27cd795dc273249f123444509403f4fa4facDevang Patel 1323448d27cd795dc273249f123444509403f4fa4facDevang Patel FunctionPass *FP = dynamic_cast<FunctionPass *>(P); 1324448d27cd795dc273249f123444509403f4fa4facDevang Patel if (!FP) 1325448d27cd795dc273249f123444509403f4fa4facDevang Patel return false; 1326448d27cd795dc273249f123444509403f4fa4facDevang Patel 13271a8038636c2998e37f2130b0ab89a3686d9c1f48Devang Patel // If this pass does not preserve analysis that is used by other passes 13281a8038636c2998e37f2130b0ab89a3686d9c1f48Devang Patel // managed by this manager than it is not a suitable pass for this manager. 13292c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel if (!manageablePass(P)) 133053596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel return false; 133153596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel 1332e253385b108cd946b1ac150302f246d3b218be77Devang Patel addPassToManager (FP); 1333badc4fae531cc0fdaa8e58f481c3b1d23ea7dd56Devang Patel 1334badc4fae531cc0fdaa8e58f481c3b1d23ea7dd56Devang Patel // If active manager exists then clear its analysis info. 1335badc4fae531cc0fdaa8e58f481c3b1d23ea7dd56Devang Patel if (activeBBPassManager) { 1336badc4fae531cc0fdaa8e58f481c3b1d23ea7dd56Devang Patel activeBBPassManager->initializeAnalysisInfo(); 1337badc4fae531cc0fdaa8e58f481c3b1d23ea7dd56Devang Patel activeBBPassManager = NULL; 1338badc4fae531cc0fdaa8e58f481c3b1d23ea7dd56Devang Patel } 1339badc4fae531cc0fdaa8e58f481c3b1d23ea7dd56Devang Patel 1340448d27cd795dc273249f123444509403f4fa4facDevang Patel return true; 1341448d27cd795dc273249f123444509403f4fa4facDevang Patel} 1342448d27cd795dc273249f123444509403f4fa4facDevang Patel 1343448d27cd795dc273249f123444509403f4fa4facDevang Patel/// Execute all of the passes scheduled for execution by invoking 1344448d27cd795dc273249f123444509403f4fa4facDevang Patel/// runOnFunction method. Keep track of whether any of the passes modifies 1345448d27cd795dc273249f123444509403f4fa4facDevang Patel/// the function, and if so, return true. 13465f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patelbool FPPassManager::runOnFunction(Function &F) { 1347214ca23aef8bd408c4ee4ce28ba93d57d2416587Devang Patel 1348214ca23aef8bd408c4ee4ce28ba93d57d2416587Devang Patel bool Changed = false; 13491fbe2c9964d57b2a58235541175f069ae491a95eDevang Patel 13501fbe2c9964d57b2a58235541175f069ae491a95eDevang Patel if (F.isExternal()) 13511fbe2c9964d57b2a58235541175f069ae491a95eDevang Patel return false; 13521fbe2c9964d57b2a58235541175f069ae491a95eDevang Patel 1353693a74e4ee34e2058dab7121c17c98ec59258a8aDevang Patel std::string Msg1 = "Executing Pass '"; 1354693a74e4ee34e2058dab7121c17c98ec59258a8aDevang Patel std::string Msg3 = "' Made Modification '"; 1355693a74e4ee34e2058dab7121c17c98ec59258a8aDevang Patel 13561554c8545651350569f08dc7370189da1a7e5814Devang Patel for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) { 13571554c8545651350569f08dc7370189da1a7e5814Devang Patel FunctionPass *FP = getContainedPass(Index); 13581554c8545651350569f08dc7370189da1a7e5814Devang Patel 1359017b5d969b12119a88463fe2451f20ca9214c4ffDevang Patel AnalysisUsage AnUsage; 13601554c8545651350569f08dc7370189da1a7e5814Devang Patel FP->getAnalysisUsage(AnUsage); 1361693a74e4ee34e2058dab7121c17c98ec59258a8aDevang Patel 13624eeea774ce1b24fa55c06aac31e02016d5dd77d6Devang Patel std::string Msg2 = "' on Function '" + F.getName() + "'...\n"; 13631554c8545651350569f08dc7370189da1a7e5814Devang Patel dumpPassInfo(FP, Msg1, Msg2); 13641554c8545651350569f08dc7370189da1a7e5814Devang Patel dumpAnalysisSetInfo("Required", FP, AnUsage.getRequiredSet()); 1365693a74e4ee34e2058dab7121c17c98ec59258a8aDevang Patel 13661554c8545651350569f08dc7370189da1a7e5814Devang Patel initializeAnalysisImpl(FP); 13678e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel 13681554c8545651350569f08dc7370189da1a7e5814Devang Patel if (TheTimeInfo) TheTimeInfo->passStarted(FP); 1369214ca23aef8bd408c4ee4ce28ba93d57d2416587Devang Patel Changed |= FP->runOnFunction(F); 13701554c8545651350569f08dc7370189da1a7e5814Devang Patel if (TheTimeInfo) TheTimeInfo->passEnded(FP); 1371693a74e4ee34e2058dab7121c17c98ec59258a8aDevang Patel 1372693a74e4ee34e2058dab7121c17c98ec59258a8aDevang Patel if (Changed) 13731554c8545651350569f08dc7370189da1a7e5814Devang Patel dumpPassInfo(FP, Msg3, Msg2); 13741554c8545651350569f08dc7370189da1a7e5814Devang Patel dumpAnalysisSetInfo("Preserved", FP, AnUsage.getPreservedSet()); 1375693a74e4ee34e2058dab7121c17c98ec59258a8aDevang Patel 13761554c8545651350569f08dc7370189da1a7e5814Devang Patel removeNotPreservedAnalysis(FP); 13771554c8545651350569f08dc7370189da1a7e5814Devang Patel recordAvailableAnalysis(FP); 13781554c8545651350569f08dc7370189da1a7e5814Devang Patel removeDeadPasses(FP, Msg2); 1379214ca23aef8bd408c4ee4ce28ba93d57d2416587Devang Patel } 1380214ca23aef8bd408c4ee4ce28ba93d57d2416587Devang Patel return Changed; 1381214ca23aef8bd408c4ee4ce28ba93d57d2416587Devang Patel} 1382214ca23aef8bd408c4ee4ce28ba93d57d2416587Devang Patel 13835f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patelbool FPPassManager::runOnModule(Module &M) { 1384214ca23aef8bd408c4ee4ce28ba93d57d2416587Devang Patel 13855f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel bool Changed = doInitialization(M); 13865f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel 13875f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel for(Module::iterator I = M.begin(), E = M.end(); I != E; ++I) 13885f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel this->runOnFunction(*I); 13895f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel 13905f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel return Changed |= doFinalization(M); 13915f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel} 13925f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel 13935f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patelinline bool FPPassManager::doInitialization(Module &M) { 13943799f97d539f6c288d169063e1b335917fafcffbDevang Patel bool Changed = false; 13953799f97d539f6c288d169063e1b335917fafcffbDevang Patel 13961554c8545651350569f08dc7370189da1a7e5814Devang Patel for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) { 13971554c8545651350569f08dc7370189da1a7e5814Devang Patel FunctionPass *FP = getContainedPass(Index); 13983799f97d539f6c288d169063e1b335917fafcffbDevang Patel Changed |= FP->doInitialization(M); 13993799f97d539f6c288d169063e1b335917fafcffbDevang Patel } 14003799f97d539f6c288d169063e1b335917fafcffbDevang Patel 14013799f97d539f6c288d169063e1b335917fafcffbDevang Patel return Changed; 14023799f97d539f6c288d169063e1b335917fafcffbDevang Patel} 14033799f97d539f6c288d169063e1b335917fafcffbDevang Patel 14045f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patelinline bool FPPassManager::doFinalization(Module &M) { 14053799f97d539f6c288d169063e1b335917fafcffbDevang Patel bool Changed = false; 14063799f97d539f6c288d169063e1b335917fafcffbDevang Patel 14071554c8545651350569f08dc7370189da1a7e5814Devang Patel for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) { 14081554c8545651350569f08dc7370189da1a7e5814Devang Patel FunctionPass *FP = getContainedPass(Index); 14093799f97d539f6c288d169063e1b335917fafcffbDevang Patel Changed |= FP->doFinalization(M); 14103799f97d539f6c288d169063e1b335917fafcffbDevang Patel } 14113799f97d539f6c288d169063e1b335917fafcffbDevang Patel 14123799f97d539f6c288d169063e1b335917fafcffbDevang Patel return Changed; 14133799f97d539f6c288d169063e1b335917fafcffbDevang Patel} 14143799f97d539f6c288d169063e1b335917fafcffbDevang Patel 141506e86561a5261a59f5c391d5cc5cb4aa38dca83cDevang Patel//===----------------------------------------------------------------------===// 14165f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel// MPPassManager implementation 141792c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel 141892c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel/// Add P into pass vector if it is manageble. If P is a FunctionPass 14195f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel/// then use FPPassManager to manage it. Return false if P 142092c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel/// is not manageable by this manager. 142192c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patelbool 14225f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang PatelMPPassManager::addPass(Pass *P) { 142392c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel 142492c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel // If P is FunctionPass then use function pass maanager. 142592c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel if (FunctionPass *FP = dynamic_cast<FunctionPass*>(P)) { 142692c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel 142769867b511c732a7fac7301977bd6e880e46439f1Devang Patel if (!activeFunctionPassManager || !activeFunctionPassManager->addPass(P)) { 142892c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel 1429badc4fae531cc0fdaa8e58f481c3b1d23ea7dd56Devang Patel // If active manager exists then clear its analysis info. 1430badc4fae531cc0fdaa8e58f481c3b1d23ea7dd56Devang Patel if (activeFunctionPassManager) 1431badc4fae531cc0fdaa8e58f481c3b1d23ea7dd56Devang Patel activeFunctionPassManager->initializeAnalysisInfo(); 1432b917e38c84fa9c7c434762a0e587af63eec939e5Devang Patel 1433badc4fae531cc0fdaa8e58f481c3b1d23ea7dd56Devang Patel // Create and add new manager 1434f72d29c540bf32b9c0e8914484cbbdeac70ee12aDevang Patel activeFunctionPassManager = 14355f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel new FPPassManager(getDepth() + 1); 14361b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel 14371b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel // Add new manager into current manager's list 1438893a5a681585cdf3b5bfff7128ea522e8a47750aDevang Patel addPassToManager(activeFunctionPassManager, false); 14391b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel 1440dff33ef8e863241193463fd0129657c5ebce4d58Devang Patel // Inherit top level manager 1441dff33ef8e863241193463fd0129657c5ebce4d58Devang Patel activeFunctionPassManager->setTopLevelManager(this->getTopLevelManager()); 14421b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel 14431b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel // Add new manager into top level manager's indirect passes list 14446e9e5e026af9e26cdec634c79017199f4e718599Chris Lattner PMDataManager *PMD = 14456e9e5e026af9e26cdec634c79017199f4e718599Chris Lattner dynamic_cast<PMDataManager *>(activeFunctionPassManager); 14466e9e5e026af9e26cdec634c79017199f4e718599Chris Lattner assert(PMD && "Manager is not Pass Manager"); 14471b8d015066dca364a1b11b6dbe5b80248b111cd5Devang Patel TPM->addIndirectPassManager(PMD); 1448591b1b7526ed9c099de23cc995853a250c20502fDevang Patel 1449badc4fae531cc0fdaa8e58f481c3b1d23ea7dd56Devang Patel // Add pass into new manager. This time it must succeed. 14502c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel if (!activeFunctionPassManager->addPass(FP)) 14512c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel assert(0 && "Unable to add pass"); 1452e16634065021e36ae31f074f623a636924d6b8d1Devang Patel 1453ef89c5594aaa5b97f303ba0de99940b79f2c0e0eDevang Patel // If activeFunctionPassManager transfered any Last Uses then 1454ef89c5594aaa5b97f303ba0de99940b79f2c0e0eDevang Patel // handle them here. 1455ef89c5594aaa5b97f303ba0de99940b79f2c0e0eDevang Patel std::vector<Pass *> &TLU = 1456ef89c5594aaa5b97f303ba0de99940b79f2c0e0eDevang Patel activeFunctionPassManager->getTransferredLastUses(); 1457ef89c5594aaa5b97f303ba0de99940b79f2c0e0eDevang Patel if (!TLU.empty()) 1458ef89c5594aaa5b97f303ba0de99940b79f2c0e0eDevang Patel TPM->setLastUser(TLU, this); 1459ef89c5594aaa5b97f303ba0de99940b79f2c0e0eDevang Patel } 1460e16634065021e36ae31f074f623a636924d6b8d1Devang Patel 146192c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel return true; 146292c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel } 146392c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel 146492c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel ModulePass *MP = dynamic_cast<ModulePass *>(P); 146592c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel if (!MP) 146692c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel return false; 146792c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel 14681a8038636c2998e37f2130b0ab89a3686d9c1f48Devang Patel // If this pass does not preserve analysis that is used by other passes 14691a8038636c2998e37f2130b0ab89a3686d9c1f48Devang Patel // managed by this manager than it is not a suitable pass for this manager. 14702c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel if (!manageablePass(P)) 147153596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel return false; 147253596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel 1473e253385b108cd946b1ac150302f246d3b218be77Devang Patel addPassToManager(MP); 1474badc4fae531cc0fdaa8e58f481c3b1d23ea7dd56Devang Patel // If active manager exists then clear its analysis info. 1475badc4fae531cc0fdaa8e58f481c3b1d23ea7dd56Devang Patel if (activeFunctionPassManager) { 1476badc4fae531cc0fdaa8e58f481c3b1d23ea7dd56Devang Patel activeFunctionPassManager->initializeAnalysisInfo(); 1477badc4fae531cc0fdaa8e58f481c3b1d23ea7dd56Devang Patel activeFunctionPassManager = NULL; 1478badc4fae531cc0fdaa8e58f481c3b1d23ea7dd56Devang Patel } 1479badc4fae531cc0fdaa8e58f481c3b1d23ea7dd56Devang Patel 148092c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel return true; 148192c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel} 148292c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel 148392c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel 148492c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel/// Execute all of the passes scheduled for execution by invoking 148592c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel/// runOnModule method. Keep track of whether any of the passes modifies 148692c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel/// the module, and if so, return true. 148792c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patelbool 14885f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang PatelMPPassManager::runOnModule(Module &M) { 148992c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel bool Changed = false; 1490c1d6e1fc9c3a47529f417026df652f466ce67851Devang Patel 1491693a74e4ee34e2058dab7121c17c98ec59258a8aDevang Patel std::string Msg1 = "Executing Pass '"; 1492693a74e4ee34e2058dab7121c17c98ec59258a8aDevang Patel std::string Msg3 = "' Made Modification '"; 1493693a74e4ee34e2058dab7121c17c98ec59258a8aDevang Patel 14941554c8545651350569f08dc7370189da1a7e5814Devang Patel for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) { 14951554c8545651350569f08dc7370189da1a7e5814Devang Patel ModulePass *MP = getContainedPass(Index); 14961554c8545651350569f08dc7370189da1a7e5814Devang Patel 1497017b5d969b12119a88463fe2451f20ca9214c4ffDevang Patel AnalysisUsage AnUsage; 14981554c8545651350569f08dc7370189da1a7e5814Devang Patel MP->getAnalysisUsage(AnUsage); 1499693a74e4ee34e2058dab7121c17c98ec59258a8aDevang Patel 15004eeea774ce1b24fa55c06aac31e02016d5dd77d6Devang Patel std::string Msg2 = "' on Module '" + M.getModuleIdentifier() + "'...\n"; 15011554c8545651350569f08dc7370189da1a7e5814Devang Patel dumpPassInfo(MP, Msg1, Msg2); 15021554c8545651350569f08dc7370189da1a7e5814Devang Patel dumpAnalysisSetInfo("Required", MP, AnUsage.getRequiredSet()); 1503693a74e4ee34e2058dab7121c17c98ec59258a8aDevang Patel 15041554c8545651350569f08dc7370189da1a7e5814Devang Patel initializeAnalysisImpl(MP); 15058e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel 15061554c8545651350569f08dc7370189da1a7e5814Devang Patel if (TheTimeInfo) TheTimeInfo->passStarted(MP); 150792c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel Changed |= MP->runOnModule(M); 15081554c8545651350569f08dc7370189da1a7e5814Devang Patel if (TheTimeInfo) TheTimeInfo->passEnded(MP); 1509693a74e4ee34e2058dab7121c17c98ec59258a8aDevang Patel 1510693a74e4ee34e2058dab7121c17c98ec59258a8aDevang Patel if (Changed) 15111554c8545651350569f08dc7370189da1a7e5814Devang Patel dumpPassInfo(MP, Msg3, Msg2); 15121554c8545651350569f08dc7370189da1a7e5814Devang Patel dumpAnalysisSetInfo("Preserved", MP, AnUsage.getPreservedSet()); 1513017b5d969b12119a88463fe2451f20ca9214c4ffDevang Patel 15141554c8545651350569f08dc7370189da1a7e5814Devang Patel removeNotPreservedAnalysis(MP); 15151554c8545651350569f08dc7370189da1a7e5814Devang Patel recordAvailableAnalysis(MP); 15161554c8545651350569f08dc7370189da1a7e5814Devang Patel removeDeadPasses(MP, Msg2); 151792c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel } 151892c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel return Changed; 151992c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel} 152092c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel 152106e86561a5261a59f5c391d5cc5cb4aa38dca83cDevang Patel//===----------------------------------------------------------------------===// 152206e86561a5261a59f5c391d5cc5cb4aa38dca83cDevang Patel// PassManagerImpl implementation 152337a6f7966c39f69a92419d37949a94a758c29e90Devang Patel// 1524b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel/// Add P into active pass manager or use new module pass manager to 1525b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel/// manage it. 15265f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patelbool PassManagerImpl::addPass(Pass *P) { 1527b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel 1528a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel if (!activeManager || !activeManager->addPass(P)) { 152909e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel 15305f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel activeManager = new MPPassManager(getDepth() + 1); 153109e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel 1532dff33ef8e863241193463fd0129657c5ebce4d58Devang Patel // Inherit top level manager 1533dff33ef8e863241193463fd0129657c5ebce4d58Devang Patel activeManager->setTopLevelManager(this->getTopLevelManager()); 1534145e83dc12a3f962b999f348474ebb07a36a7b81Devang Patel 1535145e83dc12a3f962b999f348474ebb07a36a7b81Devang Patel // This top level manager is going to manage activeManager. 1536145e83dc12a3f962b999f348474ebb07a36a7b81Devang Patel // Set up analysis resolver to connect them. 1537cde53d3c1e9d6a2add5de847b44818fbb1d69c20Devang Patel AnalysisResolver *AR = new AnalysisResolver(*this); 1538145e83dc12a3f962b999f348474ebb07a36a7b81Devang Patel activeManager->setResolver(AR); 1539145e83dc12a3f962b999f348474ebb07a36a7b81Devang Patel 1540a083e94f7971ddafb817b1bcd86992d9fc4d8f9eDevang Patel addPassManager(activeManager); 1541502f19e0f8ba47b5916a7e9d445f4ee071cdf132Devang Patel return activeManager->addPass(P); 1542b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel } 1543502f19e0f8ba47b5916a7e9d445f4ee071cdf132Devang Patel return true; 1544b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel} 1545b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel 1546b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel/// run - Execute all of the passes scheduled for execution. Keep track of 1547b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel/// whether any of the passes modifies the module, and if so, return true. 15485f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patelbool PassManagerImpl::run(Module &M) { 1549b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel 1550b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel bool Changed = false; 155145dc02d6f97447785ee7ffe08c36a34bc8921b0bDevang Patel 15528e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel TimingInfo::createTheTimeInfo(); 15538e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel 1554c32cf54101ecaf336d161fecd58667870149169cDevang Patel dumpArguments(); 15555f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel dumpPasses(); 155645dc02d6f97447785ee7ffe08c36a34bc8921b0bDevang Patel 15571336a6bf06e64a096217628d2cc9644e48a5d7d6Devang Patel initializeAllAnalysisInfo(); 15585f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel for (unsigned Index = 0; Index < getNumContainedManagers(); ++Index) { 15595f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel MPPassManager *MP = getContainedManager(Index); 1560a083e94f7971ddafb817b1bcd86992d9fc4d8f9eDevang Patel Changed |= MP->runOnModule(M); 1561b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel } 1562b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel return Changed; 1563b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel} 15645a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel 156506e86561a5261a59f5c391d5cc5cb4aa38dca83cDevang Patel//===----------------------------------------------------------------------===// 156606e86561a5261a59f5c391d5cc5cb4aa38dca83cDevang Patel// PassManager implementation 156706e86561a5261a59f5c391d5cc5cb4aa38dca83cDevang Patel 15685a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel/// Create new pass manager 15693162691f69f85f740bc28f3ddca39b166d35187cDevang PatelPassManager::PassManager() { 15705f4ddf517f29cfc91c327c33f6d3c0f157bc5bb5Devang Patel PM = new PassManagerImpl(0); 1571dff33ef8e863241193463fd0129657c5ebce4d58Devang Patel // PM is the top level manager 1572dff33ef8e863241193463fd0129657c5ebce4d58Devang Patel PM->setTopLevelManager(PM); 15735a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel} 15745a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel 15753162691f69f85f740bc28f3ddca39b166d35187cDevang PatelPassManager::~PassManager() { 157637a6f7966c39f69a92419d37949a94a758c29e90Devang Patel delete PM; 157737a6f7966c39f69a92419d37949a94a758c29e90Devang Patel} 157837a6f7966c39f69a92419d37949a94a758c29e90Devang Patel 15795a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel/// add - Add a pass to the queue of passes to run. This passes ownership of 15805a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel/// the Pass to the PassManager. When the PassManager is destroyed, the pass 15815a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel/// will be destroyed as well, so there is no need to delete the pass. This 15825a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel/// implies that all passes MUST be allocated with 'new'. 15835a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patelvoid 15843162691f69f85f740bc28f3ddca39b166d35187cDevang PatelPassManager::add(Pass *P) { 15855a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel PM->add(P); 15865a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel} 15875a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel 15885a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel/// run - Execute all of the passes scheduled for execution. Keep track of 15895a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel/// whether any of the passes modifies the module, and if so, return true. 15905a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patelbool 15913162691f69f85f740bc28f3ddca39b166d35187cDevang PatelPassManager::run(Module &M) { 15925a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel return PM->run(M); 15935a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel} 15945a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel 15958e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel//===----------------------------------------------------------------------===// 15968e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel// TimingInfo Class - This class is used to calculate information about the 15978e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel// amount of time each pass takes to execute. This only happens with 15988e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel// -time-passes is enabled on the command line. 15998e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel// 16008e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patelbool llvm::TimePassesIsEnabled = false; 16018e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patelstatic cl::opt<bool,true> 16028e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang PatelEnableTiming("time-passes", cl::location(TimePassesIsEnabled), 16038e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel cl::desc("Time each pass, printing elapsed time for each on exit")); 16048e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel 16058e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel// createTheTimeInfo - This method either initializes the TheTimeInfo pointer to 16068e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel// a non null value (if the -time-passes option is enabled) or it leaves it 16078e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel// null. It may be called multiple times. 16088e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patelvoid TimingInfo::createTheTimeInfo() { 16098e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel if (!TimePassesIsEnabled || TheTimeInfo) return; 16108e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel 16118e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel // Constructed the first time this is called, iff -time-passes is enabled. 16128e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel // This guarantees that the object will be constructed before static globals, 16138e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel // thus it will be destroyed before them. 16148e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel static ManagedStatic<TimingInfo> TTI; 16158e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel TheTimeInfo = &*TTI; 16168e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel} 16178e58a1b17bb57e6ffa187a0ec758f9a1bed7685bDevang Patel 161809e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel//===----------------------------------------------------------------------===// 161909e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel// PMStack implementation 162009e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel// 162109e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel// Pop Pass Manager from the stack and clear its analysis info. 162209e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patelvoid PMStack::pop() { 162309e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel 162409e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel PMDataManager *Top = this->top(); 162509e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel Top->initializeAnalysisInfo(); 162609e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel 162709e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel S.pop_back(); 162809e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel} 162909e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel 163009e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel// Push PM on the stack and set its top level manager. 163197149737f27457b0411e49af3e4539688e29848fDevang Patelvoid PMStack::push(Pass *P) { 163209e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel 163397149737f27457b0411e49af3e4539688e29848fDevang Patel PMDataManager *Top = NULL; 163497149737f27457b0411e49af3e4539688e29848fDevang Patel PMDataManager *PM = dynamic_cast<PMDataManager *>(P); 163597149737f27457b0411e49af3e4539688e29848fDevang Patel assert (PM && "Unable to push. Pass Manager expected"); 163697149737f27457b0411e49af3e4539688e29848fDevang Patel 163797149737f27457b0411e49af3e4539688e29848fDevang Patel if (this->empty()) { 163897149737f27457b0411e49af3e4539688e29848fDevang Patel Top = PM; 163997149737f27457b0411e49af3e4539688e29848fDevang Patel } 164097149737f27457b0411e49af3e4539688e29848fDevang Patel else { 164197149737f27457b0411e49af3e4539688e29848fDevang Patel Top = this->top(); 164297149737f27457b0411e49af3e4539688e29848fDevang Patel PMTopLevelManager *TPM = Top->getTopLevelManager(); 164397149737f27457b0411e49af3e4539688e29848fDevang Patel 164497149737f27457b0411e49af3e4539688e29848fDevang Patel assert (TPM && "Unable to find top level manager"); 164597149737f27457b0411e49af3e4539688e29848fDevang Patel TPM->addIndirectPassManager(PM); 164697149737f27457b0411e49af3e4539688e29848fDevang Patel PM->setTopLevelManager(TPM); 164797149737f27457b0411e49af3e4539688e29848fDevang Patel } 164897149737f27457b0411e49af3e4539688e29848fDevang Patel 164997149737f27457b0411e49af3e4539688e29848fDevang Patel AnalysisResolver *AR = new AnalysisResolver(*Top); 165097149737f27457b0411e49af3e4539688e29848fDevang Patel P->setResolver(AR); 165197149737f27457b0411e49af3e4539688e29848fDevang Patel 165297149737f27457b0411e49af3e4539688e29848fDevang Patel S.push_back(PM); 165397149737f27457b0411e49af3e4539688e29848fDevang Patel} 165409e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel 165597149737f27457b0411e49af3e4539688e29848fDevang Patel// Dump content of the pass manager stack. 165697149737f27457b0411e49af3e4539688e29848fDevang Patelvoid PMStack::dump() { 165797149737f27457b0411e49af3e4539688e29848fDevang Patel for(std::deque<PMDataManager *>::iterator I = S.begin(), 165897149737f27457b0411e49af3e4539688e29848fDevang Patel E = S.end(); I != E; ++I) { 165997149737f27457b0411e49af3e4539688e29848fDevang Patel Pass *P = dynamic_cast<Pass *>(*I); 166097149737f27457b0411e49af3e4539688e29848fDevang Patel printf ("%s ", P->getPassName()); 166197149737f27457b0411e49af3e4539688e29848fDevang Patel } 166297149737f27457b0411e49af3e4539688e29848fDevang Patel if (!S.empty()) 166397149737f27457b0411e49af3e4539688e29848fDevang Patel printf ("\n"); 166409e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel} 166509e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel 166609e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel// Walk Pass Manager stack and set LastUse markers if any 166709e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel// manager is transfering this priviledge to its parent manager 166809e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patelvoid PMStack::handleLastUserOverflow() { 166909e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel 167009e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel for(PMStack::iterator I = this->begin(), E = this->end(); I != E;) { 167109e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel 167209e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel PMDataManager *Child = *I++; 167309e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel if (I != E) { 167409e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel PMDataManager *Parent = *I++; 167509e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel PMTopLevelManager *TPM = Parent->getTopLevelManager(); 167609e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel std::vector<Pass *> &TLU = Child->getTransferredLastUses(); 167709e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel if (!TLU.empty()) { 167809e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel Pass *P = dynamic_cast<Pass *>(Parent); 167909e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel TPM->setLastUser(TLU, P); 168009e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel } 168109e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel } 168209e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel } 168309e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel} 168409e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel 168509e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel/// Find appropriate Module Pass Manager in the PM Stack and 168609e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel/// add self into that manager. 168709e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patelvoid ModulePass::assignPassManager(PMStack &PMS) { 168809e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel 168909e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel // Find Module Pass Manager 169009e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel while(!PMS.empty()) { 16916b9420e94392040fbe6b2af5e49adbcbc6b32615Devang Patel if (PMS.top()->getPassManagerType() > PMT_ModulePassManager) 169209e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel PMS.pop(); // Pop children pass managers 16936b9420e94392040fbe6b2af5e49adbcbc6b32615Devang Patel else 16946b9420e94392040fbe6b2af5e49adbcbc6b32615Devang Patel break; 169509e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel } 16966b9420e94392040fbe6b2af5e49adbcbc6b32615Devang Patel MPPassManager *MPP = dynamic_cast<MPPassManager *>(PMS.top()); 169709e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel 169809e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel assert(MPP && "Unable to find Module Pass Manager"); 169909e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel MPP->addPassToManager(this); 170009e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel} 170109e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel 170209e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel/// Find appropriate Function Pass Manager or Call Graph Pass Manager 170309e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel/// in the PM Stack and add self into that manager. 170409e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patelvoid FunctionPass::assignPassManager(PMStack &PMS) { 170509e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel 170697149737f27457b0411e49af3e4539688e29848fDevang Patel // Find Module Pass Manager (TODO : Or Call Graph Pass Manager) 170709e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel while(!PMS.empty()) { 17086b9420e94392040fbe6b2af5e49adbcbc6b32615Devang Patel if (PMS.top()->getPassManagerType() > PMT_FunctionPassManager) 17096b9420e94392040fbe6b2af5e49adbcbc6b32615Devang Patel PMS.pop(); 171009e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel else 17116b9420e94392040fbe6b2af5e49adbcbc6b32615Devang Patel break; 171209e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel } 17136b9420e94392040fbe6b2af5e49adbcbc6b32615Devang Patel FPPassManager *FPP = dynamic_cast<FPPassManager *>(PMS.top()); 171409e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel 171597149737f27457b0411e49af3e4539688e29848fDevang Patel // Create new Function Pass Manager 171609e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel if (!FPP) { 171709e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel assert(!PMS.empty() && "Unable to create Function Pass Manager"); 171809e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel PMDataManager *PMD = PMS.top(); 171909e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel 172097149737f27457b0411e49af3e4539688e29848fDevang Patel // [1] Create new Function Pass Manager 172109e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel FPP = new FPPassManager(PMD->getDepth() + 1); 172297149737f27457b0411e49af3e4539688e29848fDevang Patel 172397149737f27457b0411e49af3e4539688e29848fDevang Patel // [2] Set up new manager's top level manager 172497149737f27457b0411e49af3e4539688e29848fDevang Patel PMTopLevelManager *TPM = PMD->getTopLevelManager(); 172597149737f27457b0411e49af3e4539688e29848fDevang Patel TPM->addIndirectPassManager(FPP); 172697149737f27457b0411e49af3e4539688e29848fDevang Patel 172797149737f27457b0411e49af3e4539688e29848fDevang Patel // [3] Assign manager to manage this new manager. This may create 172897149737f27457b0411e49af3e4539688e29848fDevang Patel // and push new managers into PMS 172997149737f27457b0411e49af3e4539688e29848fDevang Patel Pass *P = dynamic_cast<Pass *>(FPP); 173097149737f27457b0411e49af3e4539688e29848fDevang Patel P->assignPassManager(PMS); 173197149737f27457b0411e49af3e4539688e29848fDevang Patel 173297149737f27457b0411e49af3e4539688e29848fDevang Patel // [4] Push new manager into PMS 173309e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel PMS.push(FPP); 173409e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel } 173509e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel 173697149737f27457b0411e49af3e4539688e29848fDevang Patel // Assign FPP as the manager of this pass. 173709e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel FPP->addPassToManager(this); 173809e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel} 173909e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel 174009e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel/// Find appropriate Basic Pass Manager or Call Graph Pass Manager 174109e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel/// in the PM Stack and add self into that manager. 174209e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patelvoid BasicBlockPass::assignPassManager(PMStack &PMS) { 174309e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel 174409e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel BBPassManager *BBP = NULL; 174509e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel 174697149737f27457b0411e49af3e4539688e29848fDevang Patel // Basic Pass Manager is a leaf pass manager. It does not handle 174797149737f27457b0411e49af3e4539688e29848fDevang Patel // any other pass manager. 174897149737f27457b0411e49af3e4539688e29848fDevang Patel if (!PMS.empty()) { 174909e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel BBP = dynamic_cast<BBPassManager *>(PMS.top()); 175009e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel } 175109e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel 175297149737f27457b0411e49af3e4539688e29848fDevang Patel // If leaf manager is not Basic Block Pass manager then create new 175397149737f27457b0411e49af3e4539688e29848fDevang Patel // basic Block Pass manager. 175409e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel 175597149737f27457b0411e49af3e4539688e29848fDevang Patel if (!BBP) { 175609e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel assert(!PMS.empty() && "Unable to create BasicBlock Pass Manager"); 175709e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel PMDataManager *PMD = PMS.top(); 175809e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel 175997149737f27457b0411e49af3e4539688e29848fDevang Patel // [1] Create new Basic Block Manager 176009e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel BBP = new BBPassManager(PMD->getDepth() + 1); 176197149737f27457b0411e49af3e4539688e29848fDevang Patel 176297149737f27457b0411e49af3e4539688e29848fDevang Patel // [2] Set up new manager's top level manager 176397149737f27457b0411e49af3e4539688e29848fDevang Patel // Basic Block Pass Manager does not live by itself 176497149737f27457b0411e49af3e4539688e29848fDevang Patel PMTopLevelManager *TPM = PMD->getTopLevelManager(); 176597149737f27457b0411e49af3e4539688e29848fDevang Patel TPM->addIndirectPassManager(BBP); 176697149737f27457b0411e49af3e4539688e29848fDevang Patel 176797149737f27457b0411e49af3e4539688e29848fDevang Patel // [3] Assign manager to manage this new manager. This may create 176897149737f27457b0411e49af3e4539688e29848fDevang Patel // and push new managers into PMS 176997149737f27457b0411e49af3e4539688e29848fDevang Patel Pass *P = dynamic_cast<Pass *>(BBP); 177097149737f27457b0411e49af3e4539688e29848fDevang Patel P->assignPassManager(PMS); 177197149737f27457b0411e49af3e4539688e29848fDevang Patel 177297149737f27457b0411e49af3e4539688e29848fDevang Patel // [4] Push new manager into PMS 177309e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel PMS.push(BBP); 177409e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel } 177509e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel 177697149737f27457b0411e49af3e4539688e29848fDevang Patel // Assign BBP as the manager of this pass. 177709e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel BBP->addPassToManager(this); 177809e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel} 177909e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patel 1780cccd80dfa316019047f053c55f1b94f63b17c043Devang Patel 1781