Changes in directory llvm/lib/VMCore:
PassManager.cpp updated: 1.46 -> 1.47 --- Log message: Reimplement schedulePass interface. Move it into PMTopLevelManager. --- Diffs of the changes: (+28 -51) PassManager.cpp | 79 +++++++++++++++++++------------------------------------- 1 files changed, 28 insertions(+), 51 deletions(-) Index: llvm/lib/VMCore/PassManager.cpp diff -u llvm/lib/VMCore/PassManager.cpp:1.46 llvm/lib/VMCore/PassManager.cpp:1.47 --- llvm/lib/VMCore/PassManager.cpp:1.46 Thu Dec 7 15:02:08 2006 +++ llvm/lib/VMCore/PassManager.cpp Thu Dec 7 15:10:57 2006 @@ -173,6 +173,33 @@ LastUses.push_back(LUI->first); } +/// Schedule pass P for execution. Make sure that passes required by +/// P are run before P is run. Update analysis info maintained by +/// the manager. Remove dead passes. This is a recursive function. +void PMTopLevelManager::schedulePass(Pass *P, Pass *PM) { + + // TODO : Allocate function manager for this pass, other wise required set + // may be inserted into previous function manager + + AnalysisUsage AnUsage; + P->getAnalysisUsage(AnUsage); + const std::vector<AnalysisID> &RequiredSet = AnUsage.getRequiredSet(); + for (std::vector<AnalysisID>::const_iterator I = RequiredSet.begin(), + E = RequiredSet.end(); I != E; ++I) { + + Pass *AnalysisPass = NULL; // FIXME PM->getAnalysisPass(*I, true); + if (!AnalysisPass) { + // Schedule this analysis run first. + AnalysisPass = (*I)->createPass(); + schedulePass(AnalysisPass, PM); + } + } + + // Now all required passes are available. + addTopLevelPass(P); +} + + //===----------------------------------------------------------------------===// // PMDataManager @@ -399,18 +426,9 @@ private: - /// Add a pass into a passmanager queue. This is used by schedulePasses + /// Add a pass into a passmanager queue. bool addPass(Pass *p); - /// Schedule pass P for execution. Make sure that passes required by - /// P are run before P is run. Update analysis info maintained by - /// the manager. Remove dead passes. This is a recursive function. - void schedulePass(Pass *P); - - /// Schedule all passes collected in pass queue using add(). Add all the - /// schedule passes into various manager's queue using addPass(). - void schedulePasses(); - // Collection of pass managers std::vector<ModulePassManager_New *> PassManagers; @@ -842,46 +860,6 @@ return P; } -/// Schedule pass P for execution. Make sure that passes required by -/// P are run before P is run. Update analysis info maintained by -/// the manager. Remove dead passes. This is a recursive function. -void PassManagerImpl_New::schedulePass(Pass *P) { - - AnalysisUsage AnUsage; - P->getAnalysisUsage(AnUsage); - const std::vector<AnalysisID> &RequiredSet = AnUsage.getRequiredSet(); - for (std::vector<AnalysisID>::const_iterator I = RequiredSet.begin(), - E = RequiredSet.end(); I != E; ++I) { - - Pass *AnalysisPass = getAnalysisPassFromManager(*I); - if (!AnalysisPass) { - // Schedule this analysis run first. - AnalysisPass = (*I)->createPass(); - schedulePass(AnalysisPass); - } - setLastUser (AnalysisPass, P); - - // Prolong live range of analyses that are needed after an analysis pass - // is destroyed, for querying by subsequent passes - const std::vector<AnalysisID> &IDs = AnUsage.getRequiredTransitiveSet(); - for (std::vector<AnalysisID>::const_iterator I = IDs.begin(), - E = IDs.end(); I != E; ++I) { - Pass *AP = getAnalysisPassFromManager(*I); - assert (AP && "Analysis pass is not available"); - setLastUser(AP, P); - } - } - addPass(P); -} - -/// Schedule all passes from the queue by adding them in their -/// respective manager's queue. -void PassManagerImpl_New::schedulePasses() { - for (std::vector<Pass *>::iterator I = passVectorBegin(), - E = passVectorEnd(); I != E; ++I) - schedulePass (*I); -} - /// Add pass P to the queue of passes to run. void PassManagerImpl_New::add(Pass *P) { // Do not process Analysis now. Analysis is process while scheduling @@ -906,7 +884,6 @@ /// whether any of the passes modifies the module, and if so, return true. bool PassManagerImpl_New::run(Module &M) { - schedulePasses(); bool Changed = false; for (std::vector<ModulePassManager_New *>::iterator itr = PassManagers.begin(), e = PassManagers.end(); itr != e; ++itr) { _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits