Keep track of Last user of analysis phase.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@31721 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Devang Patel
2006-11-14 02:54:23 +00:00
parent b899eed1bc
commit 03153c70de

View File

@ -64,6 +64,7 @@ public:
void clearAnalysis() { void clearAnalysis() {
RequiredAnalysis.clear(); RequiredAnalysis.clear();
AvailableAnalysis.clear(); AvailableAnalysis.clear();
LastUser.clear();
} }
// All Required analyses should be available to the pass as it runs! Here // All Required analyses should be available to the pass as it runs! Here
@ -81,6 +82,8 @@ public:
return PassVector.end(); return PassVector.end();
} }
inline void setLastUser(Pass *P, Pass *LU) { LastUser[P] = LU; }
private: private:
// Analysis required by the passes managed by this manager. This information // Analysis required by the passes managed by this manager. This information
// used while selecting pass manager during addPass. If a pass does not // used while selecting pass manager during addPass. If a pass does not
@ -94,6 +97,10 @@ private:
// scheduled to run. // scheduled to run.
std::map<AnalysisID, Pass*> AvailableAnalysis; std::map<AnalysisID, Pass*> AvailableAnalysis;
// Map to keep track of last user of the analysis pass.
// LastUser->second is the last user of Lastuser->first.
std::map<Pass *, Pass *> LastUser;
// Collection of pass that are managed by this manager // Collection of pass that are managed by this manager
std::vector<Pass *> PassVector; std::vector<Pass *> PassVector;
}; };
@ -114,7 +121,7 @@ public:
bool runOnFunction(Function &F); bool runOnFunction(Function &F);
/// Return true IFF AnalysisID AID is currently available. /// Return true IFF AnalysisID AID is currently available.
bool analysisCurrentlyAvailable(AnalysisID AID); Pass *getAnalysisPassFromManager(AnalysisID AID);
private: private:
}; };
@ -147,7 +154,7 @@ public:
bool runOnModule(Module &M); bool runOnModule(Module &M);
/// Return true IFF AnalysisID AID is currently available. /// Return true IFF AnalysisID AID is currently available.
bool analysisCurrentlyAvailable(AnalysisID AID); Pass *getAnalysisPassFromManager(AnalysisID AID);
private: private:
// Active Pass Managers // Active Pass Managers
@ -170,7 +177,7 @@ public:
bool runOnModule(Module &M); bool runOnModule(Module &M);
/// Return true IFF AnalysisID AID is currently available. /// Return true IFF AnalysisID AID is currently available.
bool analysisCurrentlyAvailable(AnalysisID AID); Pass *getAnalysisPassFromManager(AnalysisID AID);
private: private:
// Active Pass Manager // Active Pass Manager
@ -193,7 +200,7 @@ public:
bool run(Module &M); bool run(Module &M);
/// Return true IFF AnalysisID AID is currently available. /// Return true IFF AnalysisID AID is currently available.
bool analysisCurrentlyAvailable(AnalysisID AID); Pass *getAnalysisPassFromManager(AnalysisID AID);
private: private:
@ -348,8 +355,8 @@ BasicBlockPassManager_New::runOnFunction(Function &F) {
} }
/// Return true IFF AnalysisID AID is currently available. /// Return true IFF AnalysisID AID is currently available.
bool BasicBlockPassManager_New::analysisCurrentlyAvailable(AnalysisID AID) { Pass * BasicBlockPassManager_New::getAnalysisPassFromManager(AnalysisID AID) {
return (getAnalysisPass(AID) != 0); return getAnalysisPass(AID);
} }
// FunctionPassManager_New implementation // FunctionPassManager_New implementation
@ -438,17 +445,18 @@ FunctionPassManagerImpl_New::runOnModule(Module &M) {
} }
/// Return true IFF AnalysisID AID is currently available. /// Return true IFF AnalysisID AID is currently available.
bool FunctionPassManagerImpl_New::analysisCurrentlyAvailable(AnalysisID AID) { Pass *FunctionPassManagerImpl_New::getAnalysisPassFromManager(AnalysisID AID) {
if (getAnalysisPass(AID) != 0) Pass *P = getAnalysisPass(AID);
return true; if (P)
return P;
if (activeBBPassManager && if (activeBBPassManager &&
activeBBPassManager->getAnalysisPass(AID) != 0) activeBBPassManager->getAnalysisPass(AID) != 0)
return true; return activeBBPassManager->getAnalysisPass(AID);
// TODO : Check inactive managers // TODO : Check inactive managers
return false; return NULL;
} }
// ModulePassManager implementation // ModulePassManager implementation
@ -512,27 +520,29 @@ ModulePassManager_New::runOnModule(Module &M) {
} }
/// Return true IFF AnalysisID AID is currently available. /// Return true IFF AnalysisID AID is currently available.
bool ModulePassManager_New::analysisCurrentlyAvailable(AnalysisID AID) { Pass *ModulePassManager_New::getAnalysisPassFromManager(AnalysisID AID) {
if (getAnalysisPass(AID) != 0)
return true; Pass *P = getAnalysisPass(AID);
if (P)
return P;
if (activeFunctionPassManager && if (activeFunctionPassManager &&
activeFunctionPassManager->getAnalysisPass(AID) != 0) activeFunctionPassManager->getAnalysisPass(AID) != 0)
return true; return activeFunctionPassManager->getAnalysisPass(AID);
// TODO : Check inactive managers // TODO : Check inactive managers
return false; return NULL;
} }
/// Return true IFF AnalysisID AID is currently available. /// Return true IFF AnalysisID AID is currently available.
bool PassManagerImpl_New::analysisCurrentlyAvailable(AnalysisID AID) { Pass *PassManagerImpl_New::getAnalysisPassFromManager(AnalysisID AID) {
bool available = false; Pass *P = NULL;
for (std::vector<ModulePassManager_New *>::iterator itr = PassManagers.begin(), for (std::vector<ModulePassManager_New *>::iterator itr = PassManagers.begin(),
e = PassManagers.end(); !available && itr != e; ++itr) e = PassManagers.end(); !P && itr != e; ++itr)
available = (*itr)->analysisCurrentlyAvailable(AID); P = (*itr)->getAnalysisPassFromManager(AID);
return available; return P;
} }
/// Schedule pass P for execution. Make sure that passes required by /// Schedule pass P for execution. Make sure that passes required by
@ -546,11 +556,13 @@ void PassManagerImpl_New::schedulePass(Pass *P) {
for (std::vector<AnalysisID>::const_iterator I = RequiredSet.begin(), for (std::vector<AnalysisID>::const_iterator I = RequiredSet.begin(),
E = RequiredSet.end(); I != E; ++I) { E = RequiredSet.end(); I != E; ++I) {
if (!analysisCurrentlyAvailable(*I)) { Pass *AnalysisPass = getAnalysisPassFromManager(*I);
if (!AnalysisPass) {
// Schedule this analysis run first. // Schedule this analysis run first.
Pass *AP = (*I)->createPass(); AnalysisPass = (*I)->createPass();
schedulePass(AP); schedulePass(AnalysisPass);
} }
setLastUser (AnalysisPass, P);
} }
addPass(P); addPass(P);