Add a flag to mark a dirty cache entry. This is not yet used, but will eventually
[oota-llvm.git] / include / llvm / Analysis / LoopInfo.h
index 238a0f627d470d1ed7a625eb759b575f2c1735d7..acb5fd6c7a4a23b022574fbdc4e0549ef1dd5e05 100644 (file)
 
 #include "llvm/Pass.h"
 #include "llvm/ADT/GraphTraits.h"
+#include "llvm/ADT/SmallVector.h"
 
 namespace llvm {
 
-class ETForest;
+class DominatorTree;
 class LoopInfo;
 class PHINode;
 class Instruction;
@@ -111,18 +112,18 @@ public:
   /// outside of the loop.  These are the blocks _inside of the current loop_
   /// which branch out.  The returned list is always unique.
   ///
-  void getExitingBlocks(std::vector<BasicBlock*> &Blocks) const;
+  void getExitingBlocks(SmallVectorImpl<BasicBlock *> &Blocks) const;
 
   /// getExitBlocks - Return all of the successor blocks of this loop.  These
   /// are the blocks _outside of the current loop_ which are branched to.
   ///
-  void getExitBlocks(std::vector<BasicBlock*> &Blocks) const;
+  void getExitBlocks(SmallVectorImpl<BasicBlock* > &Blocks) const;
 
   /// getUniqueExitBlocks - Return all unique successor blocks of this loop. 
   /// These are the blocks _outside of the current loop_ which are branched to.
   /// This assumes that loop is in canonical form.
   ///
-  void getUniqueExitBlocks(std::vector<BasicBlock*> &ExitBlocks) const;
+  void getUniqueExitBlocks(SmallVectorImpl<BasicBlock*> &ExitBlocks) const;
 
   /// getLoopPreheader - If there is a preheader for this loop, return it.  A
   /// loop has a preheader if there is only one edge to the header of the loop
@@ -217,10 +218,13 @@ public:
   /// the mapping in the LoopInfo class.
   void removeBlockFromLoop(BasicBlock *BB);
 
-  void print(OStream &O, unsigned Depth = 0) const {
-    if (O.stream()) print(*O.stream(), Depth);
-  }
+  /// verifyLoop - Verify loop structure
+  void verifyLoop() const;
+
   void print(std::ostream &O, unsigned Depth = 0) const;
+  void print(std::ostream *O, unsigned Depth = 0) const {
+    if (O) print(*O, Depth);
+  }
   void dump() const;
 private:
   friend class LoopInfo;
@@ -241,6 +245,9 @@ class LoopInfo : public FunctionPass {
   std::vector<Loop*> TopLevelLoops;
   friend class Loop;
 public:
+  static char ID; // Pass identification, replacement for typeid
+
+  LoopInfo() : FunctionPass(intptr_t(&ID)) {}
   ~LoopInfo() { releaseMemory(); }
 
   /// iterator/begin/end - The interface to the top-level loops in the current
@@ -283,10 +290,11 @@ public:
   virtual bool runOnFunction(Function &F);
 
   virtual void releaseMemory();
-  void print(OStream &O, const Module* = 0) const {
-    if (O.stream()) print(*O.stream());
-  }
+
   void print(std::ostream &O, const Module* = 0) const;
+  void print(std::ostream *O, const Module* M = 0) const {
+    if (O) print(*O, M);
+  }
 
   virtual void getAnalysisUsage(AnalysisUsage &AU) const;
 
@@ -317,8 +325,8 @@ public:
   void removeBlock(BasicBlock *BB);
 
 private:
-  void Calculate(ETForest &EF);
-  Loop *ConsiderForLoop(BasicBlock *BB, ETForest &EF);
+  void Calculate(DominatorTree &DT);
+  Loop *ConsiderForLoop(BasicBlock *BB, DominatorTree &DT);
   void MoveSiblingLoopInto(Loop *NewChild, Loop *NewParent);
   void InsertLoopInto(Loop *L, Loop *Parent);
 };