Enhance the TD pass to build composite graphs when we have indirect call
[oota-llvm.git] / lib / Analysis / LoopInfo.cpp
index cf0468bf483186c371c2fa445db4dbf1022803c5..156d8b1bace4092a71cc64a2b83bcb797d889911 100644 (file)
 //
 //===----------------------------------------------------------------------===//
 
-#include "llvm/Analysis/Dominators.h"
 #include "llvm/Analysis/LoopInfo.h"
+#include "llvm/Constants.h"
+#include "llvm/Instructions.h"
+#include "llvm/Analysis/Dominators.h"
 #include "llvm/Assembly/Writer.h"
 #include "llvm/Support/CFG.h"
-#include "Support/DepthFirstIterator.h"
+#include "llvm/ADT/DepthFirstIterator.h"
 #include <algorithm>
+#include <iostream>
+
 using namespace llvm;
 
 static RegisterAnalysis<LoopInfo>
@@ -29,7 +33,7 @@ X("loops", "Natural Loop Construction", true);
 // Loop implementation
 //
 bool Loop::contains(const BasicBlock *BB) const {
-  return find(Blocks.begin(), Blocks.end(), BB) != Blocks.end();
+  return std::find(Blocks.begin(), Blocks.end(), BB) != Blocks.end();
 }
 
 bool Loop::isLoopExit(const BasicBlock *BB) const {
@@ -54,6 +58,14 @@ unsigned Loop::getNumBackEdges() const {
   return NumBackEdges;
 }
 
+/// isLoopInvariant - Return true if the specified value is loop invariant
+///
+bool Loop::isLoopInvariant(Value *V) const {
+  if (Instruction *I = dyn_cast<Instruction>(V))
+    return !contains(I->getParent());
+  return true;  // All non-instructions are loop invariant
+}
+
 void Loop::print(std::ostream &OS, unsigned Depth) const {
   OS << std::string(Depth*2, ' ') << "Loop Containing: ";
 
@@ -61,14 +73,6 @@ void Loop::print(std::ostream &OS, unsigned Depth) const {
     if (i) OS << ",";
     WriteAsOperand(OS, getBlocks()[i], false);
   }
-  if (!ExitBlocks.empty()) {
-    OS << "\tExitBlocks: ";
-    for (unsigned i = 0; i < getExitBlocks().size(); ++i) {
-      if (i) OS << ",";
-      WriteAsOperand(OS, getExitBlocks()[i], false);
-    }
-  }
-
   OS << "\n";
 
   for (iterator I = begin(), E = end(); I != E; ++I)
@@ -108,9 +112,6 @@ void LoopInfo::Calculate(const DominatorSet &DS) {
         NE = df_end(RootNode); NI != NE; ++NI)
     if (Loop *L = ConsiderForLoop(*NI, DS))
       TopLevelLoops.push_back(L);
-
-  for (unsigned i = 0; i < TopLevelLoops.size(); ++i)
-    TopLevelLoops[i]->setLoopDepth(1);
 }
 
 void LoopInfo::getAnalysisUsage(AnalysisUsage &AU) const {
@@ -118,14 +119,14 @@ void LoopInfo::getAnalysisUsage(AnalysisUsage &AU) const {
   AU.addRequired<DominatorSet>();
 }
 
-void LoopInfo::print(std::ostream &OS) const {
+void LoopInfo::print(std::ostream &OS, const Module* ) const {
   for (unsigned i = 0; i < TopLevelLoops.size(); ++i)
     TopLevelLoops[i]->print(OS);
 #if 0
   for (std::map<BasicBlock*, Loop*>::const_iterator I = BBMap.begin(),
          E = BBMap.end(); I != E; ++I)
     OS << "BB '" << I->first->getName() << "' level = "
-       << I->second->LoopDepth << "\n";
+       << I->second->getLoopDepth() << "\n";
 #endif
 }
 
@@ -246,14 +247,6 @@ Loop *LoopInfo::ConsiderForLoop(BasicBlock *BB, const DominatorSet &DS) {
     }
   }
 
-  // Now that we know all of the blocks that make up this loop, see if there are
-  // any branches to outside of the loop... building the ExitBlocks list.
-  for (std::vector<BasicBlock*>::iterator BI = L->Blocks.begin(),
-         BE = L->Blocks.end(); BI != BE; ++BI)
-    for (succ_iterator I = succ_begin(*BI), E = succ_end(*BI); I != E; ++I)
-      if (!L->contains(*I))               // Not in current loop?
-        L->ExitBlocks.push_back(*I);      // It must be an exit block...
-
   return L;
 }
 
@@ -313,15 +306,53 @@ void LoopInfo::changeTopLevelLoop(Loop *OldLoop, Loop *NewLoop) {
          "Loops already embedded into a subloop!");
 }
 
+/// removeLoop - This removes the specified top-level loop from this loop info
+/// object.  The loop is not deleted, as it will presumably be inserted into
+/// another loop.
+Loop *LoopInfo::removeLoop(iterator I) {
+  assert(I != end() && "Cannot remove end iterator!");
+  Loop *L = *I;
+  assert(L->getParentLoop() == 0 && "Not a top-level loop!");
+  TopLevelLoops.erase(TopLevelLoops.begin() + (I-begin()));
+  return L;
+}
+
+/// removeBlock - This method completely removes BB from all data structures,
+/// including all of the Loop objects it is nested in and our mapping from
+/// BasicBlocks to loops.
+void LoopInfo::removeBlock(BasicBlock *BB) {
+  std::map<BasicBlock *, Loop*>::iterator I = BBMap.find(BB);
+  if (I != BBMap.end()) {
+    for (Loop *L = I->second; L; L = L->getParentLoop())
+      L->removeBlockFromLoop(BB);
+    
+    BBMap.erase(I);
+  }
+}
+
+
+//===----------------------------------------------------------------------===//
+// APIs for simple analysis of the loop.
+//
+
+/// getExitBlocks - Return all of the successor blocks of this loop.  These
+/// are the blocks _outside of the current loop_ which are branched to.
+///
+void Loop::getExitBlocks(std::vector<BasicBlock*> &ExitBlocks) const {
+  for (std::vector<BasicBlock*>::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)
+      if (!contains(*I))               // Not in current loop?
+        ExitBlocks.push_back(*I);          // It must be an exit block...
+}
+
+
 /// 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
-/// header of the loop is the preheader node.  The "preheaders" pass can be
-/// "Required" to ensure that there is always a preheader node for every loop.
+/// header of the loop is the preheader node.
 ///
-/// This method returns null if there is no preheader for the loop (either
-/// because the loop is dead or because multiple blocks branch to the header
-/// node of this loop).
+/// This method returns null if there is no preheader for the loop.
 ///
 BasicBlock *Loop::getLoopPreheader() const {
   // Keep track of nodes outside the loop branching to the header...
@@ -349,6 +380,88 @@ BasicBlock *Loop::getLoopPreheader() const {
   return Out;
 }
 
+/// getCanonicalInductionVariable - Check to see if the loop has a canonical
+/// induction variable: an integer recurrence that starts at 0 and increments by
+/// one each time through the loop.  If so, return the phi node that corresponds
+/// to it.
+///
+PHINode *Loop::getCanonicalInductionVariable() const {
+  BasicBlock *H = getHeader();
+
+  BasicBlock *Incoming = 0, *Backedge = 0;
+  pred_iterator PI = pred_begin(H);
+  assert(PI != pred_end(H) && "Loop must have at least one backedge!");
+  Backedge = *PI++;
+  if (PI == pred_end(H)) return 0;  // dead loop
+  Incoming = *PI++;
+  if (PI != pred_end(H)) return 0;  // multiple backedges?
+
+  if (contains(Incoming)) {
+    if (contains(Backedge))
+      return 0;
+    std::swap(Incoming, Backedge);
+  } else if (!contains(Backedge))
+    return 0;
+
+  // Loop over all of the PHI nodes, looking for a canonical indvar.
+  for (BasicBlock::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;
+  }
+  return 0;
+}
+
+/// getCanonicalInductionVariableIncrement - Return the LLVM value that holds
+/// the canonical induction variable value for the "next" iteration of the loop.
+/// This always succeeds if getCanonicalInductionVariable succeeds.
+///
+Instruction *Loop::getCanonicalInductionVariableIncrement() const {
+  if (PHINode *PN = getCanonicalInductionVariable()) {
+    bool P1InLoop = contains(PN->getIncomingBlock(1));
+    return cast<Instruction>(PN->getIncomingValue(P1InLoop));
+  }
+  return 0;
+}
+
+/// getTripCount - Return a loop-invariant LLVM value indicating the number of
+/// times the loop will be executed.  Note that this means that the backedge of
+/// the loop executes N-1 times.  If the trip-count cannot be determined, this
+/// returns null.
+///
+Value *Loop::getTripCount() const {
+  // Canonical loops will end with a 'setne I, V', where I is the incremented
+  // canonical induction variable and V is the trip count of the loop.
+  Instruction *Inc = getCanonicalInductionVariableIncrement();
+  if (Inc == 0) return 0;
+  PHINode *IV = cast<PHINode>(Inc->getOperand(0));
+  
+  BasicBlock *BackedgeBlock =
+    IV->getIncomingBlock(contains(IV->getIncomingBlock(1)));
+
+  if (BranchInst *BI = dyn_cast<BranchInst>(BackedgeBlock->getTerminator()))
+    if (BI->isConditional())
+      if (SetCondInst *SCI = dyn_cast<SetCondInst>(BI->getCondition()))
+        if (SCI->getOperand(0) == Inc)
+          if (BI->getSuccessor(0) == getHeader()) {
+            if (SCI->getOpcode() == Instruction::SetNE)
+              return SCI->getOperand(1);
+          } else if (SCI->getOpcode() == Instruction::SetEQ) {
+            return SCI->getOperand(1);
+          }
+  
+  return 0;
+}
+
+
+//===-------------------------------------------------------------------===//
+// APIs for updating loop information after changing the CFG
+//
+
 /// addBasicBlockToLoop - This function is used by other analyses to update loop
 /// information.  NewBB is set to be a new member of the current loop.  Because
 /// of this, it is added as a member of all parent loops, and is added to the
@@ -372,22 +485,6 @@ void Loop::addBasicBlockToLoop(BasicBlock *NewBB, LoopInfo &LI) {
   }
 }
 
-/// changeExitBlock - This method is used to update loop information.  All
-/// instances of the specified Old basic block are removed from the exit list
-/// and replaced with New.
-///
-void Loop::changeExitBlock(BasicBlock *Old, BasicBlock *New) {
-  assert(Old != New && "Cannot changeExitBlock to the same thing!");
-  assert(Old && New && "Cannot changeExitBlock to or from a null node!");
-  assert(hasExitBlock(Old) && "Old exit block not found!");
-  std::vector<BasicBlock*>::iterator
-    I = std::find(ExitBlocks.begin(), ExitBlocks.end(), Old);
-  while (I != ExitBlocks.end()) {
-    *I = New;
-    I = std::find(I+1, ExitBlocks.end(), Old);
-  }
-}
-
 /// replaceChildLoopWith - This is used when splitting loops up.  It replaces
 /// the OldChild entry in our children list with NewChild, and updates the
 /// parent pointers of the two loops as appropriate.
@@ -400,9 +497,6 @@ void Loop::replaceChildLoopWith(Loop *OldChild, Loop *NewChild) {
   *I = NewChild;
   OldChild->ParentLoop = 0;
   NewChild->ParentLoop = this;
-
-  // Update the loop depth of the new child.
-  NewChild->setLoopDepth(LoopDepth+1);
 }
 
 /// addChildLoop - Add the specified loop to be a child of this loop.
@@ -411,9 +505,6 @@ void Loop::addChildLoop(Loop *NewChild) {
   assert(NewChild->ParentLoop == 0 && "NewChild already has a parent!");
   NewChild->ParentLoop = this;
   SubLoops.push_back(NewChild);
-
-  // Update the loop depth of the new child.
-  NewChild->setLoopDepth(LoopDepth+1);
 }
 
 template<typename T>
@@ -441,15 +532,4 @@ Loop *Loop::removeChildLoop(iterator I) {
 /// does not update the mapping in the LoopInfo class.
 void Loop::removeBlockFromLoop(BasicBlock *BB) {
   RemoveFromVector(Blocks, BB);
-
-  // If this block branched out of this loop, remove any exit blocks entries due
-  // to it.
-  for (succ_iterator SI = succ_begin(BB), E = succ_end(BB); SI != E; ++SI)
-    if (!contains(*SI) && *SI != BB)
-      RemoveFromVector(ExitBlocks, *SI);
-
-  // If any blocks in this loop branch to BB, add it to the exit blocks set.
-  for (pred_iterator PI = pred_begin(BB), E = pred_end(BB); PI != E; ++PI)
-    if (contains(*PI))
-      ExitBlocks.push_back(BB);
 }