namespace llvm {
-struct ETForest;
+class ETForest;
class LoopInfo;
class PHINode;
class Instruction;
/// isLoopInvariant - Return true if the specified value is loop invariant
///
bool isLoopInvariant(Value *V) const;
-
+
//===--------------------------------------------------------------------===//
// APIs for simple analysis of the loop.
//
// 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
/// this returns null.
///
Value *getTripCount() const;
-
+
/// isLCSSAForm - Return true if the Loop is in LCSSA form
bool isLCSSAForm() const;
/// the mapping in the LoopInfo class.
void removeBlockFromLoop(BasicBlock *BB);
+ void print(llvm_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:
virtual bool runOnFunction(Function &F);
virtual void releaseMemory();
+ void print(llvm_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;