PassManager.cpp revision c63592b19ecd54a1318a19d87b5c0bd85f172a4f
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" 1755fd43f90913676682487f89f27c756adb827f66Devang Patel 1855fd43f90913676682487f89f27c756adb827f66Devang Patelusing namespace llvm; 1955fd43f90913676682487f89f27c756adb827f66Devang Patel 20c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patelnamespace llvm { 21c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel 22c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel/// BasicBlockPassManager_New manages BasicBlockPass. It batches all the 23c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel/// pass together and sequence them to process one basic block before 24c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel/// processing next basic block. 25c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patelclass BasicBlockPassManager_New : public Pass, 26c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel public PassManagerAnalysisHelper { 27c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel 28c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patelpublic: 29c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel BasicBlockPassManager_New() { } 30c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel 31c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel /// Add a pass into a passmanager queue. 32c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel bool addPass(Pass *p); 33c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel 34c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel /// Execute all of the passes scheduled for execution. Keep track of 35c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel /// whether any of the passes modifies the function, and if so, return true. 36c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel bool runOnFunction(Function &F); 37c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel 38c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patelprivate: 39c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel // Collection of pass that are managed by this manager 40c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel std::vector<Pass *> PassVector; 41c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel}; 42c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel 43c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// FunctionPassManagerImpl_New manages FunctionPasses and BasicBlockPassManagers. 44c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel/// It batches all function passes and basic block pass managers together and 45c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel/// sequence them to process one function at a time before processing next 46c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel/// function. 47c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patelclass FunctionPassManagerImpl_New : public Pass, 48c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel public PassManagerAnalysisHelper { 49c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patelpublic: 50c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel FunctionPassManagerImpl_New(ModuleProvider *P) { /* TODO */ } 51c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel FunctionPassManagerImpl_New() { 52c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel activeBBPassManager = NULL; 53c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel } 54c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel ~FunctionPassManagerImpl_New() { /* TODO */ }; 55c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel 56c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel /// add - Add a pass to the queue of passes to run. This passes 57c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel /// ownership of the Pass to the PassManager. When the 58c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel /// PassManager_X is destroyed, the pass will be destroyed as well, so 59c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel /// there is no need to delete the pass. (TODO delete passes.) 60c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel /// This implies that all passes MUST be allocated with 'new'. 61c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel void add(Pass *P) { /* TODO*/ } 62c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel 63c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel /// Add pass into the pass manager queue. 64c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel bool addPass(Pass *P); 65c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel 66c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel /// Execute all of the passes scheduled for execution. Keep 67c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel /// track of whether any of the passes modifies the function, and if 68c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel /// so, return true. 69c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel bool runOnModule(Module &M); 70c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel 71c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patelprivate: 72c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel // Collection of pass that are manged by this manager 73c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel std::vector<Pass *> PassVector; 74c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel 75c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel // Active Pass Managers 76c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel BasicBlockPassManager_New *activeBBPassManager; 77c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel}; 78c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel 79c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel/// ModulePassManager_New manages ModulePasses and function pass managers. 80c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel/// It batches all Module passes passes and function pass managers together and 81c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel/// sequence them to process one module. 82c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patelclass ModulePassManager_New : public Pass, 83c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel public PassManagerAnalysisHelper { 84c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel 85c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patelpublic: 86c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel ModulePassManager_New() { activeFunctionPassManager = NULL; } 87c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel 88c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel /// Add a pass into a passmanager queue. 89c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel bool addPass(Pass *p); 90c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel 91c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel /// run - Execute all of the passes scheduled for execution. Keep track of 92c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel /// whether any of the passes modifies the module, and if so, return true. 93c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel bool runOnModule(Module &M); 94c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel 95c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patelprivate: 96c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel // Collection of pass that are managed by this manager 97c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel std::vector<Pass *> PassVector; 98c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel 99c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel // Active Pass Manager 100c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel FunctionPassManagerImpl_New *activeFunctionPassManager; 101c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel}; 102c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel 1035a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel/// PassManager_New manages ModulePassManagers 1045a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patelclass PassManagerImpl_New : public Pass, 1055a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel public PassManagerAnalysisHelper { 1065a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel 1075a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patelpublic: 1085a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel 1095a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel /// add - Add a pass to the queue of passes to run. This passes ownership of 1105a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel /// the Pass to the PassManager. When the PassManager is destroyed, the pass 1115a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel /// will be destroyed as well, so there is no need to delete the pass. This 1125a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel /// implies that all passes MUST be allocated with 'new'. 1135a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel void add(Pass *P); 1145a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel 1155a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel /// run - Execute all of the passes scheduled for execution. Keep track of 1165a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel /// whether any of the passes modifies the module, and if so, return true. 1175a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel bool run(Module &M); 1185a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel 1195a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patelprivate: 1205a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel 1215a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel /// Add a pass into a passmanager queue. This is used by schedulePasses 1225a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel bool addPass(Pass *p); 1235a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel 1245a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel /// Schedule all passes collected in pass queue using add(). Add all the 1255a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel /// schedule passes into various manager's queue using addPass(). 1265a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel void schedulePasses(); 1275a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel 1285a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel // Collection of pass managers 1295a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel std::vector<ModulePassManager_New *> PassManagers; 1305a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel 1315a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel // Collection of pass that are not yet scheduled 1325a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel std::vector<Pass *> PassVector; 1335a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel 1345a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel // Active Pass Manager 1355a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel ModulePassManager_New *activeManager; 1365a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel}; 1375a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel 138c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel} // End of llvm namespace 139c67c938de2097f26dba71d9436e4707dd8a5012dDevang Patel 140889739c4d188d28c167644bced9df0f3131317d7Devang Patel// PassManagerAnalysisHelper implementation 141889739c4d188d28c167644bced9df0f3131317d7Devang Patel 1422c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel/// Return true IFF pass P's required analysis set does not required new 143889739c4d188d28c167644bced9df0f3131317d7Devang Patel/// manager. 144889739c4d188d28c167644bced9df0f3131317d7Devang Patelbool PassManagerAnalysisHelper::manageablePass(Pass *P) { 145889739c4d188d28c167644bced9df0f3131317d7Devang Patel 146889739c4d188d28c167644bced9df0f3131317d7Devang Patel AnalysisUsage AnUsage; 147889739c4d188d28c167644bced9df0f3131317d7Devang Patel P->getAnalysisUsage(AnUsage); 148889739c4d188d28c167644bced9df0f3131317d7Devang Patel 149889739c4d188d28c167644bced9df0f3131317d7Devang Patel // If this pass is not preserving information that is required by the other passes 150889739c4d188d28c167644bced9df0f3131317d7Devang Patel // managed by this manager then use new manager 151889739c4d188d28c167644bced9df0f3131317d7Devang Patel // TODO 152889739c4d188d28c167644bced9df0f3131317d7Devang Patel return true; 153889739c4d188d28c167644bced9df0f3131317d7Devang Patel} 154889739c4d188d28c167644bced9df0f3131317d7Devang Patel 1552c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel/// Return true IFF AnalysisID AID is currently available. 156889739c4d188d28c167644bced9df0f3131317d7Devang Patelbool PassManagerAnalysisHelper::analysisCurrentlyAvailable(AnalysisID AID) { 157889739c4d188d28c167644bced9df0f3131317d7Devang Patel 158889739c4d188d28c167644bced9df0f3131317d7Devang Patel // TODO 159889739c4d188d28c167644bced9df0f3131317d7Devang Patel return false; 160889739c4d188d28c167644bced9df0f3131317d7Devang Patel} 161889739c4d188d28c167644bced9df0f3131317d7Devang Patel 162889739c4d188d28c167644bced9df0f3131317d7Devang Patel/// Augment RequiredSet by adding analysis required by pass P. 163889739c4d188d28c167644bced9df0f3131317d7Devang Patelvoid PassManagerAnalysisHelper::noteDownRequiredAnalysis(Pass *P) { 164889739c4d188d28c167644bced9df0f3131317d7Devang Patel 165889739c4d188d28c167644bced9df0f3131317d7Devang Patel // TODO 166889739c4d188d28c167644bced9df0f3131317d7Devang Patel} 167889739c4d188d28c167644bced9df0f3131317d7Devang Patel 168889739c4d188d28c167644bced9df0f3131317d7Devang Patel/// Remove AnalysisID from the RequiredSet 169889739c4d188d28c167644bced9df0f3131317d7Devang Patelvoid PassManagerAnalysisHelper::removeAnalysis(AnalysisID AID) { 170889739c4d188d28c167644bced9df0f3131317d7Devang Patel 171889739c4d188d28c167644bced9df0f3131317d7Devang Patel // TODO 172889739c4d188d28c167644bced9df0f3131317d7Devang Patel} 173889739c4d188d28c167644bced9df0f3131317d7Devang Patel 174889739c4d188d28c167644bced9df0f3131317d7Devang Patel/// Remove Analyss not preserved by Pass P 175889739c4d188d28c167644bced9df0f3131317d7Devang Patelvoid PassManagerAnalysisHelper::removeNotPreservedAnalysis(Pass *P) { 176889739c4d188d28c167644bced9df0f3131317d7Devang Patel 177889739c4d188d28c167644bced9df0f3131317d7Devang Patel // TODO 178889739c4d188d28c167644bced9df0f3131317d7Devang Patel} 179889739c4d188d28c167644bced9df0f3131317d7Devang Patel 18055fd43f90913676682487f89f27c756adb827f66Devang Patel/// BasicBlockPassManager implementation 18155fd43f90913676682487f89f27c756adb827f66Devang Patel 1822c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel/// Add pass P into PassVector and return true. If this pass is not 1832c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel/// manageable by this manager then return false. 18455fd43f90913676682487f89f27c756adb827f66Devang Patelbool 1852c5d1851bbcb20adb79664ec16ab1f97b9142086Devang PatelBasicBlockPassManager_New::addPass(Pass *P) { 18655fd43f90913676682487f89f27c756adb827f66Devang Patel 18755fd43f90913676682487f89f27c756adb827f66Devang Patel BasicBlockPass *BP = dynamic_cast<BasicBlockPass*>(P); 18855fd43f90913676682487f89f27c756adb827f66Devang Patel if (!BP) 18955fd43f90913676682487f89f27c756adb827f66Devang Patel return false; 19055fd43f90913676682487f89f27c756adb827f66Devang Patel 19153596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel // If this pass does not preserve anlysis that is used by other passes 19253596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel // managed by this manager than it is not a suiable pass for this manager. 1932c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel if (!manageablePass(P)) 19453596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel return false; 19553596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel 19653596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel // Take a note of analysis required by this pass. 19753596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel noteDownRequiredAnalysis(P); 19855fd43f90913676682487f89f27c756adb827f66Devang Patel 19955fd43f90913676682487f89f27c756adb827f66Devang Patel // Add pass 20055fd43f90913676682487f89f27c756adb827f66Devang Patel PassVector.push_back(BP); 20155fd43f90913676682487f89f27c756adb827f66Devang Patel return true; 20255fd43f90913676682487f89f27c756adb827f66Devang Patel} 20355fd43f90913676682487f89f27c756adb827f66Devang Patel 20455fd43f90913676682487f89f27c756adb827f66Devang Patel/// Execute all of the passes scheduled for execution by invoking 20555fd43f90913676682487f89f27c756adb827f66Devang Patel/// runOnBasicBlock method. Keep track of whether any of the passes modifies 20655fd43f90913676682487f89f27c756adb827f66Devang Patel/// the function, and if so, return true. 20755fd43f90913676682487f89f27c756adb827f66Devang Patelbool 20855fd43f90913676682487f89f27c756adb827f66Devang PatelBasicBlockPassManager_New::runOnFunction(Function &F) { 20955fd43f90913676682487f89f27c756adb827f66Devang Patel 21055fd43f90913676682487f89f27c756adb827f66Devang Patel bool Changed = false; 21155fd43f90913676682487f89f27c756adb827f66Devang Patel for (Function::iterator I = F.begin(), E = F.end(); I != E; ++I) 21255fd43f90913676682487f89f27c756adb827f66Devang Patel for (std::vector<Pass *>::iterator itr = PassVector.begin(), 21355fd43f90913676682487f89f27c756adb827f66Devang Patel e = PassVector.end(); itr != e; ++itr) { 21455fd43f90913676682487f89f27c756adb827f66Devang Patel Pass *P = *itr; 21555fd43f90913676682487f89f27c756adb827f66Devang Patel BasicBlockPass *BP = dynamic_cast<BasicBlockPass*>(P); 21655fd43f90913676682487f89f27c756adb827f66Devang Patel Changed |= BP->runOnBasicBlock(*I); 21755fd43f90913676682487f89f27c756adb827f66Devang Patel } 21855fd43f90913676682487f89f27c756adb827f66Devang Patel return Changed; 21955fd43f90913676682487f89f27c756adb827f66Devang Patel} 22055fd43f90913676682487f89f27c756adb827f66Devang Patel 221448d27cd795dc273249f123444509403f4fa4facDevang Patel// FunctionPassManager_New implementation 222c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// Create new Function pass manager 223c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang PatelFunctionPassManager_New::FunctionPassManager_New() { 224c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel FPM = new FunctionPassManagerImpl_New(); 225c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel} 226c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel 227c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// add - Add a pass to the queue of passes to run. This passes 228c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// ownership of the Pass to the PassManager. When the 229c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// PassManager_X is destroyed, the pass will be destroyed as well, so 230c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// there is no need to delete the pass. (TODO delete passes.) 231c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// This implies that all passes MUST be allocated with 'new'. 232c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patelvoid 233c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang PatelFunctionPassManager_New::add(Pass *P) { 234c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel FPM->add(P); 235c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel} 236c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel 237c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// Execute all of the passes scheduled for execution. Keep 238c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// track of whether any of the passes modifies the function, and if 239c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// so, return true. 240c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patelbool 241c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang PatelFunctionPassManager_New::runOnModule(Module &M) { 242c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel return FPM->runOnModule(M); 243c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel} 244c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel 245c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel// FunctionPassManagerImpl_New implementation 246448d27cd795dc273249f123444509403f4fa4facDevang Patel 247448d27cd795dc273249f123444509403f4fa4facDevang Patel// FunctionPassManager 248448d27cd795dc273249f123444509403f4fa4facDevang Patel 249448d27cd795dc273249f123444509403f4fa4facDevang Patel/// Add pass P into the pass manager queue. If P is a BasicBlockPass then 250448d27cd795dc273249f123444509403f4fa4facDevang Patel/// either use it into active basic block pass manager or create new basic 251448d27cd795dc273249f123444509403f4fa4facDevang Patel/// block pass manager to handle pass P. 252448d27cd795dc273249f123444509403f4fa4facDevang Patelbool 253c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang PatelFunctionPassManagerImpl_New::addPass(Pass *P) { 254448d27cd795dc273249f123444509403f4fa4facDevang Patel 255448d27cd795dc273249f123444509403f4fa4facDevang Patel // If P is a BasicBlockPass then use BasicBlockPassManager_New. 256448d27cd795dc273249f123444509403f4fa4facDevang Patel if (BasicBlockPass *BP = dynamic_cast<BasicBlockPass*>(P)) { 257448d27cd795dc273249f123444509403f4fa4facDevang Patel 258448d27cd795dc273249f123444509403f4fa4facDevang Patel if (!activeBBPassManager 259448d27cd795dc273249f123444509403f4fa4facDevang Patel || !activeBBPassManager->addPass(BP)) { 260448d27cd795dc273249f123444509403f4fa4facDevang Patel 261448d27cd795dc273249f123444509403f4fa4facDevang Patel activeBBPassManager = new BasicBlockPassManager_New(); 262448d27cd795dc273249f123444509403f4fa4facDevang Patel 263448d27cd795dc273249f123444509403f4fa4facDevang Patel PassVector.push_back(activeBBPassManager); 2642c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel if (!activeBBPassManager->addPass(BP)) 2652c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel assert(0 && "Unable to add Pass"); 266448d27cd795dc273249f123444509403f4fa4facDevang Patel } 267448d27cd795dc273249f123444509403f4fa4facDevang Patel return true; 268448d27cd795dc273249f123444509403f4fa4facDevang Patel } 269448d27cd795dc273249f123444509403f4fa4facDevang Patel 270448d27cd795dc273249f123444509403f4fa4facDevang Patel FunctionPass *FP = dynamic_cast<FunctionPass *>(P); 271448d27cd795dc273249f123444509403f4fa4facDevang Patel if (!FP) 272448d27cd795dc273249f123444509403f4fa4facDevang Patel return false; 273448d27cd795dc273249f123444509403f4fa4facDevang Patel 27453596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel // If this pass does not preserve anlysis that is used by other passes 27553596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel // managed by this manager than it is not a suiable pass for this manager. 2762c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel if (!manageablePass(P)) 27753596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel return false; 27853596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel 27953596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel // Take a note of analysis required by this pass. 28053596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel noteDownRequiredAnalysis(P); 281448d27cd795dc273249f123444509403f4fa4facDevang Patel 282448d27cd795dc273249f123444509403f4fa4facDevang Patel PassVector.push_back(FP); 283448d27cd795dc273249f123444509403f4fa4facDevang Patel activeBBPassManager = NULL; 284448d27cd795dc273249f123444509403f4fa4facDevang Patel return true; 285448d27cd795dc273249f123444509403f4fa4facDevang Patel} 286448d27cd795dc273249f123444509403f4fa4facDevang Patel 287448d27cd795dc273249f123444509403f4fa4facDevang Patel/// Execute all of the passes scheduled for execution by invoking 288448d27cd795dc273249f123444509403f4fa4facDevang Patel/// runOnFunction method. Keep track of whether any of the passes modifies 289448d27cd795dc273249f123444509403f4fa4facDevang Patel/// the function, and if so, return true. 290448d27cd795dc273249f123444509403f4fa4facDevang Patelbool 291c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang PatelFunctionPassManagerImpl_New::runOnModule(Module &M) { 292448d27cd795dc273249f123444509403f4fa4facDevang Patel 293448d27cd795dc273249f123444509403f4fa4facDevang Patel bool Changed = false; 294448d27cd795dc273249f123444509403f4fa4facDevang Patel for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I) 295448d27cd795dc273249f123444509403f4fa4facDevang Patel for (std::vector<Pass *>::iterator itr = PassVector.begin(), 296448d27cd795dc273249f123444509403f4fa4facDevang Patel e = PassVector.end(); itr != e; ++itr) { 297448d27cd795dc273249f123444509403f4fa4facDevang Patel Pass *P = *itr; 298448d27cd795dc273249f123444509403f4fa4facDevang Patel FunctionPass *FP = dynamic_cast<FunctionPass*>(P); 299448d27cd795dc273249f123444509403f4fa4facDevang Patel Changed |= FP->runOnFunction(*I); 300448d27cd795dc273249f123444509403f4fa4facDevang Patel } 301448d27cd795dc273249f123444509403f4fa4facDevang Patel return Changed; 302448d27cd795dc273249f123444509403f4fa4facDevang Patel} 303448d27cd795dc273249f123444509403f4fa4facDevang Patel 304448d27cd795dc273249f123444509403f4fa4facDevang Patel 30592c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel// ModulePassManager implementation 30692c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel 30792c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel/// Add P into pass vector if it is manageble. If P is a FunctionPass 308c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel/// then use FunctionPassManagerImpl_New to manage it. Return false if P 30992c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel/// is not manageable by this manager. 31092c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patelbool 3112c5d1851bbcb20adb79664ec16ab1f97b9142086Devang PatelModulePassManager_New::addPass(Pass *P) { 31292c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel 31392c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel // If P is FunctionPass then use function pass maanager. 31492c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel if (FunctionPass *FP = dynamic_cast<FunctionPass*>(P)) { 31592c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel 31692c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel activeFunctionPassManager = NULL; 31792c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel 31892c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel if (!activeFunctionPassManager 31992c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel || !activeFunctionPassManager->addPass(P)) { 32092c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel 321c63592b19ecd54a1318a19d87b5c0bd85f172a4fDevang Patel activeFunctionPassManager = new FunctionPassManagerImpl_New(); 32292c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel 32392c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel PassVector.push_back(activeFunctionPassManager); 3242c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel if (!activeFunctionPassManager->addPass(FP)) 3252c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel assert(0 && "Unable to add pass"); 32692c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel } 32792c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel return true; 32892c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel } 32992c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel 33092c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel ModulePass *MP = dynamic_cast<ModulePass *>(P); 33192c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel if (!MP) 33292c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel return false; 33392c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel 33453596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel // If this pass does not preserve anlysis that is used by other passes 33553596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel // managed by this manager than it is not a suiable pass for this manager. 3362c5d1851bbcb20adb79664ec16ab1f97b9142086Devang Patel if (!manageablePass(P)) 33753596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel return false; 33853596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel 33953596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel // Take a note of analysis required by this pass. 34053596b6ba5d3199621e5a6e0cdbfcde3ee710397Devang Patel noteDownRequiredAnalysis(P); 34192c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel 34292c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel PassVector.push_back(MP); 34392c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel activeFunctionPassManager = NULL; 34492c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel return true; 34592c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel} 34692c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel 34792c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel 34892c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel/// Execute all of the passes scheduled for execution by invoking 34992c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel/// runOnModule method. Keep track of whether any of the passes modifies 35092c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel/// the module, and if so, return true. 35192c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patelbool 35292c45eebf77de5d6ee84a3f18f560b83cb68e720Devang PatelModulePassManager_New::runOnModule(Module &M) { 35392c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel bool Changed = false; 35492c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel for (std::vector<Pass *>::iterator itr = PassVector.begin(), 35592c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel e = PassVector.end(); itr != e; ++itr) { 35692c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel Pass *P = *itr; 35792c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel ModulePass *MP = dynamic_cast<ModulePass*>(P); 35892c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel Changed |= MP->runOnModule(M); 35992c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel } 36092c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel return Changed; 36192c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel} 36292c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel 363b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel/// Schedule all passes from the queue by adding them in their 364b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel/// respective manager's queue. 365b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patelvoid 3665a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang PatelPassManagerImpl_New::schedulePasses() { 367b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel /* TODO */ 368b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel} 369b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel 370b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel/// Add pass P to the queue of passes to run. 371b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patelvoid 3725a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang PatelPassManagerImpl_New::add(Pass *P) { 373b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel /* TODO */ 374b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel} 375b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel 376b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel// PassManager_New implementation 377b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel/// Add P into active pass manager or use new module pass manager to 378b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel/// manage it. 379b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patelbool 3805a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang PatelPassManagerImpl_New::addPass(Pass *P) { 381b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel 382b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel if (!activeManager) { 383b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel activeManager = new ModulePassManager_New(); 384b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel PassManagers.push_back(activeManager); 385b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel } 386b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel 387b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel return activeManager->addPass(P); 388b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel} 389b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel 390b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel/// run - Execute all of the passes scheduled for execution. Keep track of 391b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel/// whether any of the passes modifies the module, and if so, return true. 392b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patelbool 3935a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang PatelPassManagerImpl_New::run(Module &M) { 394b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel 395b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel schedulePasses(); 396b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel bool Changed = false; 397b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel for (std::vector<ModulePassManager_New *>::iterator itr = PassManagers.begin(), 398b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel e = PassManagers.end(); itr != e; ++itr) { 399b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel ModulePassManager_New *pm = *itr; 400b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel Changed |= pm->runOnModule(M); 401b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel } 402b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel return Changed; 403b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel} 4045a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel 4055a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel/// Create new pass manager 4065a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang PatelPassManager_New::PassManager_New() { 4075a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel PM = new PassManagerImpl_New(); 4085a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel} 4095a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel 4105a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel/// add - Add a pass to the queue of passes to run. This passes ownership of 4115a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel/// the Pass to the PassManager. When the PassManager is destroyed, the pass 4125a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel/// will be destroyed as well, so there is no need to delete the pass. This 4135a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel/// implies that all passes MUST be allocated with 'new'. 4145a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patelvoid 4155a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang PatelPassManager_New::add(Pass *P) { 4165a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel PM->add(P); 4175a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel} 4185a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel 4195a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel/// run - Execute all of the passes scheduled for execution. Keep track of 4205a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel/// whether any of the passes modifies the module, and if so, return true. 4215a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patelbool 4225a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang PatelPassManager_New::run(Module &M) { 4235a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel return PM->run(M); 4245a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel} 4255a39b2e8067450839a1a041a26e2f9d8dd07f40aDevang Patel 426