Current pass manager, not the parent pass manager, assumes the role of
authorDevang Patel <dpatel@apple.com>
Mon, 5 Mar 2007 22:57:49 +0000 (22:57 +0000)
committerDevang Patel <dpatel@apple.com>
Mon, 5 Mar 2007 22:57:49 +0000 (22:57 +0000)
last user when one of the managed pass uses info provided by parent pass
manager.

This was exposed by LPPassManager work.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@34936 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/PassManagers.h
lib/VMCore/PassManager.cpp

index 8e00fc6e43574badfbbac24352da043b8df6d8be..b2a0a9fa8c46a63d43f8f6f52f0b0b9bc8ae9790 100644 (file)
@@ -222,7 +222,6 @@ public:
 
   /// Initialize available analysis information.
   void initializeAnalysisInfo() { 
-    TransferLastUses.clear();
     AvailableAnalysis.clear();
   }
 
@@ -255,10 +254,6 @@ public:
   void dumpAnalysisSetInfo(const char *Msg, Pass *P,
                            const std::vector<AnalysisID> &Set) const;
 
-  std::vector<Pass *>& getTransferredLastUses() {
-    return TransferLastUses;
-  }
-
   virtual unsigned getNumContainedPasses() { 
     return PassVector.size();
   }
@@ -269,12 +264,6 @@ public:
   }
 protected:
 
-  // 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.
-  // Current pass manage is requesting parent manager to record parent
-  // manager as the last user of these TrransferLastUses passes.
-  std::vector<Pass *> TransferLastUses;
-
   // Top level manager.
   PMTopLevelManager *TPM;
 
index aebff50be7d1620b8fe90eef921ce652bc4f1711..23a26130fc37f52c6bd34375cfbfc3bb8ea203ec 100644 (file)
@@ -158,7 +158,6 @@ public:
       recordAvailableAnalysis(IP);
     } else {
       P->assignPassManager(activeStack);
-      activeStack.handleLastUserOverflow();
     }
 
   }
@@ -259,7 +258,6 @@ public:
       recordAvailableAnalysis(IP);
     } else {
       P->assignPassManager(activeStack);
-      activeStack.handleLastUserOverflow();
     }
 
   }
@@ -587,6 +585,10 @@ void PMDataManager::add(Pass *P,
   AnalysisResolver *AR = new AnalysisResolver(*this);
   P->setResolver(AR);
 
+  // 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 *> TransferLastUses;
+
   if (ProcessAnalysis) {
 
     // At the moment, this pass is the last user of all required passes.
@@ -622,6 +624,12 @@ void PMDataManager::add(Pass *P,
       LastUses.push_back(P);
     TPM->setLastUser(LastUses, P);
 
+    if (!TransferLastUses.empty()) {
+      Pass *My_PM = dynamic_cast<Pass *>(this);
+      TPM->setLastUser(TransferLastUses, My_PM);
+      TransferLastUses.clear();
+    }
+
     // Take a note of analysis required and made available by this pass.
     // Remove the analysis not preserved by this pass
     removeNotPreservedAnalysis(P);
@@ -1231,26 +1239,6 @@ void PMStack::dump() {
     printf ("\n");
 }
 
-// Walk Pass Manager stack and set LastUse markers if any
-// manager is transfering this priviledge to its parent manager
-void PMStack::handleLastUserOverflow() {
-
-  for(PMStack::iterator I = this->begin(), E = this->end(); I != E;) {
-
-    PMDataManager *Child = *I++;
-    if (I != E) {
-      PMDataManager *Parent = *I++;
-      PMTopLevelManager *TPM = Parent->getTopLevelManager();
-      std::vector<Pass *> &TLU = Child->getTransferredLastUses();
-      if (!TLU.empty()) {
-        Pass *P = dynamic_cast<Pass *>(Parent);
-        TPM->setLastUser(TLU, P);
-        TLU.clear();
-      }
-    }
-  }
-}
-
 /// Find appropriate Module Pass Manager in the PM Stack and
 /// add self into that manager. 
 void ModulePass::assignPassManager(PMStack &PMS,