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);
/// Pass Manager itself does not invalidate any analysis info.
void getAnalysisUsage(AnalysisUsage &Info) const {
// LPPassManager needs LoopInfo. In the long term LoopInfo class will
// be consumed by LPPassManager.
Info.addRequired<LoopInfo>();
Info.setPreservesAll();
}
// LPPassManager needs LoopInfo.
void getAnalysisUsage(AnalysisUsage &Info) const;
virtual const char *getPassName() const {
return "Loop Pass Manager";

View File

@ -143,14 +143,22 @@ static void addLoopIntoQueue(Loop *L, std::deque<Loop *> &LQ) {
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
/// whether any of the passes modifies the function, and if so, return true.
bool LPPassManager::runOnFunction(Function &F) {
LoopInfo &LI = getAnalysis<LoopInfo>();
LI = &getAnalysis<LoopInfo>();
bool Changed = false;
// 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);
// Initialization
@ -279,7 +287,7 @@ void LoopPass::assignPassManager(PMStack &PMS,
// [3] Assign manager to manage this new manager. This may create
// and push new managers into PMS
Pass *P = dynamic_cast<Pass *>(LPPM);
P->assignPassManager(PMS);
TPM->schedulePass(P);
// [4] Push new manager into PMS
PMS.push(LPPM);