[llvm-commits] CVS: llvm/lib/VMCore/PassManager.cpp
Devang Patel
dpatel at apple.com
Tue Jan 16 11:46:26 PST 2007
Changes in directory llvm/lib/VMCore:
PassManager.cpp updated: 1.123 -> 1.124
---
Log message:
Setup pass manager before scheduling required analysis.
---
Diffs of the changes: (+62 -50)
PassManager.cpp | 112 +++++++++++++++++++++++++++++++-------------------------
1 files changed, 62 insertions(+), 50 deletions(-)
Index: llvm/lib/VMCore/PassManager.cpp
diff -u llvm/lib/VMCore/PassManager.cpp:1.123 llvm/lib/VMCore/PassManager.cpp:1.124
--- llvm/lib/VMCore/PassManager.cpp:1.123 Mon Jan 15 20:00:38 2007
+++ llvm/lib/VMCore/PassManager.cpp Tue Jan 16 13:46:09 2007
@@ -366,8 +366,7 @@
/// the manager. Remove dead passes. This is a recursive function.
void PMTopLevelManager::schedulePass(Pass *P) {
- // TODO : Allocate function manager for this pass, other wise required set
- // may be inserted into previous function manager
+ P->setupPassManager(activeStack);
AnalysisUsage AnUsage;
P->getAnalysisUsage(AnUsage);
@@ -1218,47 +1217,55 @@
MPP->add(this);
}
-/// Find appropriate Function Pass Manager or Call Graph Pass Manager
-/// in the PM Stack and add self into that manager.
-void FunctionPass::assignPassManager(PMStack &PMS) {
+/// Setup Pass Manager in advance before checking availability of
+/// required analysis passes.
+void FunctionPass::setupPassManager(PMStack &PMS) {
// Find Module Pass Manager (TODO : Or Call Graph Pass Manager)
while(!PMS.empty()) {
if (PMS.top()->getPassManagerType() > PMT_FunctionPassManager)
PMS.pop();
else
- break;
+ break;
}
- FPPassManager *FPP = dynamic_cast<FPPassManager *>(PMS.top());
- // Create new Function Pass Manager
- if (!FPP) {
- assert(!PMS.empty() && "Unable to create Function Pass Manager");
- PMDataManager *PMD = PMS.top();
+ assert(!PMS.empty() && "Unable to create Function Pass Manager");
- // [1] Create new Function Pass Manager
- FPP = new FPPassManager(PMD->getDepth() + 1);
-
- // [2] Set up new manager's top level manager
- PMTopLevelManager *TPM = PMD->getTopLevelManager();
- TPM->addIndirectPassManager(FPP);
+ if (PMS.top()->getPassManagerType() == PMT_FunctionPassManager
+ || PMS.top()->getPassManagerType() == PMT_CallGraphPassManager)
+ return;
+
+ PMDataManager *PMD = PMS.top();
+
+ // [1] Create new Function Pass Manager
+ FPPassManager *FPP = new FPPassManager(PMD->getDepth() + 1);
+
+ // [2] Set up new manager's top level manager
+ PMTopLevelManager *TPM = PMD->getTopLevelManager();
+ TPM->addIndirectPassManager(FPP);
+
+ // [3] Assign manager to manage this new manager. This may create
+ // and push new managers into PMS
+ Pass *P = dynamic_cast<Pass *>(FPP);
+ P->assignPassManager(PMS);
+
+ // [4] Push new manager into PMS
+ PMS.push(FPP);
+}
- // [3] Assign manager to manage this new manager. This may create
- // and push new managers into PMS
- Pass *P = dynamic_cast<Pass *>(FPP);
- P->assignPassManager(PMS);
+/// Find appropriate Function Pass Manager or Call Graph Pass Manager
+/// in the PM Stack and add self into that manager.
+void FunctionPass::assignPassManager(PMStack &PMS) {
- // [4] Push new manager into PMS
- PMS.push(FPP);
- }
+ PMDataManager *PMD = dynamic_cast<PMDataManager *>(PMS.top());
+ assert(PMD && "Unable to assign Pass Manager");
- // Assign FPP as the manager of this pass.
- FPP->add(this);
+ PMD->add(this);
}
-/// Find appropriate Basic Pass Manager or Call Graph Pass Manager
-/// in the PM Stack and add self into that manager.
-void BasicBlockPass::assignPassManager(PMStack &PMS) {
+/// Setup Pass Manager in advance before checking availability of
+/// required analysis passes.
+void BasicBlockPass::setupPassManager(PMStack &PMS) {
BBPassManager *BBP = NULL;
@@ -1268,32 +1275,37 @@
BBP = dynamic_cast<BBPassManager *>(PMS.top());
}
- // If leaf manager is not Basic Block Pass manager then create new
- // basic Block Pass manager.
-
- if (!BBP) {
- assert(!PMS.empty() && "Unable to create BasicBlock Pass Manager");
- PMDataManager *PMD = PMS.top();
-
- // [1] Create new Basic Block Manager
- BBP = new BBPassManager(PMD->getDepth() + 1);
-
- // [2] Set up new manager's top level manager
- // Basic Block Pass Manager does not live by itself
- PMTopLevelManager *TPM = PMD->getTopLevelManager();
- TPM->addIndirectPassManager(BBP);
+ if (BBP)
+ return;
+ assert(!PMS.empty() && "Unable to create BasicBlock Pass Manager");
+ PMDataManager *PMD = PMS.top();
+
+ // [1] Create new Basic Block Manager
+ BBP = new BBPassManager(PMD->getDepth() + 1);
+
+ // [2] Set up new manager's top level manager
+ // Basic Block Pass Manager does not live by itself
+ PMTopLevelManager *TPM = PMD->getTopLevelManager();
+ TPM->addIndirectPassManager(BBP);
+
// [3] Assign manager to manage this new manager. This may create
// and push new managers into PMS
- Pass *P = dynamic_cast<Pass *>(BBP);
- P->assignPassManager(PMS);
+ Pass *P = dynamic_cast<Pass *>(BBP);
+ P->assignPassManager(PMS);
+
+ // [4] Push new manager into PMS
+ PMS.push(BBP);
+}
- // [4] Push new manager into PMS
- PMS.push(BBP);
- }
+/// Find appropriate Basic Pass Manager or Call Graph Pass Manager
+/// in the PM Stack and add self into that manager.
+void BasicBlockPass::assignPassManager(PMStack &PMS) {
+
+ PMDataManager *PMD = dynamic_cast<PMDataManager *>(PMS.top());
+ assert(PMD && "Unable to assign Pass Manager");
- // Assign BBP as the manager of this pass.
- BBP->add(this);
+ PMD->add(this);
}
More information about the llvm-commits
mailing list