s/ForcedLastUses/TransferLastUses/g
authorDevang Patel <dpatel@apple.com>
Fri, 15 Dec 2006 00:08:26 +0000 (00:08 +0000)
committerDevang Patel <dpatel@apple.com>
Fri, 15 Dec 2006 00:08:26 +0000 (00:08 +0000)
Register pass has the its last user, otherwise sometimes no one will claim
LastUse.

Handle transferred last uses from child pass manager.

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

lib/VMCore/PassManager.cpp

index a6c3ef9a7d096e02f75e8746b572627d67c04565..959047fa674d9a988b85c8a7f98a240a26182b49 100644 (file)
@@ -250,7 +250,7 @@ public:
 
   /// Initialize available analysis information.
   void initializeAnalysisInfo() { 
-    ForcedLastUses.clear();
+    TransferLastUses.clear();
     AvailableAnalysis.clear();
   }
 
@@ -330,12 +330,18 @@ public:
       cerr << "\n";
     }
   }
+
+  std::vector<Pass *>& getTransferredLastUses() {
+    return TransferLastUses;
+  }
+
 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
+  // 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;
+  // 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;
@@ -853,7 +859,7 @@ void PMDataManager::addPassToManager(Pass *P,
         LastUses.push_back(PRequired);
       else if (PDepth >  RDepth) {
         // Let the parent claim responsibility of last use
-        ForcedLastUses.push_back(PRequired);
+        TransferLastUses.push_back(PRequired);
       } else {
         // Note : This feature is not yet implemented
         assert (0 && 
@@ -861,8 +867,8 @@ void PMDataManager::addPassToManager(Pass *P,
       }
     }
 
-    if (!LastUses.empty())
-      TPM->setLastUser(LastUses, P);
+    LastUses.push_back(P);
+    TPM->setLastUser(LastUses, P);
 
     // Take a note of analysis required and made available by this pass.
     // Remove the analysis not preserved by this pass
@@ -1161,10 +1167,14 @@ FunctionPassManagerImpl_New::addPass(Pass *P) {
       // Add pass into new manager. This time it must succeed.
       if (!activeBBPassManager->addPass(BP))
         assert(0 && "Unable to add Pass");
+
+      // If activeBBPassManager transfered any Last Uses then handle them here.
+      std::vector<Pass *> &TLU = activeBBPassManager->getTransferredLastUses();
+      if (!TLU.empty())
+        TPM->setLastUser(TLU, this);
+
     }
 
-    if (!ForcedLastUses.empty())
-      TPM->setLastUser(ForcedLastUses, this);
 
     return true;
   }
@@ -1326,10 +1336,14 @@ ModulePassManager::addPass(Pass *P) {
       // Add pass into new manager. This time it must succeed.
       if (!activeFunctionPassManager->addPass(FP))
         assert(0 && "Unable to add pass");
-    }
 
-    if (!ForcedLastUses.empty())
-      TPM->setLastUser(ForcedLastUses, this);
+      // If activeFunctionPassManager transfered any Last Uses then 
+      // handle them here.
+      std::vector<Pass *> &TLU = 
+        activeFunctionPassManager->getTransferredLastUses();
+      if (!TLU.empty())
+        TPM->setLastUser(TLU, this);
+    }
 
     return true;
   }