Add LoopQueue. This is used by loop pass manager to manage loop nest.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@34504 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/include/llvm/Analysis/LoopPass.h b/include/llvm/Analysis/LoopPass.h
index eb15373..f0b5220 100644
--- a/include/llvm/Analysis/LoopPass.h
+++ b/include/llvm/Analysis/LoopPass.h
@@ -25,6 +25,7 @@
class LPPassManager;
class Loop;
class Function;
+class LoopQueue;
class LoopPass : public Pass {
@@ -41,7 +42,8 @@
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 @@
return PMT_LoopPassManager;
}
+ private:
+ LoopQueue *LQ;
+
};
} // End llvm namespace
diff --git a/lib/Analysis/LoopPass.cpp b/lib/Analysis/LoopPass.cpp
index ee18ed5..2e3df71 100644
--- a/lib/Analysis/LoopPass.cpp
+++ b/lib/Analysis/LoopPass.cpp
@@ -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) {