Use schedulePass() instead of assignPassManager() to add new LPPassManager.

This ensures that require analysis info is available.

llvm-svn: 34980
This commit is contained in:
Devang Patel 2007-03-06 19:11:25 +00:00
parent ef7ac13406
commit 4a8725cf2f
2 changed files with 13 additions and 9 deletions

View File

@ -69,12 +69,8 @@ public:
bool runOnFunction(Function &F); bool runOnFunction(Function &F);
/// Pass Manager itself does not invalidate any analysis info. /// Pass Manager itself does not invalidate any analysis info.
void getAnalysisUsage(AnalysisUsage &Info) const { // LPPassManager needs LoopInfo.
// LPPassManager needs LoopInfo. In the long term LoopInfo class will void getAnalysisUsage(AnalysisUsage &Info) const;
// be consumed by LPPassManager.
Info.addRequired<LoopInfo>();
Info.setPreservesAll();
}
virtual const char *getPassName() const { virtual const char *getPassName() const {
return "Loop Pass Manager"; return "Loop Pass Manager";

View File

@ -143,14 +143,22 @@ static void addLoopIntoQueue(Loop *L, std::deque<Loop *> &LQ) {
LQ.push_back(L); LQ.push_back(L);
} }
/// Pass Manager itself does not invalidate any analysis info.
void LPPassManager::getAnalysisUsage(AnalysisUsage &Info) const {
// LPPassManager needs LoopInfo. In the long term LoopInfo class will
// become part of LPPassManager.
Info.addRequired<LoopInfo>();
Info.setPreservesAll();
}
/// run - Execute all of the passes scheduled for execution. Keep track of /// run - Execute all of the passes scheduled for execution. Keep track of
/// whether any of the passes modifies the function, and if so, return true. /// whether any of the passes modifies the function, and if so, return true.
bool LPPassManager::runOnFunction(Function &F) { bool LPPassManager::runOnFunction(Function &F) {
LoopInfo &LI = getAnalysis<LoopInfo>(); LI = &getAnalysis<LoopInfo>();
bool Changed = false; bool Changed = false;
// Populate Loop Queue // Populate Loop Queue
for (LoopInfo::iterator I = LI.begin(), E = LI.end(); I != E; ++I) for (LoopInfo::iterator I = LI->begin(), E = LI->end(); I != E; ++I)
addLoopIntoQueue(*I, LQ); addLoopIntoQueue(*I, LQ);
// Initialization // Initialization
@ -279,7 +287,7 @@ void LoopPass::assignPassManager(PMStack &PMS,
// [3] Assign manager to manage this new manager. This may create // [3] Assign manager to manage this new manager. This may create
// and push new managers into PMS // and push new managers into PMS
Pass *P = dynamic_cast<Pass *>(LPPM); Pass *P = dynamic_cast<Pass *>(LPPM);
P->assignPassManager(PMS); TPM->schedulePass(P);
// [4] Push new manager into PMS // [4] Push new manager into PMS
PMS.push(LPPM); PMS.push(LPPM);