[llvm-commits] CVS: llvm/lib/VMCore/PassManager.cpp

Devang Patel dpatel at apple.com
Thu Dec 7 15:55:25 PST 2006



Changes in directory llvm/lib/VMCore:

PassManager.cpp updated: 1.56 -> 1.57
---
Log message:

set Last User.


---
Diffs of the changes:  (+49 -5)

 PassManager.cpp |   54 +++++++++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 49 insertions(+), 5 deletions(-)


Index: llvm/lib/VMCore/PassManager.cpp
diff -u llvm/lib/VMCore/PassManager.cpp:1.56 llvm/lib/VMCore/PassManager.cpp:1.57
--- llvm/lib/VMCore/PassManager.cpp:1.56	Thu Dec  7 17:24:58 2006
+++ llvm/lib/VMCore/PassManager.cpp	Thu Dec  7 17:55:10 2006
@@ -243,6 +243,7 @@
 
   /// Initialize available analysis information.
   void initializeAnalysisInfo() { 
+    ForcedLastUses.clear();
     AvailableAnalysis.clear();
 
     // Include immutable passes into AvailableAnalysis vector.
@@ -277,6 +278,17 @@
 
   unsigned getDepth() { return Depth; }
 
+protected:
+
+  // Collection of pass whose last user asked this manager to claim
+  // last use. If a FunctionPass F is the last user of ModulePass info M
+  // then the F's manager, not F, records itself as a last user of M.
+  std::vector<Pass *> ForcedLastUses;
+
+  // Top level manager.
+  // TODO : Make it a reference.
+  PMTopLevelManager *TPM;
+
 private:
   // Set of available Analysis. This information is used while scheduling 
   // pass. If a pass requires an analysis which is not not available then 
@@ -287,10 +299,6 @@
   // Collection of pass that are managed by this manager
   std::vector<Pass *> PassVector;
 
-  // Top level manager.
-  // TODO : Make it a reference.
-  PMTopLevelManager *TPM;
-
   unsigned Depth;
 };
 
@@ -384,7 +392,8 @@
 /// ModulePassManager_New manages ModulePasses and function pass managers.
 /// It batches all Module passes  passes and function pass managers together and
 /// sequence them to process one module.
-class ModulePassManager_New : public PMDataManager {
+class ModulePassManager_New : public Pass,
+                              public PMDataManager {
  
 public:
   ModulePassManager_New(int D) : PMDataManager(D) { 
@@ -522,6 +531,33 @@
                                      bool ProcessAnalysis) {
 
   if (ProcessAnalysis) {
+
+    // At the moment, this pass is the last user of all required passes.
+    std::vector<Pass *> LastUses;
+    std::vector<Pass *> RequiredPasses;
+    unsigned PDepth = this->getDepth();
+
+    collectRequiredAnalysisPasses(RequiredPasses, P);
+    for (std::vector<Pass *>::iterator I = RequiredPasses.begin(),
+           E = RequiredPasses.end(); I != E; ++I) {
+      Pass *PRequired = *I;
+      unsigned RDepth = 0;
+      //FIXME: RDepth = PRequired->getResolver()->getDepth();
+      if (PDepth == RDepth)
+        LastUses.push_back(PRequired);
+      else if (PDepth >  RDepth) {
+        // Let the parent claim responsibility of last use
+        ForcedLastUses.push_back(PRequired);
+      } else {
+        // Note : This feature is not yet implemented
+        assert (0 && 
+                "Unable to handle Pass that requires lower level Analysis pass");
+      }
+    }
+
+    if (!LastUses.empty())
+      TPM->setLastUser(LastUses, P);
+
     // Take a note of analysis required and made available by this pass.
     // Remove the analysis not preserved by this pass
     initializeAnalysisImpl(P);
@@ -696,6 +732,10 @@
       if (!activeBBPassManager->addPass(BP))
         assert(0 && "Unable to add Pass");
     }
+
+    if (!ForcedLastUses.empty())
+      TPM->setLastUser(ForcedLastUses, this);
+
     return true;
   }
 
@@ -836,6 +876,10 @@
       if (!activeFunctionPassManager->addPass(FP))
         assert(0 && "Unable to add pass");
     }
+
+    if (!ForcedLastUses.empty())
+      TPM->setLastUser(ForcedLastUses, this);
+
     return true;
   }
 






More information about the llvm-commits mailing list