[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