Make comments above APIs reflect what they should do.
[oota-llvm.git] / include / llvm / Analysis / IntervalIterator.h
index 52d2cc807d9bda067b2e60f83b6f86f3d61d2b22..091959f25fa0e43915e1f53e394281597f5649da 100644 (file)
@@ -1,10 +1,17 @@
-//===- IntervalIterator.h - Interval Iterator Declaration --------*- C++ -*--=//
+//===- IntervalIterator.h - Interval Iterator Declaration -------*- C++ -*-===//
+// 
+//                     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 defines an iterator that enumerates the intervals in a control flow
 // graph of some sort.  This iterator is parametric, allowing iterator over the
 // following types of graphs:
 // 
-//  1. A Method* object, composed of BasicBlock nodes.
+//  1. A Function* object, composed of BasicBlock nodes.
 //  2. An IntervalPartition& object, composed of Interval nodes.
 //
 // This iterator is defined to walk the control flow graph, returning intervals
 #define LLVM_INTERVAL_ITERATOR_H
 
 #include "llvm/Analysis/IntervalPartition.h"
-#include "llvm/Method.h"
+#include "llvm/Function.h"
+#include "llvm/Support/CFG.h"
 #include <stack>
 #include <set>
 #include <algorithm>
 
-namespace cfg {
+namespace llvm {
 
 // getNodeHeader - Given a source graph node and the source graph, return the 
 // BasicBlock that is the header node.  This is the opposite of
@@ -45,7 +53,7 @@ inline BasicBlock *getNodeHeader(Interval *I) { return I->getHeaderNode(); }
 // source graph node that corresponds to the BasicBlock.  This is the opposite
 // of getNodeHeader.
 //
-inline BasicBlock *getSourceGraphNode(Method *, BasicBlock *BB) {
+inline BasicBlock *getSourceGraphNode(Function *, BasicBlock *BB) {
   return BB; 
 }
 inline Interval *getSourceGraphNode(IntervalPartition *IP, BasicBlock *BB) { 
@@ -77,7 +85,8 @@ inline void addNodeToInterval(Interval *Int, Interval *I) {
 
 
 
-template<class NodeTy, class OrigContainer_t>
+template<class NodeTy, class OrigContainer_t, class GT = GraphTraits<NodeTy*>,
+         class IGT = GraphTraits<Inverse<NodeTy*> > >
 class IntervalIterator {
   std::stack<std::pair<Interval*, typename Interval::succ_iterator> > IntStack;
   std::set<BasicBlock*> Visited;
@@ -91,9 +100,9 @@ public:
   typedef std::forward_iterator_tag iterator_category;
  
   IntervalIterator() {} // End iterator, empty stack
-  IntervalIterator(Method *M, bool OwnMemory) : IOwnMem(OwnMemory) {
+  IntervalIterator(Function *M, bool OwnMemory) : IOwnMem(OwnMemory) {
     OrigContainer = M;
-    if (!ProcessInterval(M->front())) {
+    if (!ProcessInterval(&M->front())) {
       assert(0 && "ProcessInterval should never fail for first interval!");
     }
   }
@@ -127,14 +136,14 @@ public:
       // All of the intervals on the stack have been visited.  Try visiting
       // their successors now.
       Interval::succ_iterator &SuccIt = IntStack.top().second,
-                               EndIt = IntStack.top().first->succ_end();
+                               EndIt = succ_end(IntStack.top().first);
       while (SuccIt != EndIt) {                 // Loop over all interval succs
        bool Done = ProcessInterval(getSourceGraphNode(OrigContainer, *SuccIt));
        ++SuccIt;                               // Increment iterator
        if (Done) return *this;                 // Found a new interval! Use it!
       }
 
-      // Free interval memory... if neccesary
+      // Free interval memory... if necessary
       if (IOwnMem) delete IntStack.top().first;
 
       // We ran out of successors for this interval... pop off the stack
@@ -164,11 +173,11 @@ private:
     Visited.insert(Header);   // The header has now been visited!
 
     // Check all of our successors to see if they are in the interval...
-    for (typename NodeTy::succ_iterator I = Node->succ_begin(),
-                                        E = Node->succ_end(); I != E; ++I)
+    for (typename GT::ChildIteratorType I = GT::child_begin(Node),
+           E = GT::child_end(Node); I != E; ++I)
       ProcessNode(Int, getSourceGraphNode(OrigContainer, *I));
 
-    IntStack.push(make_pair(Int, Int->succ_begin()));
+    IntStack.push(make_pair(Int, succ_begin(Int)));
     return true;
   }
   
@@ -195,8 +204,8 @@ private:
          Int->Successors.push_back(NodeHeader);
       }
     } else {                             // Otherwise, not in interval yet
-      for (typename NodeTy::pred_iterator I = Node->pred_begin(), 
-                                         E = Node->pred_end(); I != E; ++I) {
+      for (typename IGT::ChildIteratorType I = IGT::child_begin(Node), 
+             E = IGT::child_end(Node); I != E; ++I) {
        if (!Int->contains(*I)) {        // If pred not in interval, we can't be
          if (!Int->isSuccessor(NodeHeader)) // Add only if not already in set
            Int->Successors.push_back(NodeHeader);
@@ -218,23 +227,23 @@ private:
     
       // Now that we have discovered that Node is in the interval, perhaps some
       // of its successors are as well?
-      for (typename NodeTy::succ_iterator It = Node->succ_begin(), 
-            End = Node->succ_end(); It != End; ++It)
+      for (typename GT::ChildIteratorType It = GT::child_begin(Node),
+            End = GT::child_end(Node); It != End; ++It)
        ProcessNode(Int, getSourceGraphNode(OrigContainer, *It));
     }
   }
 };
 
-typedef IntervalIterator<BasicBlock, Method> method_interval_iterator;
+typedef IntervalIterator<BasicBlock, Function> function_interval_iterator;
 typedef IntervalIterator<Interval, IntervalPartition> interval_part_interval_iterator;
 
 
-inline method_interval_iterator intervals_begin(Method *M
-                                               bool DeleteInts = true) {
-  return method_interval_iterator(M, DeleteInts);
+inline function_interval_iterator intervals_begin(Function *F
+                                                  bool DeleteInts = true) {
+  return function_interval_iterator(F, DeleteInts);
 }
-inline method_interval_iterator intervals_end(Method *M) {
-  return method_interval_iterator();
+inline function_interval_iterator intervals_end(Function *) {
+  return function_interval_iterator();
 }
 
 inline interval_part_interval_iterator 
@@ -246,6 +255,6 @@ inline interval_part_interval_iterator intervals_end(IntervalPartition &IP) {
   return interval_part_interval_iterator();
 }
 
-}    // End namespace cfg
+} // End llvm namespace
 
 #endif