Add LoopQueue. This is used by loop pass manager to manage loop nest.
authorDevang Patel <dpatel@apple.com>
Thu, 22 Feb 2007 23:30:07 +0000 (23:30 +0000)
committerDevang Patel <dpatel@apple.com>
Thu, 22 Feb 2007 23:30:07 +0000 (23:30 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@34504 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Analysis/LoopPass.h
lib/Analysis/LoopPass.cpp

index eb153738fe918b1afc74f23971fb8ed2b5c0acf7..f0b522034d9644750dc19a9ed53cfd97c704bfed 100644 (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
index ee18ed57333cc4d1914b5dbb9e261ac65288d922..2e3df71c87cf47b756af02a1d55e8f7a64cef0e5 100644 (file)
 //===----------------------------------------------------------------------===//
 
 #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) {