Add LoopQueue. This is used by loop pass manager to manage loop nest.

llvm-svn: 34504
This commit is contained in:
Devang Patel 2007-02-22 23:30:07 +00:00
parent cc607daac1
commit de7d49053f
2 changed files with 42 additions and 1 deletions

View File

@ -25,6 +25,7 @@ namespace llvm {
class LPPassManager;
class Loop;
class Function;
class LoopQueue;
class LoopPass : public Pass {
@ -41,7 +42,8 @@ class LoopPass : public Pass {
class LPPassManager : public FunctionPass, public PMDataManager {
public:
LPPassManager(int Depth) : PMDataManager(Depth) { }
LPPassManager(int Depth);
~LPPassManager();
/// run - Execute all of the passes scheduled for execution. Keep track of
/// whether any of the passes modifies the module, and if so, return true.
@ -79,6 +81,9 @@ public:
return PMT_LoopPassManager;
}
private:
LoopQueue *LQ;
};
} // End llvm namespace

View File

@ -14,13 +14,49 @@
//===----------------------------------------------------------------------===//
#include "llvm/Analysis/LoopPass.h"
#include <queue>
using namespace llvm;
//===----------------------------------------------------------------------===//
// LoopQueue
namespace llvm {
// Compare Two loops based on their depth in loop nest.
class LoopCompare {
public:
bool operator()( Loop *L1, Loop *L2) const {
return L1->getLoopDepth() > L2->getLoopDepth();
}
};
// 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 {
inline void push(Loop *L) { LPQ.push(L); }
inline void pop() { LPQ.pop(); }
inline Loop *top() { return LPQ.top(); }
private:
std::priority_queue<Loop *, std::vector<Loop *>, LoopCompare> LPQ;
};
} // End of LLVM namespace
//===----------------------------------------------------------------------===//
// LPPassManager
//
/// LPPassManager manages FPPassManagers and CalLGraphSCCPasses.
LPPassManager::LPPassManager(int Depth) : PMDataManager(Depth) {
LQ = new LoopQueue();
}
LPPassManager::~LPPassManager() {
delete LQ;
}
/// 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) {