Add a note about a potential PIC optimization.
[oota-llvm.git] / include / llvm / Analysis / LoopInfo.h
index a9c56a8e317f9f1d3916d370aeb9626f572452d9..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();
@@ -141,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
@@ -288,8 +297,8 @@ public:
     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;
   }
 
@@ -327,7 +336,7 @@ 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;
@@ -351,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;
   }
@@ -365,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));
@@ -378,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();
@@ -391,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();
@@ -421,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;
         }
@@ -549,8 +616,6 @@ private:
   }
 };
 
-typedef LoopBase<BasicBlock> Loop;
-
 
 //===----------------------------------------------------------------------===//
 /// LoopInfo - This class builds and contains all of the top level loop
@@ -573,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();
   }
   
@@ -599,7 +664,8 @@ 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 LoopBase<BlockT> *L = getLoopFor(BB);
@@ -702,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();
@@ -711,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...
@@ -762,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;
@@ -778,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...
@@ -805,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();
@@ -815,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;
@@ -823,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;
@@ -891,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);
@@ -995,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