PassManager.cpp revision be6d515f481756ff549f355e32be1ac398e141d5
155fd43f90913676682487f89f27c756adb827f66Devang Patel//===- PassManager.cpp - LLVM Pass Infrastructure Implementation ----------===// 255fd43f90913676682487f89f27c756adb827f66Devang Patel// 355fd43f90913676682487f89f27c756adb827f66Devang Patel// The LLVM Compiler Infrastructure 455fd43f90913676682487f89f27c756adb827f66Devang Patel// 5c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel// This file was developed by Devang Patel and is distributed under 655fd43f90913676682487f89f27c756adb827f66Devang Patel// the University of Illinois Open Source License. See LICENSE.TXT for details. 755fd43f90913676682487f89f27c756adb827f66Devang Patel// 855fd43f90913676682487f89f27c756adb827f66Devang Patel//===----------------------------------------------------------------------===// 955fd43f90913676682487f89f27c756adb827f66Devang Patel// 1055fd43f90913676682487f89f27c756adb827f66Devang Patel// This file implements the LLVM Pass Manager infrastructure. 1155fd43f90913676682487f89f27c756adb827f66Devang Patel// 1255fd43f90913676682487f89f27c756adb827f66Devang Patel//===----------------------------------------------------------------------===// 1355fd43f90913676682487f89f27c756adb827f66Devang Patel 1455fd43f90913676682487f89f27c756adb827f66Devang Patel 1555fd43f90913676682487f89f27c756adb827f66Devang Patel#include "llvm/PassManager.h" 1655fd43f90913676682487f89f27c756adb827f66Devang Patel#include "llvm/Module.h" 1785d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel#include <vector> 1885d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel#include <set> 1955fd43f90913676682487f89f27c756adb827f66Devang Patel 2055fd43f90913676682487f89f27c756adb827f66Devang Patelusing namespace llvm; 2155fd43f90913676682487f89f27c756adb827f66Devang Patel 22c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patelnamespace llvm { 23c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel 2485d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel/// CommonPassManagerImpl helps pass manager analysis required by 2585d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel/// the managed passes. It provides methods to add/remove analysis 2685d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel/// available and query if certain analysis is available or not. 2785d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patelclass CommonPassManagerImpl : public Pass { 2885d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel 2985d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patelpublic: 3085d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel 3185d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel /// Return true IFF pass P's required analysis set does not required new 3285d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel /// manager. 3385d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel bool manageablePass(Pass *P); 3485d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel 3585d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel /// Return true IFF AnalysisID AID is currently available. 36be6d515f481756ff549f355e32be1ac398e141d5Devang Patel bool isAnalysisAvailable(AnalysisID AID) { 37be6d515f481756ff549f355e32be1ac398e141d5Devang Patel return (AvailableAnalysis.count(AID) != 0); 38be6d515f481756ff549f355e32be1ac398e141d5Devang Patel } 3985d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel 4085d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel /// Augment RequiredAnalysis by adding analysis required by pass P. 4185d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel void noteDownRequiredAnalysis(Pass *P); 4285d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel 4385d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel /// Augment AvailableAnalysis by adding analysis made available by pass P. 4485d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel void noteDownAvailableAnalysis(Pass *P); 4585d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel 4685d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel /// Remove Analysis that is not preserved by the pass 4785d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel void removeNotPreservedAnalysis(Pass *P); 4885d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel 4985d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel /// Remove dead passes 5085d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel void removeDeadPasses() { /* TODO : Implement */ } 5185d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel 52e253385b108cd946b1ac150302f246d3b218be77Devang Patel /// Add pass P into the PassVector. Update RequiredAnalysis and 53893a5a681585cdf3b5bfff7128ea522e8a47750aDevang Patel /// AvailableAnalysis appropriately if ProcessAnalysis is true. 54893a5a681585cdf3b5bfff7128ea522e8a47750aDevang Patel void addPassToManager (Pass *P, bool ProcessAnalysis = true); 55e253385b108cd946b1ac150302f246d3b218be77Devang Patel 56e253385b108cd946b1ac150302f246d3b218be77Devang Patel inline std::vector<Pass *>::iterator passVectorBegin() { 57e253385b108cd946b1ac150302f246d3b218be77Devang Patel return PassVector.begin(); 58e253385b108cd946b1ac150302f246d3b218be77Devang Patel } 59e253385b108cd946b1ac150302f246d3b218be77Devang Patel 60e253385b108cd946b1ac150302f246d3b218be77Devang Patel inline std::vector<Pass *>::iterator passVectorEnd() { 61e253385b108cd946b1ac150302f246d3b218be77Devang Patel return PassVector.end(); 62e253385b108cd946b1ac150302f246d3b218be77Devang Patel } 63e253385b108cd946b1ac150302f246d3b218be77Devang Patel 6485d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patelprivate: 6585d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel // Analysis required by the passes managed by this manager 6685d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel std::vector<AnalysisID> RequiredAnalysis; 6785d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel 6885d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel // set of available Analysis 6985d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel std::set<AnalysisID> AvailableAnalysis; 70e253385b108cd946b1ac150302f246d3b218be77Devang Patel 71e253385b108cd946b1ac150302f246d3b218be77Devang Patel // Collection of pass that are managed by this manager 72e253385b108cd946b1ac150302f246d3b218be77Devang Patel std::vector<Pass *> PassVector; 7385d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel}; 7485d344b0c68048527f1ac46ba22bbc950870d3c5Devang Patel 75c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel/// BasicBlockPassManager_New manages BasicBlockPass. It batches all the 76c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel/// pass together and sequence them to process one basic block before 77c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel/// processing next basic block. 7837a84c7d8bda439082b883e33be6ab88b4cce236Devang Patelclass BasicBlockPassManager_New : public CommonPassManagerImpl { 79c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel 80c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patelpublic: 81c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel BasicBlockPassManager_New() { } 82c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel 83c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel /// Add a pass into a passmanager queue. 84c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel bool addPass(Pass *p); 85c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel 86c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel /// Execute all of the passes scheduled for execution. Keep track of 87c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel /// whether any of the passes modifies the function, and if so, return true. 88c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel bool runOnFunction(Function &F); 89c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel 90be6d515f481756ff549f355e32be1ac398e141d5Devang Patel /// Return true IFF AnalysisID AID is currently available. 91be6d515f481756ff549f355e32be1ac398e141d5Devang Patel bool analysisCurrentlyAvailable(AnalysisID AID); 92be6d515f481756ff549f355e32be1ac398e141d5Devang Patel 93c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patelprivate: 94c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel}; 95c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel 96c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// FunctionPassManagerImpl_New manages FunctionPasses and BasicBlockPassManagers. 97c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel/// It batches all function passes and basic block pass managers together and 98c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel/// sequence them to process one function at a time before processing next 99c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel/// function. 10037a84c7d8bda439082b883e33be6ab88b4cce236Devang Patelclass FunctionPassManagerImpl_New : public CommonPassManagerImpl { 101c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patelpublic: 102c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel FunctionPassManagerImpl_New(ModuleProvider *P) { /* TODO */ } 103c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel FunctionPassManagerImpl_New() { 104c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel activeBBPassManager = NULL; 105c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel } 106c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel ~FunctionPassManagerImpl_New() { /* TODO */ }; 107c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel 108c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel /// add - Add a pass to the queue of passes to run. This passes 109c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel /// ownership of the Pass to the PassManager. When the 110c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel /// PassManager_X is destroyed, the pass will be destroyed as well, so 111c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel /// there is no need to delete the pass. (TODO delete passes.) 112c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel /// This implies that all passes MUST be allocated with 'new'. 113c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel void add(Pass *P) { /* TODO*/ } 114c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel 115c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel /// Add pass into the pass manager queue. 116c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel bool addPass(Pass *P); 117c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel 118c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel /// Execute all of the passes scheduled for execution. Keep 119c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel /// track of whether any of the passes modifies the function, and if 120c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel /// so, return true. 121c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel bool runOnModule(Module &M); 122c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel 123be6d515f481756ff549f355e32be1ac398e141d5Devang Patel /// Return true IFF AnalysisID AID is currently available. 124be6d515f481756ff549f355e32be1ac398e141d5Devang Patel bool analysisCurrentlyAvailable(AnalysisID AID); 125be6d515f481756ff549f355e32be1ac398e141d5Devang Patel 126c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patelprivate: 127c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel // Active Pass Managers 128c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel BasicBlockPassManager_New *activeBBPassManager; 129c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel}; 130c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel 131c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel/// ModulePassManager_New manages ModulePasses and function pass managers. 132c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel/// It batches all Module passes passes and function pass managers together and 133c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel/// sequence them to process one module. 13437a84c7d8bda439082b883e33be6ab88b4cce236Devang Patelclass ModulePassManager_New : public CommonPassManagerImpl { 135c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel 136c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patelpublic: 137c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel ModulePassManager_New() { activeFunctionPassManager = NULL; } 138c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel 139c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel /// Add a pass into a passmanager queue. 140c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel bool addPass(Pass *p); 141c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel 142c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel /// run - Execute all of the passes scheduled for execution. Keep track of 143c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel /// whether any of the passes modifies the module, and if so, return true. 144c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel bool runOnModule(Module &M); 145be6d515f481756ff549f355e32be1ac398e141d5Devang Patel 146be6d515f481756ff549f355e32be1ac398e141d5Devang Patel /// Return true IFF AnalysisID AID is currently available. 147be6d515f481756ff549f355e32be1ac398e141d5Devang Patel bool analysisCurrentlyAvailable(AnalysisID AID); 148c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel 149c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patelprivate: 150c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel // Active Pass Manager 151c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel FunctionPassManagerImpl_New *activeFunctionPassManager; 152c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel}; 153c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel 1545a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel/// PassManager_New manages ModulePassManagers 15537a84c7d8bda439082b883e33be6ab88b4cce236Devang Patelclass PassManagerImpl_New : public CommonPassManagerImpl { 1565a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel 1575a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patelpublic: 1585a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel 1595a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel /// add - Add a pass to the queue of passes to run. This passes ownership of 1605a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel /// the Pass to the PassManager. When the PassManager is destroyed, the pass 1615a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel /// will be destroyed as well, so there is no need to delete the pass. This 1625a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel /// implies that all passes MUST be allocated with 'new'. 1635a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel void add(Pass *P); 1645a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel 1655a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel /// run - Execute all of the passes scheduled for execution. Keep track of 1665a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel /// whether any of the passes modifies the module, and if so, return true. 1675a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel bool run(Module &M); 1685a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel 169be6d515f481756ff549f355e32be1ac398e141d5Devang Patel /// Return true IFF AnalysisID AID is currently available. 170be6d515f481756ff549f355e32be1ac398e141d5Devang Patel bool analysisCurrentlyAvailable(AnalysisID AID); 171be6d515f481756ff549f355e32be1ac398e141d5Devang Patel 1725a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patelprivate: 1735a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel 1745a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel /// Add a pass into a passmanager queue. This is used by schedulePasses 1755a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel bool addPass(Pass *p); 1765a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel 177f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel /// Schedule pass P for execution. Make sure that passes required by 178f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel /// P are run before P is run. Update analysis info maintained by 179f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel /// the manager. Remove dead passes. This is a recursive function. 180f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel void schedulePass(Pass *P); 181f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel 1825a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel /// Schedule all passes collected in pass queue using add(). Add all the 1835a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel /// schedule passes into various manager's queue using addPass(). 1845a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel void schedulePasses(); 1855a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel 1865a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel // Collection of pass managers 1875a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel std::vector<ModulePassManager_New *> PassManagers; 1885a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel 1895a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel // Active Pass Manager 1905a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel ModulePassManager_New *activeManager; 1915a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel}; 1925a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel 193c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel} // End of llvm namespace 194c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel 19537a84c7d8bda439082b883e33be6ab88b4cce236Devang Patel// CommonPassManagerImpl implementation 196889739c4d188d28c167644bced9df0f3131317d7Devang Patel 1972c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel/// Return true IFF pass P's required analysis set does not required new 198889739c4d188d28c167644bced9df0f3131317d7Devang Patel/// manager. 19937a84c7d8bda439082b883e33be6ab88b4cce236Devang Patelbool CommonPassManagerImpl::manageablePass(Pass *P) { 200889739c4d188d28c167644bced9df0f3131317d7Devang Patel 201889739c4d188d28c167644bced9df0f3131317d7Devang Patel AnalysisUsage AnUsage; 202889739c4d188d28c167644bced9df0f3131317d7Devang Patel P->getAnalysisUsage(AnUsage); 203889739c4d188d28c167644bced9df0f3131317d7Devang Patel 204a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel // If this pass is not preserving information that is required by the other 205a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel // passes managed by this manager then use new manager 206a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel if (!AnUsage.getPreservesAll()) { 207a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel const std::vector<AnalysisID> &PreservedSet = AnUsage.getPreservedSet(); 208a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel for (std::vector<AnalysisID>::iterator I = RequiredAnalysis.begin(), 209a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel E = RequiredAnalysis.end(); I != E; ++I) { 210a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel if (std::find(PreservedSet.begin(), PreservedSet.end(), *I) == 211a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel PreservedSet.end()) 212a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel // This analysis is not preserved. Need new manager. 213a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel return false; 214a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel } 215a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel } 216889739c4d188d28c167644bced9df0f3131317d7Devang Patel return true; 217889739c4d188d28c167644bced9df0f3131317d7Devang Patel} 218889739c4d188d28c167644bced9df0f3131317d7Devang Patel 219b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel/// Augment RequiredAnalysis by adding analysis required by pass P. 22037a84c7d8bda439082b883e33be6ab88b4cce236Devang Patelvoid CommonPassManagerImpl::noteDownRequiredAnalysis(Pass *P) { 221a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel AnalysisUsage AnUsage; 222a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel P->getAnalysisUsage(AnUsage); 223a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel const std::vector<AnalysisID> &RequiredSet = AnUsage.getRequiredSet(); 224889739c4d188d28c167644bced9df0f3131317d7Devang Patel 225a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel // FIXME: What about duplicates ? 22614d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel RequiredAnalysis.insert(RequiredAnalysis.end(), RequiredSet.begin(), 22714d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel RequiredSet.end()); 228889739c4d188d28c167644bced9df0f3131317d7Devang Patel} 229889739c4d188d28c167644bced9df0f3131317d7Devang Patel 230b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel/// Augement AvailableAnalysis by adding analysis made available by pass P. 231b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patelvoid CommonPassManagerImpl::noteDownAvailableAnalysis(Pass *P) { 232b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel 233b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel if (const PassInfo *PI = P->getPassInfo()) { 234b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel AvailableAnalysis.insert(PI); 235b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel 236b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel //TODO This pass is the current implementation of all of the interfaces it 237b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel //TODO implements as well. 238b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel //TODO 239b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel //TODO const std::vector<const PassInfo*> &II = PI->getInterfacesImplemented(); 240b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel //TODO for (unsigned i = 0, e = II.size(); i != e; ++i) 241b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel //TODO CurrentAnalyses[II[i]] = P; 242b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel } 243b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel} 244b8526162551a3fbcf787e01d82ef44b69f879e01Devang Patel 245889739c4d188d28c167644bced9df0f3131317d7Devang Patel/// Remove Analyss not preserved by Pass P 24637a84c7d8bda439082b883e33be6ab88b4cce236Devang Patelvoid CommonPassManagerImpl::removeNotPreservedAnalysis(Pass *P) { 24714d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel AnalysisUsage AnUsage; 24814d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel P->getAnalysisUsage(AnUsage); 24914d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel const std::vector<AnalysisID> &PreservedSet = AnUsage.getPreservedSet(); 25014d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel 25114d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel for (std::set<AnalysisID>::iterator I = AvailableAnalysis.begin(), 25214d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel E = AvailableAnalysis.end(); I != E; ++I ) { 25314d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel if (std::find(PreservedSet.begin(), PreservedSet.end(), *I) == 25414d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel PreservedSet.end()) { 25514d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel // Remove this analysis 25614d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel std::set<AnalysisID>::iterator J = I++; 25714d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel AvailableAnalysis.erase(J); 25814d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel } 25914d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel } 260889739c4d188d28c167644bced9df0f3131317d7Devang Patel} 261889739c4d188d28c167644bced9df0f3131317d7Devang Patel 262e253385b108cd946b1ac150302f246d3b218be77Devang Patel/// Add pass P into the PassVector. Update RequiredAnalysis and 263893a5a681585cdf3b5bfff7128ea522e8a47750aDevang Patel/// AvailableAnalysis appropriately if ProcessAnalysis is true. 264893a5a681585cdf3b5bfff7128ea522e8a47750aDevang Patelvoid CommonPassManagerImpl::addPassToManager (Pass *P, 265893a5a681585cdf3b5bfff7128ea522e8a47750aDevang Patel bool ProcessAnalysis) { 266e253385b108cd946b1ac150302f246d3b218be77Devang Patel 267893a5a681585cdf3b5bfff7128ea522e8a47750aDevang Patel if (ProcessAnalysis) { 268893a5a681585cdf3b5bfff7128ea522e8a47750aDevang Patel // Take a note of analysis required and made available by this pass 269893a5a681585cdf3b5bfff7128ea522e8a47750aDevang Patel noteDownRequiredAnalysis(P); 270893a5a681585cdf3b5bfff7128ea522e8a47750aDevang Patel noteDownAvailableAnalysis(P); 271893a5a681585cdf3b5bfff7128ea522e8a47750aDevang Patel 272893a5a681585cdf3b5bfff7128ea522e8a47750aDevang Patel // Remove the analysis not preserved by this pass 273893a5a681585cdf3b5bfff7128ea522e8a47750aDevang Patel removeNotPreservedAnalysis(P); 274893a5a681585cdf3b5bfff7128ea522e8a47750aDevang Patel } 275e253385b108cd946b1ac150302f246d3b218be77Devang Patel 276e253385b108cd946b1ac150302f246d3b218be77Devang Patel // Add pass 277e253385b108cd946b1ac150302f246d3b218be77Devang Patel PassVector.push_back(P); 278e253385b108cd946b1ac150302f246d3b218be77Devang Patel} 279e253385b108cd946b1ac150302f246d3b218be77Devang Patel 28055fd43f90913676682487f89f27c756adb827f66Devang Patel/// BasicBlockPassManager implementation 28155fd43f90913676682487f89f27c756adb827f66Devang Patel 2822c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel/// Add pass P into PassVector and return true. If this pass is not 2832c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel/// manageable by this manager then return false. 28455fd43f90913676682487f89f27c756adb827f66Devang Patelbool 2852c5d1851bbcb20adb79664ec16ab1f97b9142086Devang PatelBasicBlockPassManager_New::addPass(Pass *P) { 28655fd43f90913676682487f89f27c756adb827f66Devang Patel 28755fd43f90913676682487f89f27c756adb827f66Devang Patel BasicBlockPass *BP = dynamic_cast<BasicBlockPass*>(P); 28855fd43f90913676682487f89f27c756adb827f66Devang Patel if (!BP) 28955fd43f90913676682487f89f27c756adb827f66Devang Patel return false; 29055fd43f90913676682487f89f27c756adb827f66Devang Patel 29153596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel // If this pass does not preserve anlysis that is used by other passes 29253596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel // managed by this manager than it is not a suiable pass for this manager. 2932c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel if (!manageablePass(P)) 29453596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel return false; 29553596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel 296e253385b108cd946b1ac150302f246d3b218be77Devang Patel addPassToManager (BP); 29714d6581a7374bdb4a66ef6c30250efdc324f6ddeDevang Patel 29855fd43f90913676682487f89f27c756adb827f66Devang Patel return true; 29955fd43f90913676682487f89f27c756adb827f66Devang Patel} 30055fd43f90913676682487f89f27c756adb827f66Devang Patel 30155fd43f90913676682487f89f27c756adb827f66Devang Patel/// Execute all of the passes scheduled for execution by invoking 30255fd43f90913676682487f89f27c756adb827f66Devang Patel/// runOnBasicBlock method. Keep track of whether any of the passes modifies 30355fd43f90913676682487f89f27c756adb827f66Devang Patel/// the function, and if so, return true. 30455fd43f90913676682487f89f27c756adb827f66Devang Patelbool 30555fd43f90913676682487f89f27c756adb827f66Devang PatelBasicBlockPassManager_New::runOnFunction(Function &F) { 30655fd43f90913676682487f89f27c756adb827f66Devang Patel 30755fd43f90913676682487f89f27c756adb827f66Devang Patel bool Changed = false; 30855fd43f90913676682487f89f27c756adb827f66Devang Patel for (Function::iterator I = F.begin(), E = F.end(); I != E; ++I) 309e253385b108cd946b1ac150302f246d3b218be77Devang Patel for (std::vector<Pass *>::iterator itr = passVectorBegin(), 310e253385b108cd946b1ac150302f246d3b218be77Devang Patel e = passVectorEnd(); itr != e; ++itr) { 31155fd43f90913676682487f89f27c756adb827f66Devang Patel Pass *P = *itr; 31255fd43f90913676682487f89f27c756adb827f66Devang Patel BasicBlockPass *BP = dynamic_cast<BasicBlockPass*>(P); 31355fd43f90913676682487f89f27c756adb827f66Devang Patel Changed |= BP->runOnBasicBlock(*I); 31455fd43f90913676682487f89f27c756adb827f66Devang Patel } 31555fd43f90913676682487f89f27c756adb827f66Devang Patel return Changed; 31655fd43f90913676682487f89f27c756adb827f66Devang Patel} 31755fd43f90913676682487f89f27c756adb827f66Devang Patel 318be6d515f481756ff549f355e32be1ac398e141d5Devang Patel/// Return true IFF AnalysisID AID is currently available. 319be6d515f481756ff549f355e32be1ac398e141d5Devang Patelbool BasicBlockPassManager_New::analysisCurrentlyAvailable(AnalysisID AID) { 320be6d515f481756ff549f355e32be1ac398e141d5Devang Patel return isAnalysisAvailable(AID); 321be6d515f481756ff549f355e32be1ac398e141d5Devang Patel} 322be6d515f481756ff549f355e32be1ac398e141d5Devang Patel 323448d27cd795dc273249f123444509403f4fa4facDevang Patel// FunctionPassManager_New implementation 324c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// Create new Function pass manager 325c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang PatelFunctionPassManager_New::FunctionPassManager_New() { 326c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel FPM = new FunctionPassManagerImpl_New(); 327c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel} 328c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel 329c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// add - Add a pass to the queue of passes to run. This passes 330c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// ownership of the Pass to the PassManager. When the 331c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// PassManager_X is destroyed, the pass will be destroyed as well, so 332c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// there is no need to delete the pass. (TODO delete passes.) 333c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// This implies that all passes MUST be allocated with 'new'. 334c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patelvoid 335c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang PatelFunctionPassManager_New::add(Pass *P) { 336c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel FPM->add(P); 337c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel} 338c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel 339c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// Execute all of the passes scheduled for execution. Keep 340c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// track of whether any of the passes modifies the function, and if 341c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// so, return true. 342c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patelbool 343c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang PatelFunctionPassManager_New::runOnModule(Module &M) { 344c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel return FPM->runOnModule(M); 345c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel} 346c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel 347c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel// FunctionPassManagerImpl_New implementation 348448d27cd795dc273249f123444509403f4fa4facDevang Patel 349448d27cd795dc273249f123444509403f4fa4facDevang Patel// FunctionPassManager 350448d27cd795dc273249f123444509403f4fa4facDevang Patel 351448d27cd795dc273249f123444509403f4fa4facDevang Patel/// Add pass P into the pass manager queue. If P is a BasicBlockPass then 352448d27cd795dc273249f123444509403f4fa4facDevang Patel/// either use it into active basic block pass manager or create new basic 353448d27cd795dc273249f123444509403f4fa4facDevang Patel/// block pass manager to handle pass P. 354448d27cd795dc273249f123444509403f4fa4facDevang Patelbool 355c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang PatelFunctionPassManagerImpl_New::addPass(Pass *P) { 356448d27cd795dc273249f123444509403f4fa4facDevang Patel 357448d27cd795dc273249f123444509403f4fa4facDevang Patel // If P is a BasicBlockPass then use BasicBlockPassManager_New. 358448d27cd795dc273249f123444509403f4fa4facDevang Patel if (BasicBlockPass *BP = dynamic_cast<BasicBlockPass*>(P)) { 359448d27cd795dc273249f123444509403f4fa4facDevang Patel 360448d27cd795dc273249f123444509403f4fa4facDevang Patel if (!activeBBPassManager 361448d27cd795dc273249f123444509403f4fa4facDevang Patel || !activeBBPassManager->addPass(BP)) { 362448d27cd795dc273249f123444509403f4fa4facDevang Patel 363448d27cd795dc273249f123444509403f4fa4facDevang Patel activeBBPassManager = new BasicBlockPassManager_New(); 364893a5a681585cdf3b5bfff7128ea522e8a47750aDevang Patel addPassToManager(activeBBPassManager, false); 3652c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel if (!activeBBPassManager->addPass(BP)) 3662c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel assert(0 && "Unable to add Pass"); 367448d27cd795dc273249f123444509403f4fa4facDevang Patel } 368448d27cd795dc273249f123444509403f4fa4facDevang Patel return true; 369448d27cd795dc273249f123444509403f4fa4facDevang Patel } 370448d27cd795dc273249f123444509403f4fa4facDevang Patel 371448d27cd795dc273249f123444509403f4fa4facDevang Patel FunctionPass *FP = dynamic_cast<FunctionPass *>(P); 372448d27cd795dc273249f123444509403f4fa4facDevang Patel if (!FP) 373448d27cd795dc273249f123444509403f4fa4facDevang Patel return false; 374448d27cd795dc273249f123444509403f4fa4facDevang Patel 37553596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel // If this pass does not preserve anlysis that is used by other passes 37653596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel // managed by this manager than it is not a suiable pass for this manager. 3772c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel if (!manageablePass(P)) 37853596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel return false; 37953596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel 380e253385b108cd946b1ac150302f246d3b218be77Devang Patel addPassToManager (FP); 381448d27cd795dc273249f123444509403f4fa4facDevang Patel activeBBPassManager = NULL; 382448d27cd795dc273249f123444509403f4fa4facDevang Patel return true; 383448d27cd795dc273249f123444509403f4fa4facDevang Patel} 384448d27cd795dc273249f123444509403f4fa4facDevang Patel 385448d27cd795dc273249f123444509403f4fa4facDevang Patel/// Execute all of the passes scheduled for execution by invoking 386448d27cd795dc273249f123444509403f4fa4facDevang Patel/// runOnFunction method. Keep track of whether any of the passes modifies 387448d27cd795dc273249f123444509403f4fa4facDevang Patel/// the function, and if so, return true. 388448d27cd795dc273249f123444509403f4fa4facDevang Patelbool 389c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang PatelFunctionPassManagerImpl_New::runOnModule(Module &M) { 390448d27cd795dc273249f123444509403f4fa4facDevang Patel 391448d27cd795dc273249f123444509403f4fa4facDevang Patel bool Changed = false; 392448d27cd795dc273249f123444509403f4fa4facDevang Patel for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I) 393e253385b108cd946b1ac150302f246d3b218be77Devang Patel for (std::vector<Pass *>::iterator itr = passVectorBegin(), 394e253385b108cd946b1ac150302f246d3b218be77Devang Patel e = passVectorEnd(); itr != e; ++itr) { 395448d27cd795dc273249f123444509403f4fa4facDevang Patel Pass *P = *itr; 396448d27cd795dc273249f123444509403f4fa4facDevang Patel FunctionPass *FP = dynamic_cast<FunctionPass*>(P); 397448d27cd795dc273249f123444509403f4fa4facDevang Patel Changed |= FP->runOnFunction(*I); 398448d27cd795dc273249f123444509403f4fa4facDevang Patel } 399448d27cd795dc273249f123444509403f4fa4facDevang Patel return Changed; 400448d27cd795dc273249f123444509403f4fa4facDevang Patel} 401448d27cd795dc273249f123444509403f4fa4facDevang Patel 402be6d515f481756ff549f355e32be1ac398e141d5Devang Patel/// Return true IFF AnalysisID AID is currently available. 403be6d515f481756ff549f355e32be1ac398e141d5Devang Patelbool FunctionPassManagerImpl_New::analysisCurrentlyAvailable(AnalysisID AID) { 404be6d515f481756ff549f355e32be1ac398e141d5Devang Patel 405be6d515f481756ff549f355e32be1ac398e141d5Devang Patel if (isAnalysisAvailable(AID)) 406be6d515f481756ff549f355e32be1ac398e141d5Devang Patel return true; 407be6d515f481756ff549f355e32be1ac398e141d5Devang Patel 408be6d515f481756ff549f355e32be1ac398e141d5Devang Patel if (activeBBPassManager && 409be6d515f481756ff549f355e32be1ac398e141d5Devang Patel activeBBPassManager->isAnalysisAvailable(AID)) 410be6d515f481756ff549f355e32be1ac398e141d5Devang Patel return true; 411be6d515f481756ff549f355e32be1ac398e141d5Devang Patel 412be6d515f481756ff549f355e32be1ac398e141d5Devang Patel // TODO : Check inactive managers 413be6d515f481756ff549f355e32be1ac398e141d5Devang Patel return false; 414be6d515f481756ff549f355e32be1ac398e141d5Devang Patel} 415448d27cd795dc273249f123444509403f4fa4facDevang Patel 41692c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel// ModulePassManager implementation 41792c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel 41892c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel/// Add P into pass vector if it is manageble. If P is a FunctionPass 419c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// then use FunctionPassManagerImpl_New to manage it. Return false if P 42092c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel/// is not manageable by this manager. 42192c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patelbool 4222c5d1851bbcb20adb79664ec16ab1f97b9142086Devang PatelModulePassManager_New::addPass(Pass *P) { 42392c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel 42492c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel // If P is FunctionPass then use function pass maanager. 42592c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel if (FunctionPass *FP = dynamic_cast<FunctionPass*>(P)) { 42692c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel 42792c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel activeFunctionPassManager = NULL; 42892c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel 42992c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel if (!activeFunctionPassManager 43092c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel || !activeFunctionPassManager->addPass(P)) { 43192c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel 432c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel activeFunctionPassManager = new FunctionPassManagerImpl_New(); 433893a5a681585cdf3b5bfff7128ea522e8a47750aDevang Patel addPassToManager(activeFunctionPassManager, false); 4342c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel if (!activeFunctionPassManager->addPass(FP)) 4352c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel assert(0 && "Unable to add pass"); 43692c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel } 43792c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel return true; 43892c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel } 43992c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel 44092c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel ModulePass *MP = dynamic_cast<ModulePass *>(P); 44192c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel if (!MP) 44292c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel return false; 44392c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel 44453596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel // If this pass does not preserve anlysis that is used by other passes 44553596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel // managed by this manager than it is not a suiable pass for this manager. 4462c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel if (!manageablePass(P)) 44753596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel return false; 44853596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel 449e253385b108cd946b1ac150302f246d3b218be77Devang Patel addPassToManager(MP); 45092c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel activeFunctionPassManager = NULL; 45192c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel return true; 45292c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel} 45392c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel 45492c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel 45592c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel/// Execute all of the passes scheduled for execution by invoking 45692c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel/// runOnModule method. Keep track of whether any of the passes modifies 45792c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel/// the module, and if so, return true. 45892c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patelbool 45992c45eebf77de5d6ee84a3f18f560b83cb68e720Devang PatelModulePassManager_New::runOnModule(Module &M) { 46092c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel bool Changed = false; 461e253385b108cd946b1ac150302f246d3b218be77Devang Patel for (std::vector<Pass *>::iterator itr = passVectorBegin(), 462e253385b108cd946b1ac150302f246d3b218be77Devang Patel e = passVectorEnd(); itr != e; ++itr) { 46392c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel Pass *P = *itr; 46492c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel ModulePass *MP = dynamic_cast<ModulePass*>(P); 46592c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel Changed |= MP->runOnModule(M); 46692c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel } 46792c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel return Changed; 46892c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel} 46992c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel 470be6d515f481756ff549f355e32be1ac398e141d5Devang Patel/// Return true IFF AnalysisID AID is currently available. 471be6d515f481756ff549f355e32be1ac398e141d5Devang Patelbool ModulePassManager_New::analysisCurrentlyAvailable(AnalysisID AID) { 472be6d515f481756ff549f355e32be1ac398e141d5Devang Patel 473be6d515f481756ff549f355e32be1ac398e141d5Devang Patel if (isAnalysisAvailable(AID)) 474be6d515f481756ff549f355e32be1ac398e141d5Devang Patel return true; 475be6d515f481756ff549f355e32be1ac398e141d5Devang Patel 476be6d515f481756ff549f355e32be1ac398e141d5Devang Patel if (activeFunctionPassManager && 477be6d515f481756ff549f355e32be1ac398e141d5Devang Patel activeFunctionPassManager->isAnalysisAvailable(AID)) 478be6d515f481756ff549f355e32be1ac398e141d5Devang Patel return true; 479be6d515f481756ff549f355e32be1ac398e141d5Devang Patel 480be6d515f481756ff549f355e32be1ac398e141d5Devang Patel // TODO : Check inactive managers 481be6d515f481756ff549f355e32be1ac398e141d5Devang Patel return false; 482be6d515f481756ff549f355e32be1ac398e141d5Devang Patel} 483be6d515f481756ff549f355e32be1ac398e141d5Devang Patel 484be6d515f481756ff549f355e32be1ac398e141d5Devang Patel/// Return true IFF AnalysisID AID is currently available. 485be6d515f481756ff549f355e32be1ac398e141d5Devang Patelbool PassManagerImpl_New::analysisCurrentlyAvailable(AnalysisID AID) { 486be6d515f481756ff549f355e32be1ac398e141d5Devang Patel 487be6d515f481756ff549f355e32be1ac398e141d5Devang Patel // TODO : Check inactive managers 488be6d515f481756ff549f355e32be1ac398e141d5Devang Patel return activeManager->analysisCurrentlyAvailable(AID); 489be6d515f481756ff549f355e32be1ac398e141d5Devang Patel} 490be6d515f481756ff549f355e32be1ac398e141d5Devang Patel 491f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel/// Schedule pass P for execution. Make sure that passes required by 492f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel/// P are run before P is run. Update analysis info maintained by 493f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel/// the manager. Remove dead passes. This is a recursive function. 494f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patelvoid PassManagerImpl_New::schedulePass(Pass *P) { 495f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel 496f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel AnalysisUsage AnUsage; 497f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel P->getAnalysisUsage(AnUsage); 498f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel const std::vector<AnalysisID> &RequiredSet = AnUsage.getRequiredSet(); 499f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel for (std::vector<AnalysisID>::const_iterator I = RequiredSet.begin(), 500f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel E = RequiredSet.end(); I != E; ++I) { 501f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel 502be6d515f481756ff549f355e32be1ac398e141d5Devang Patel if (!analysisCurrentlyAvailable(*I)) { 503f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel // Schedule this analysis run first. 504f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel Pass *AP = (*I)->createPass(); 505f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel schedulePass(AP); 506f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel } 507f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel } 508f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel 509f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel addPass(P); 510f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel 511f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel // TODO : Walk through all managers and remove not preserved analysis 512f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel // TODO : remove dead passes 513f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel} 514f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel 515b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel/// Schedule all passes from the queue by adding them in their 516b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel/// respective manager's queue. 517f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patelvoid PassManagerImpl_New::schedulePasses() { 518f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel for (std::vector<Pass *>::iterator I = passVectorBegin(), 519f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel E = passVectorEnd(); I != E; ++I) 520f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel schedulePass (*I); 521b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel} 522b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel 523b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel/// Add pass P to the queue of passes to run. 524f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patelvoid PassManagerImpl_New::add(Pass *P) { 525f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel // Do not process Analysis now. Analysis is process while scheduling 526f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patel // the pass vector. 527fcb2d940a0f0c471069a65c57c48b847d1b6762eDevang Patel addPassToManager(P, false); 528b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel} 529b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel 530b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel// PassManager_New implementation 531b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel/// Add P into active pass manager or use new module pass manager to 532b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel/// manage it. 533f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patelbool PassManagerImpl_New::addPass(Pass *P) { 534b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel 535a363a0bdefd2e798a83acd8998591b5b07c4256eDevang Patel if (!activeManager || !activeManager->addPass(P)) { 536b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel activeManager = new ModulePassManager_New(); 537b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel PassManagers.push_back(activeManager); 538b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel } 539b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel 540b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel return activeManager->addPass(P); 541b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel} 542b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel 543b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel/// run - Execute all of the passes scheduled for execution. Keep track of 544b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel/// whether any of the passes modifies the module, and if so, return true. 545f8af6f0ec15d117cfe47bf32dd4e46ab52d42254Devang Patelbool PassManagerImpl_New::run(Module &M) { 546b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel 547b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel schedulePasses(); 548b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel bool Changed = false; 549b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel for (std::vector<ModulePassManager_New *>::iterator itr = PassManagers.begin(), 550b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel e = PassManagers.end(); itr != e; ++itr) { 551b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel ModulePassManager_New *pm = *itr; 552b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel Changed |= pm->runOnModule(M); 553b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel } 554b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel return Changed; 555b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel} 5565a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel 5575a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel/// Create new pass manager 5585a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang PatelPassManager_New::PassManager_New() { 5595a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel PM = new PassManagerImpl_New(); 5605a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel} 5615a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel 5625a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel/// add - Add a pass to the queue of passes to run. This passes ownership of 5635a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel/// the Pass to the PassManager. When the PassManager is destroyed, the pass 5645a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel/// will be destroyed as well, so there is no need to delete the pass. This 5655a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel/// implies that all passes MUST be allocated with 'new'. 5665a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patelvoid 5675a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang PatelPassManager_New::add(Pass *P) { 5685a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel PM->add(P); 5695a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel} 5705a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel 5715a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel/// run - Execute all of the passes scheduled for execution. Keep track of 5725a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel/// whether any of the passes modifies the module, and if so, return true. 5735a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patelbool 5745a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang PatelPassManager_New::run(Module &M) { 5755a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel return PM->run(M); 5765a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel} 5775a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel 578