Changed llvm_ostream et all to OStream. llvm_cerr, llvm_cout, llvm_null, are
[oota-llvm.git] / include / llvm / Analysis / LoopInfo.h
index dd278e76c8b4dc5e119d806c0953005bb224446c..238a0f627d470d1ed7a625eb759b575f2c1735d7 100644 (file)
@@ -35,7 +35,7 @@
 
 namespace llvm {
 
-struct ETForest;
+class ETForest;
 class LoopInfo;
 class PHINode;
 class Instruction;
@@ -107,11 +107,23 @@ public:
   // induction variable canonicalization pass should be used to normalize loops
   // for easy analysis.  These methods assume canonical loops.
 
+  /// getExitingBlocks - Return all blocks inside the loop that have successors
+  /// 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;
+
   /// 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;
 
+  /// 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;
+
   /// 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
   /// from outside of the loop.  If this is the case, the block branching to the
@@ -146,6 +158,9 @@ public:
   /// this returns null.
   ///
   Value *getTripCount() const;
+  
+  /// isLCSSAForm - Return true if the Loop is in LCSSA form
+  bool isLCSSAForm() const;
 
   //===--------------------------------------------------------------------===//
   // APIs for updating loop information after changing the CFG
@@ -202,6 +217,9 @@ 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);
+  }
   void print(std::ostream &O, unsigned Depth = 0) const;
   void dump() const;
 private:
@@ -265,6 +283,9 @@ 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;
 
   virtual void getAnalysisUsage(AnalysisUsage &AU) const;
@@ -295,19 +316,14 @@ public:
   /// BasicBlocks to loops.
   void removeBlock(BasicBlock *BB);
 
-  static void stub();  // Noop
 private:
-  void Calculate(const ETForest &EF);
-  Loop *ConsiderForLoop(BasicBlock *BB, const ETForest &EF);
+  void Calculate(ETForest &EF);
+  Loop *ConsiderForLoop(BasicBlock *BB, ETForest &EF);
   void MoveSiblingLoopInto(Loop *NewChild, Loop *NewParent);
   void InsertLoopInto(Loop *L, Loop *Parent);
 };
 
 
-// Make sure that any clients of this file link in LoopInfo.cpp
-static IncludeFile
-LOOP_INFO_INCLUDE_FILE((void*)(&LoopInfo::stub));
-
 // Allow clients to walk the list of nested loops...
 template <> struct GraphTraits<const Loop*> {
   typedef const Loop NodeType;
@@ -337,4 +353,7 @@ template <> struct GraphTraits<Loop*> {
 
 } // End llvm namespace
 
+// Make sure that any clients of this file link in LoopInfo.cpp
+FORCE_DEFINING_FILE_TO_BE_LINKED(LoopInfo)
+
 #endif