Add a note about a potential PIC optimization.
[oota-llvm.git] / include / llvm / Analysis / LoopInfo.h
index c83fb9eca0abb9e8cd161622b11e9a555e8a75c1..dff1624a5a0a4bb1b3d16bdaf62e038ff1ad40d5 100644 (file)
@@ -2,8 +2,8 @@
 //
 //                     The LLVM Compiler Infrastructure
 //
-// This file was developed by the LLVM research group and is distributed under
-// the University of Illinois Open Source License. See LICENSE.TXT for details.
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
 //
 //===----------------------------------------------------------------------===//
 //
@@ -43,6 +43,8 @@
 #include <algorithm>
 #include <ostream>
 
+namespace llvm {
+
 template<typename T>
 static void RemoveFromVector(std::vector<T*> &V, T *N) {
   typename std::vector<T*>::iterator I = std::find(V.begin(), V.end(), N);
@@ -50,37 +52,44 @@ static void RemoveFromVector(std::vector<T*> &V, T *N) {
   V.erase(I);
 }
 
-namespace llvm {
-
 class DominatorTree;
 class LoopInfo;
 class PHINode;
 class Instruction;
 template<class N> class LoopInfoBase;
+template<class N> class LoopBase;
+
+typedef LoopBase<BasicBlock> Loop;
 
 //===----------------------------------------------------------------------===//
-/// LoopBase class - Instances of this class are used to represent loops that are
-/// detected in the flow graph
+/// LoopBase class - Instances of this class are used to represent loops that
+/// are detected in the flow graph
 ///
 template<class BlockT>
 class LoopBase {
   LoopBase<BlockT> *ParentLoop;
-  std::vector<LoopBase<BlockT>*> SubLoops;       // Loops contained entirely within this one
-  std::vector<BlockT*> Blocks;   // First entry is the header node
+  // SubLoops - Loops contained entirely within this one.
+  std::vector<LoopBase<BlockT>*> SubLoops;
+
+  // Blocks - The list of blocks in this loop.  First entry is the header node.
+  std::vector<BlockT*> Blocks;
 
   LoopBase(const LoopBase<BlockT> &);                  // DO NOT IMPLEMENT
-  const LoopBase<BlockT> &operator=(const LoopBase<BlockT> &); // DO NOT IMPLEMENT
+  const LoopBase<BlockT>&operator=(const LoopBase<BlockT> &);// DO NOT IMPLEMENT
 public:
   /// Loop ctor - This creates an empty loop.
   LoopBase() : ParentLoop(0) {}
   ~LoopBase() {
-    for (unsigned i = 0, e = SubLoops.size(); i != e; ++i)
+    for (size_t i = 0, e = SubLoops.size(); i != e; ++i)
       delete SubLoops[i];
   }
 
+  /// getLoopDepth - Return the nesting level of this loop.  An outer-most
+  /// loop has depth 1, for consistency with loop depth values used for basic
+  /// blocks, where depth 0 is used for blocks not inside any loops.
   unsigned getLoopDepth() const {
-    unsigned D = 0;
-    for (const LoopBase<BlockT> *CurLoop = this; CurLoop;
+    unsigned D = 1;
+    for (const LoopBase<BlockT> *CurLoop = ParentLoop; CurLoop;
          CurLoop = CurLoop->ParentLoop)
       ++D;
     return D;
@@ -88,7 +97,7 @@ public:
   BlockT *getHeader() const { return Blocks.front(); }
   LoopBase<BlockT> *getParentLoop() const { return ParentLoop; }
 
-  /// contains - Return true of the specified basic block is in this loop
+  /// contains - Return true if the specified basic block is in this loop
   ///
   bool contains(const BlockT *BB) const {
     return std::find(Blocks.begin(), Blocks.end(), BB) != Blocks.end();
@@ -113,8 +122,10 @@ public:
   /// that is outside of the current loop.
   ///
   bool isLoopExit(const BlockT *BB) const {
-    for (succ_const_iterator SI = succ_begin(BB), SE = succ_end(BB);
-         SI != SE; ++SI) {
+    typedef GraphTraits<BlockT*> BlockTraits;
+    for (typename BlockTraits::ChildIteratorType SI =
+         BlockTraits::child_begin(const_cast<BlockT*>(BB)),
+         SE = BlockTraits::child_end(const_cast<BlockT*>(BB)); SI != SE; ++SI) {
       if (!contains(*SI))
         return true;
     }
@@ -127,7 +138,10 @@ public:
     unsigned NumBackEdges = 0;
     BlockT *H = getHeader();
 
-    for (pred_iterator I = pred_begin(H), E = pred_end(H); I != E; ++I)
+    typedef GraphTraits<Inverse<BlockT*> > InvBlockTraits;
+    for (typename InvBlockTraits::ChildIteratorType I =
+         InvBlockTraits::child_begin(const_cast<BlockT*>(H)),
+         E = InvBlockTraits::child_end(const_cast<BlockT*>(H)); I != E; ++I)
       if (contains(*I))
         ++NumBackEdges;
 
@@ -136,7 +150,7 @@ public:
 
   /// isLoopInvariant - Return true if the specified value is loop invariant
   ///
-  bool isLoopInvariant(Value *V) const {
+  inline bool isLoopInvariant(Value *V) const {
     if (Instruction *I = dyn_cast<Instruction>(V))
       return !contains(I->getParent());
     return true;  // All non-instructions are loop invariant
@@ -160,9 +174,12 @@ public:
     SmallVector<BlockT*, 128> LoopBBs(block_begin(), block_end());
     std::sort(LoopBBs.begin(), LoopBBs.end());
 
+    typedef GraphTraits<BlockT*> BlockTraits;
     for (typename std::vector<BlockT*>::const_iterator BI = Blocks.begin(),
          BE = Blocks.end(); BI != BE; ++BI)
-      for (succ_iterator I = succ_begin(*BI), E = succ_end(*BI); I != E; ++I)
+      for (typename BlockTraits::ChildIteratorType I =
+          BlockTraits::child_begin(*BI), E = BlockTraits::child_end(*BI);
+          I != E; ++I)
         if (!std::binary_search(LoopBBs.begin(), LoopBBs.end(), *I)) {
           // Not in current loop? It must be an exit block.
           ExitingBlocks.push_back(*BI);
@@ -179,9 +196,12 @@ public:
     SmallVector<BlockT*, 128> LoopBBs(block_begin(), block_end());
     std::sort(LoopBBs.begin(), LoopBBs.end());
 
+    typedef GraphTraits<BlockT*> BlockTraits;
     for (typename std::vector<BlockT*>::const_iterator BI = Blocks.begin(),
          BE = Blocks.end(); BI != BE; ++BI)
-      for (succ_iterator I = succ_begin(*BI), E = succ_end(*BI); I != E; ++I)
+      for (typename BlockTraits::ChildIteratorType I =
+           BlockTraits::child_begin(*BI), E = BlockTraits::child_end(*BI);
+           I != E; ++I)
         if (!std::binary_search(LoopBBs.begin(), LoopBBs.end(), *I))
           // Not in current loop? It must be an exit block.
           ExitBlocks.push_back(*I);
@@ -205,12 +225,17 @@ public:
       BlockT *current = *BI;
       switchExitBlocks.clear();
 
-      for (succ_iterator I = succ_begin(*BI), E = succ_end(*BI); I != E; ++I) {
+      typedef GraphTraits<BlockT*> BlockTraits;
+      typedef GraphTraits<Inverse<BlockT*> > InvBlockTraits;
+      for (typename BlockTraits::ChildIteratorType I =
+           BlockTraits::child_begin(*BI), E = BlockTraits::child_end(*BI);
+           I != E; ++I) {
         if (std::binary_search(LoopBBs.begin(), LoopBBs.end(), *I))
       // If block is inside the loop then it is not a exit block.
           continue;
-
-        pred_iterator PI = pred_begin(*I);
+      
+        typename InvBlockTraits::ChildIteratorType PI =
+                                                InvBlockTraits::child_begin(*I);
         BlockT *firstPred = *PI;
 
         // If current basic block is this exit block's first predecessor
@@ -223,7 +248,8 @@ public:
         // If a terminator has more then two successors, for example SwitchInst,
         // then it is possible that there are multiple edges from current block 
         // to one exit block. 
-        if (current->getTerminator()->getNumSuccessors() <= 2) {
+        if (std::distance(BlockTraits::child_begin(current),
+                          BlockTraits::child_end(current)) <= 2) {
           ExitBlocks.push_back(*I);
           continue;
         }
@@ -253,8 +279,11 @@ public:
 
     // Loop over the predecessors of the header node...
     BlockT *Header = getHeader();
-    for (pred_iterator PI = pred_begin(Header), PE = pred_end(Header);
-         PI != PE; ++PI)
+    typedef GraphTraits<BlockT*> BlockTraits;
+    typedef GraphTraits<Inverse<BlockT*> > InvBlockTraits;
+    for (typename InvBlockTraits::ChildIteratorType PI =
+         InvBlockTraits::child_begin(Header),
+         PE = InvBlockTraits::child_end(Header); PI != PE; ++PI)
       if (!contains(*PI)) {     // If the block is not in the loop...
         if (Out && Out != *PI)
           return 0;             // Multiple predecessors outside the loop
@@ -263,13 +292,13 @@ public:
 
     // Make sure there is only one exit out of the preheader.
     assert(Out && "Header of loop has no predecessors from outside loop?");
-    succ_iterator SI = succ_begin(Out);
+    typename BlockTraits::ChildIteratorType SI = BlockTraits::child_begin(Out);
     ++SI;
-    if (SI != succ_end(Out))
+    if (SI != BlockTraits::child_end(Out))
       return 0;  // Multiple exits from the block, must not be a preheader.
 
-    // If there is exactly one preheader, return it.  If there was zero, then Out
-    // is still null.
+    // If there is exactly one preheader, return it.  If there was zero, then
+    // Out is still null.
     return Out;
   }
 
@@ -279,7 +308,11 @@ public:
   /// block.
   BlockT *getLoopLatch() const {
     BlockT *Header = getHeader();
-    pred_iterator PI = pred_begin(Header), PE = pred_end(Header);
+    typedef GraphTraits<Inverse<BlockT*> > InvBlockTraits;
+    typename InvBlockTraits::ChildIteratorType PI =
+                                            InvBlockTraits::child_begin(Header);
+    typename InvBlockTraits::ChildIteratorType PE =
+                                              InvBlockTraits::child_end(Header);
     if (PI == PE) return 0;  // no preds?
 
     BlockT *Latch = 0;
@@ -303,16 +336,19 @@ public:
   /// by one each time through the loop.  If so, return the phi node that
   /// corresponds to it.
   ///
-  PHINode *getCanonicalInductionVariable() const {
+  inline PHINode *getCanonicalInductionVariable() const {
     BlockT *H = getHeader();
 
     BlockT *Incoming = 0, *Backedge = 0;
-    pred_iterator PI = pred_begin(H);
-    assert(PI != pred_end(H) && "Loop must have at least one backedge!");
+    typedef GraphTraits<Inverse<BlockT*> > InvBlockTraits;
+    typename InvBlockTraits::ChildIteratorType PI =
+                                                 InvBlockTraits::child_begin(H);
+    assert(PI != InvBlockTraits::child_end(H) &&
+           "Loop must have at least one backedge!");
     Backedge = *PI++;
-    if (PI == pred_end(H)) return 0;  // dead loop
+    if (PI == InvBlockTraits::child_end(H)) return 0;  // dead loop
     Incoming = *PI++;
-    if (PI != pred_end(H)) return 0;  // multiple backedges?
+    if (PI != InvBlockTraits::child_end(H)) return 0;  // multiple backedges?
 
     if (contains(Incoming)) {
       if (contains(Backedge))
@@ -324,12 +360,16 @@ public:
     // Loop over all of the PHI nodes, looking for a canonical indvar.
     for (typename BlockT::iterator I = H->begin(); isa<PHINode>(I); ++I) {
       PHINode *PN = cast<PHINode>(I);
-      if (Instruction *Inc =
-          dyn_cast<Instruction>(PN->getIncomingValueForBlock(Backedge)))
-        if (Inc->getOpcode() == Instruction::Add && Inc->getOperand(0) == PN)
-          if (ConstantInt *CI = dyn_cast<ConstantInt>(Inc->getOperand(1)))
-            if (CI->equalsInt(1))
-              return PN;
+      if (ConstantInt *CI =
+          dyn_cast<ConstantInt>(PN->getIncomingValueForBlock(Incoming)))
+        if (CI->isNullValue())
+          if (Instruction *Inc =
+              dyn_cast<Instruction>(PN->getIncomingValueForBlock(Backedge)))
+            if (Inc->getOpcode() == Instruction::Add &&
+                Inc->getOperand(0) == PN)
+              if (ConstantInt *CI = dyn_cast<ConstantInt>(Inc->getOperand(1)))
+                if (CI->equalsInt(1))
+                  return PN;
     }
     return 0;
   }
@@ -338,7 +378,7 @@ public:
   /// the canonical induction variable value for the "next" iteration of the
   /// loop.  This always succeeds if getCanonicalInductionVariable succeeds.
   ///
-  Instruction *getCanonicalInductionVariableIncrement() const {
+  inline Instruction *getCanonicalInductionVariableIncrement() const {
     if (PHINode *PN = getCanonicalInductionVariable()) {
       bool P1InLoop = contains(PN->getIncomingBlock(1));
       return cast<Instruction>(PN->getIncomingValue(P1InLoop));
@@ -351,7 +391,7 @@ public:
   /// of the loop executes N-1 times.  If the trip-count cannot be determined,
   /// this returns null.
   ///
-  Value *getTripCount() const {
+  inline Value *getTripCount() const {
     // Canonical loops will end with a 'cmp ne I, V', where I is the incremented
     // canonical induction variable and V is the trip count of the loop.
     Instruction *Inc = getCanonicalInductionVariableIncrement();
@@ -364,28 +404,82 @@ public:
     if (BranchInst *BI = dyn_cast<BranchInst>(BackedgeBlock->getTerminator()))
       if (BI->isConditional()) {
         if (ICmpInst *ICI = dyn_cast<ICmpInst>(BI->getCondition())) {
-          if (ICI->getOperand(0) == Inc)
+          if (ICI->getOperand(0) == Inc) {
             if (BI->getSuccessor(0) == getHeader()) {
               if (ICI->getPredicate() == ICmpInst::ICMP_NE)
                 return ICI->getOperand(1);
             } else if (ICI->getPredicate() == ICmpInst::ICMP_EQ) {
               return ICI->getOperand(1);
             }
+          }
         }
       }
 
     return 0;
   }
   
+  /// getSmallConstantTripCount - Returns the trip count of this loop as a
+  /// normal unsigned value, if possible. Returns 0 if the trip count is unknown
+  /// of not constant. Will also return 0 if the trip count is very large 
+  /// (>= 2^32)
+  inline unsigned getSmallConstantTripCount() const {
+    Value* TripCount = this->getTripCount();
+    if (TripCount) {
+      if (ConstantInt *TripCountC = dyn_cast<ConstantInt>(TripCount)) {
+        // Guard against huge trip counts.
+        if (TripCountC->getValue().getActiveBits() <= 32) {
+          return (unsigned)TripCountC->getZExtValue();
+        }
+      }
+    }
+    return 0;
+  }
+
+  /// getSmallConstantTripMultiple - Returns the largest constant divisor of the
+  /// trip count of this loop as a normal unsigned value, if possible. This
+  /// means that the actual trip count is always a multiple of the returned
+  /// value (don't forget the trip count could very well be zero as well!).
+  ///
+  /// Returns 1 if the trip count is unknown or not guaranteed to be the
+  /// multiple of a constant (which is also the case if the trip count is simply
+  /// constant, use getSmallConstantTripCount for that case), Will also return 1
+  /// if the trip count is very large (>= 2^32).
+  inline unsigned getSmallConstantTripMultiple() const {
+    Value* TripCount = this->getTripCount();
+    // This will hold the ConstantInt result, if any
+    ConstantInt *Result = NULL;
+    if (TripCount) {
+      // See if the trip count is constant itself
+      Result = dyn_cast<ConstantInt>(TripCount);
+      // if not, see if it is a multiplication
+      if (!Result)
+        if (BinaryOperator *BO = dyn_cast<BinaryOperator>(TripCount)) {
+          switch (BO->getOpcode()) {
+          case BinaryOperator::Mul:
+            Result = dyn_cast<ConstantInt>(BO->getOperand(1));
+            break;
+          default: 
+            break;
+          }
+        }
+    }
+    // Guard against huge trip counts.
+    if (Result && Result->getValue().getActiveBits() <= 32) {
+      return (unsigned)Result->getZExtValue();
+    } else {
+      return 1;
+    }
+  }
+  
   /// isLCSSAForm - Return true if the Loop is in LCSSA form
-  bool isLCSSAForm() const {
+  inline bool isLCSSAForm() const {
     // Sort the blocks vector so that we can use binary search to do quick
     // lookups.
     SmallPtrSet<BlockT*, 16> LoopBBs(block_begin(), block_end());
 
     for (block_iterator BI = block_begin(), E = block_end(); BI != E; ++BI) {
       BlockT *BB = *BI;
-      for (typename BlockT::iterator I = BB->begin(), E = BB->end(); I != E; ++I)
+      for (typename BlockT::iterator I = BB->begin(), E = BB->end(); I != E;++I)
         for (Value::use_iterator UI = I->use_begin(), E = I->use_end(); UI != E;
              ++UI) {
           BlockT *UserBB = cast<Instruction>(*UI)->getParent();
@@ -394,8 +488,8 @@ public:
             UserBB = P->getIncomingBlock(OperandNo/2);
           }
 
-          // Check the current block, as a fast-path.  Most values are used in the
-          // same block they are defined in.
+          // Check the current block, as a fast-path.  Most values are used in
+          // the same block they are defined in.
           if (UserBB != BB && !LoopBBs.count(UserBB))
             return false;
         }
@@ -414,7 +508,7 @@ public:
   /// to the specified LoopInfo object as being in the current basic block.  It
   /// is not valid to replace the loop header with this method.
   ///
-  void addBasicBlockToLoop(BlockT *NewBB, LoopInfo &LI);
+  void addBasicBlockToLoop(BlockT *NewBB, LoopInfoBase<BlockT> &LI);
 
   /// replaceChildLoopWith - This is used when splitting loops up.  It replaces
   /// the OldChild entry in our children list with NewChild, and updates the
@@ -522,8 +616,6 @@ private:
   }
 };
 
-typedef LoopBase<BasicBlock> Loop;
-
 
 //===----------------------------------------------------------------------===//
 /// LoopInfo - This class builds and contains all of the top level loop
@@ -533,7 +625,7 @@ typedef LoopBase<BasicBlock> Loop;
 template<class BlockT>
 class LoopInfoBase {
   // BBMap - Mapping of basic blocks to the inner most loop they occur in
-  std::map<BlockT*, Loop*> BBMap;
+  std::map<BlockT*, LoopBase<BlockT>*> BBMap;
   std::vector<LoopBase<BlockT>*> TopLevelLoops;
   friend class LoopBase<BlockT>;
   
@@ -546,7 +638,7 @@ public:
          TopLevelLoops.begin(), E = TopLevelLoops.end(); I != E; ++I)
       delete *I;   // Delete all of the loops...
 
-    BBMap.clear();                             // Reset internal state of analysis
+    BBMap.clear();                           // Reset internal state of analysis
     TopLevelLoops.clear();
   }
   
@@ -562,7 +654,7 @@ public:
   ///
   LoopBase<BlockT> *getLoopFor(const BlockT *BB) const {
     typename std::map<BlockT *, LoopBase<BlockT>*>::const_iterator I=
-      BBMap.find(const_cast<BasicBlock*>(BB));
+      BBMap.find(const_cast<BlockT*>(BB));
     return I != BBMap.end() ? I->second : 0;
   }
   
@@ -572,16 +664,17 @@ public:
     return getLoopFor(BB);
   }
   
-  /// getLoopDepth - Return the loop nesting level of the specified block...
+  /// getLoopDepth - Return the loop nesting level of the specified block.  A
+  /// depth of 0 means the block is not inside any loop.
   ///
   unsigned getLoopDepth(const BlockT *BB) const {
-    const Loop *L = getLoopFor(BB);
+    const LoopBase<BlockT> *L = getLoopFor(BB);
     return L ? L->getLoopDepth() : 0;
   }
 
   // isLoopHeader - True if the block is a loop header node
   bool isLoopHeader(BlockT *BB) const {
-    const Loop *L = getLoopFor(BB);
+    const LoopBase<BlockT> *L = getLoopFor(BB);
     return L && L->getHeader() == BB;
   }
   
@@ -630,7 +723,7 @@ public:
   void removeBlock(BlockT *BB) {
     typename std::map<BlockT *, LoopBase<BlockT>*>::iterator I = BBMap.find(BB);
     if (I != BBMap.end()) {
-      for (Loop *L = I->second; L; L = L->getParentLoop())
+      for (LoopBase<BlockT> *L = I->second; L; L = L->getParentLoop())
         L->removeBlockFromLoop(BB);
 
       BBMap.erase(I);
@@ -639,13 +732,14 @@ public:
   
   // Internals
   
-  static bool isNotAlreadyContainedIn(Loop *SubLoop, Loop *ParentLoop) {
+  static bool isNotAlreadyContainedIn(LoopBase<BlockT> *SubLoop,
+                                      LoopBase<BlockT> *ParentLoop) {
     if (SubLoop == 0) return true;
     if (SubLoop == ParentLoop) return false;
     return isNotAlreadyContainedIn(SubLoop->getParentLoop(), ParentLoop);
   }
   
-  void Calculate(DominatorTree &DT) {
+  void Calculate(DominatorTreeBase<BlockT> &DT) {
     BlockT *RootNode = DT.getRootNode()->getBlock();
 
     for (df_iterator<BlockT*> NI = df_begin(RootNode),
@@ -654,14 +748,17 @@ public:
         TopLevelLoops.push_back(L);
   }
   
-  LoopBase<BlockT> *ConsiderForLoop(BlockT *BB, DominatorTree &DT) {
+  LoopBase<BlockT> *ConsiderForLoop(BlockT *BB, DominatorTreeBase<BlockT> &DT) {
     if (BBMap.find(BB) != BBMap.end()) return 0;// Haven't processed this node?
 
     std::vector<BlockT *> TodoStack;
 
     // Scan the predecessors of BB, checking to see if BB dominates any of
     // them.  This identifies backedges which target this node...
-    for (pred_iterator I = pred_begin(BB), E = pred_end(BB); I != E; ++I)
+    typedef GraphTraits<Inverse<BlockT*> > InvBlockTraits;
+    for (typename InvBlockTraits::ChildIteratorType I =
+         InvBlockTraits::child_begin(BB), E = InvBlockTraits::child_end(BB);
+         I != E; ++I)
       if (DT.dominates(BB, *I))   // If BB dominates it's predecessor...
         TodoStack.push_back(*I);
 
@@ -671,7 +768,7 @@ public:
     LoopBase<BlockT> *L = new LoopBase<BlockT>(BB);
     BBMap[BB] = L;
 
-    BlockT *EntryBlock = &BB->getParent()->getEntryBlock();
+    BlockT *EntryBlock = BB->getParent()->begin();
 
     while (!TodoStack.empty()) {  // Process all the nodes in the loop
       BlockT *X = TodoStack.back();
@@ -680,19 +777,20 @@ public:
       if (!L->contains(X) &&         // As of yet unprocessed??
           DT.dominates(EntryBlock, X)) {   // X is reachable from entry block?
         // Check to see if this block already belongs to a loop.  If this occurs
-        // then we have a case where a loop that is supposed to be a child of the
-        // current loop was processed before the current loop.  When this occurs,
-        // this child loop gets added to a part of the current loop, making it a
-        // sibling to the current loop.  We have to reparent this loop.
+        // then we have a case where a loop that is supposed to be a child of
+        // the current loop was processed before the current loop.  When this
+        // occurs, this child loop gets added to a part of the current loop,
+        // making it a sibling to the current loop.  We have to reparent this
+        // loop.
         if (LoopBase<BlockT> *SubLoop =
             const_cast<LoopBase<BlockT>*>(getLoopFor(X)))
-          if (SubLoop->getHeader() == X && isNotAlreadyContainedIn(SubLoop, L)) {
+          if (SubLoop->getHeader() == X && isNotAlreadyContainedIn(SubLoop, L)){
             // Remove the subloop from it's current parent...
             assert(SubLoop->ParentLoop && SubLoop->ParentLoop != L);
             LoopBase<BlockT> *SLP = SubLoop->ParentLoop;  // SubLoopParent
             typename std::vector<LoopBase<BlockT>*>::iterator I =
               std::find(SLP->SubLoops.begin(), SLP->SubLoops.end(), SubLoop);
-            assert(I != SLP->SubLoops.end() && "SubLoop not a child of parent?");
+            assert(I != SLP->SubLoops.end() &&"SubLoop not a child of parent?");
             SLP->SubLoops.erase(I);   // Remove from parent...
 
             // Add the subloop to THIS loop...
@@ -702,9 +800,12 @@ public:
 
         // Normal case, add the block to our loop...
         L->Blocks.push_back(X);
-
+        
+        typedef GraphTraits<Inverse<BlockT*> > InvBlockTraits;
+        
         // Add all of the predecessors of X to the end of the work stack...
-        TodoStack.insert(TodoStack.end(), pred_begin(X), pred_end(X));
+        TodoStack.insert(TodoStack.end(), InvBlockTraits::child_begin(X),
+                         InvBlockTraits::child_end(X));
       }
     }
 
@@ -728,8 +829,8 @@ public:
     }
 
     // Now that we have a list of all of the child loops of this loop, check to
-    // see if any of them should actually be nested inside of each other.  We can
-    // accidentally pull loops our of their parents, so we must make sure to
+    // see if any of them should actually be nested inside of each other.  We
+    // can accidentally pull loops our of their parents, so we must make sure to
     // organize the loop nests correctly now.
     {
       std::map<BlockT*, LoopBase<BlockT>*> ContainingLoops;
@@ -744,9 +845,9 @@ public:
           MoveSiblingLoopInto(Child, ContainingLoop);
           --i;  // The loop got removed from the SubLoops list.
         } else {
-          // This is currently considered to be a top-level loop.  Check to see if
-          // any of the contained blocks are loop headers for subloops we have
-          // already processed.
+          // This is currently considered to be a top-level loop.  Check to see
+          // if any of the contained blocks are loop headers for subloops we
+          // have already processed.
           for (unsigned b = 0, e = Child->Blocks.size(); b != e; ++b) {
             LoopBase<BlockT> *&BlockLoop = ContainingLoops[Child->Blocks[b]];
             if (BlockLoop == 0) {   // Child block not processed yet...
@@ -771,8 +872,8 @@ public:
     return L;
   }
   
-  /// MoveSiblingLoopInto - This method moves the NewChild loop to live inside of
-  /// the NewParent Loop, instead of being a sibling of it.
+  /// MoveSiblingLoopInto - This method moves the NewChild loop to live inside
+  /// of the NewParent Loop, instead of being a sibling of it.
   void MoveSiblingLoopInto(LoopBase<BlockT> *NewChild,
                            LoopBase<BlockT> *NewParent) {
     LoopBase<BlockT> *OldParent = NewChild->getParentLoop();
@@ -781,7 +882,8 @@ public:
 
     // Remove NewChild from being a child of OldParent
     typename std::vector<LoopBase<BlockT>*>::iterator I =
-      std::find(OldParent->SubLoops.begin(), OldParent->SubLoops.end(), NewChild);
+      std::find(OldParent->SubLoops.begin(), OldParent->SubLoops.end(),
+                NewChild);
     assert(I != OldParent->SubLoops.end() && "Parent fields incorrect??");
     OldParent->SubLoops.erase(I);   // Remove from parent's subloops list
     NewChild->ParentLoop = 0;
@@ -789,15 +891,17 @@ public:
     InsertLoopInto(NewChild, NewParent);
   }
   
-  /// InsertLoopInto - This inserts loop L into the specified parent loop.  If the
-  /// parent loop contains a loop which should contain L, the loop gets inserted
-  /// into L instead.
+  /// InsertLoopInto - This inserts loop L into the specified parent loop.  If
+  /// the parent loop contains a loop which should contain L, the loop gets
+  /// inserted into L instead.
   void InsertLoopInto(LoopBase<BlockT> *L, LoopBase<BlockT> *Parent) {
     BlockT *LHeader = L->getHeader();
-    assert(Parent->contains(LHeader) && "This loop should not be inserted here!");
+    assert(Parent->contains(LHeader) &&
+           "This loop should not be inserted here!");
 
     // Check to see if it belongs in a child loop...
-    for (unsigned i = 0, e = Parent->SubLoops.size(); i != e; ++i)
+    for (unsigned i = 0, e = static_cast<unsigned>(Parent->SubLoops.size());
+         i != e; ++i)
       if (Parent->SubLoops[i]->contains(LHeader)) {
         InsertLoopInto(L, Parent->SubLoops[i]);
         return;
@@ -826,7 +930,6 @@ class LoopInfo : public FunctionPass {
   LoopInfoBase<BasicBlock>* LI;
   friend class LoopBase<BasicBlock>;
   
-  LoopInfoBase<BasicBlock>& getBase() { return *LI; }
 public:
   static char ID; // Pass identification, replacement for typeid
 
@@ -836,6 +939,8 @@ public:
   
   ~LoopInfo() { delete LI; }
 
+  LoopInfoBase<BasicBlock>& getBase() { return *LI; }
+
   /// iterator/begin/end - The interface to the top-level loops in the current
   /// function.
   ///
@@ -856,7 +961,8 @@ public:
     return LI->getLoopFor(BB);
   }
 
-  /// getLoopDepth - Return the loop nesting level of the specified block...
+  /// getLoopDepth - Return the loop nesting level of the specified block.  A
+  /// depth of 0 means the block is not inside any loop.
   ///
   inline unsigned getLoopDepth(const BasicBlock *BB) const {
     return LI->getLoopDepth(BB);
@@ -941,13 +1047,11 @@ template <> struct GraphTraits<Loop*> {
 
 template<class BlockT>
 void LoopBase<BlockT>::addBasicBlockToLoop(BlockT *NewBB,
-                                           LoopInfo &LI) {
-  assert((Blocks.empty() || LI[getHeader()] == this) &&
+                                           LoopInfoBase<BlockT> &LIB) {
+  assert((Blocks.empty() || LIB[getHeader()] == this) &&
          "Incorrect LI specified for this loop!");
   assert(NewBB && "Cannot add a null basic block to the loop!");
-  assert(LI[NewBB] == 0 && "BasicBlock already in the loop!");
-
-  LoopInfoBase<BasicBlock>& LIB = LI.getBase();
+  assert(LIB[NewBB] == 0 && "BasicBlock already in the loop!");
 
   // Add the loop mapping to the LoopInfo object...
   LIB.BBMap[NewBB] = this;
@@ -962,7 +1066,4 @@ void LoopBase<BlockT>::addBasicBlockToLoop(BlockT *NewBB,
 
 } // End llvm namespace
 
-// Make sure that any clients of this file link in LoopInfo.cpp
-FORCE_DEFINING_FILE_TO_BE_LINKED(LoopInfo)
-
 #endif