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