diff --git a/include/llvm/Analysis/LoopPass.h b/include/llvm/Analysis/LoopPass.h index eb153738fe9..f0b522034d9 100644 --- a/include/llvm/Analysis/LoopPass.h +++ b/include/llvm/Analysis/LoopPass.h @@ -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 diff --git a/lib/Analysis/LoopPass.cpp b/lib/Analysis/LoopPass.cpp index ee18ed57333..2e3df71c87c 100644 --- a/lib/Analysis/LoopPass.cpp +++ b/lib/Analysis/LoopPass.cpp @@ -14,13 +14,49 @@ //===----------------------------------------------------------------------===// #include "llvm/Analysis/LoopPass.h" +#include 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, 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) {