From 643a79b4b32610651fe728ff95c9fecc60eaa687 Mon Sep 17 00:00:00 2001 From: Devang Patel Date: Thu, 22 Feb 2007 23:45:15 +0000 Subject: Populate and walk loop queue. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@34505 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Analysis/LoopPass.cpp | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) (limited to 'lib/Analysis/LoopPass.cpp') diff --git a/lib/Analysis/LoopPass.cpp b/lib/Analysis/LoopPass.cpp index 2e3df71c87..95a18e5b00 100644 --- a/lib/Analysis/LoopPass.cpp +++ b/lib/Analysis/LoopPass.cpp @@ -33,11 +33,11 @@ public: // Loop queue used by Loop Pass Manager. This is a wrapper class // that hides implemenation detail (use of priority_queue) inside .cpp file. class LoopQueue { - +public: inline void push(Loop *L) { LPQ.push(L); } inline void pop() { LPQ.pop(); } inline Loop *top() { return LPQ.top(); } - + inline bool empty() { return LPQ.empty(); } private: std::priority_queue, LoopCompare> LPQ; }; @@ -57,22 +57,33 @@ LPPassManager::~LPPassManager() { delete LQ; } +// Recurse through all subloops and all loops into LQ. +static void addLoopIntoQueue(Loop *L, LoopQueue *LQ) { + for (Loop::iterator I = L->begin(), E = L->end(); I != E; ++I) + addLoopIntoQueue(*I, LQ); + LQ->push(L); +} + /// 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(); bool Changed = false; + // Populate Loop Queue + for (LoopInfo::iterator I = LI.begin(), E = LI.end(); I != E; ++I) + addLoopIntoQueue(*I, LQ); + std::string Msg1 = "Executing Pass '"; std::string Msg3 = "' Made Modification '"; // Walk Loops - for (LoopInfo::iterator I = LI.begin(), E = LI.end(); I != E; ++I) { - - Loop *L = *I; + while (!LQ->empty()) { + + Loop *L = LQ->top(); // Run all passes on current SCC for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) { - + Pass *P = getContainedPass(Index); AnalysisUsage AnUsage; P->getAnalysisUsage(AnUsage); @@ -97,6 +108,9 @@ bool LPPassManager::runOnFunction(Function &F) { recordAvailableAnalysis(P); removeDeadPasses(P, Msg2); } + + // Pop the loop from queue after running all passes. + LQ->pop(); } return Changed; -- cgit v1.2.3