From cf5fb2b614a7fea4565e405c81a3ae8037d78f7b Mon Sep 17 00:00:00 2001 From: Devang Patel Date: Mon, 5 Mar 2007 22:57:49 +0000 Subject: [PATCH] Current pass manager, not the parent pass manager, assumes the role of 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 | 11 ----------- lib/VMCore/PassManager.cpp | 32 ++++++++++---------------------- 2 files changed, 10 insertions(+), 33 deletions(-) diff --git a/include/llvm/PassManagers.h b/include/llvm/PassManagers.h index 8e00fc6e435..b2a0a9fa8c4 100644 --- a/include/llvm/PassManagers.h +++ b/include/llvm/PassManagers.h @@ -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 &Set) const; - std::vector& 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 TransferLastUses; - // Top level manager. PMTopLevelManager *TPM; diff --git a/lib/VMCore/PassManager.cpp b/lib/VMCore/PassManager.cpp index aebff50be7d..23a26130fc3 100644 --- a/lib/VMCore/PassManager.cpp +++ b/lib/VMCore/PassManager.cpp @@ -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 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(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 &TLU = Child->getTransferredLastUses(); - if (!TLU.empty()) { - Pass *P = dynamic_cast(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,