diff --git a/lib/Analysis/IntervalPartition.cpp b/lib/Analysis/IntervalPartition.cpp
index 8410477..f820d7a 100644
--- a/lib/Analysis/IntervalPartition.cpp
+++ b/lib/Analysis/IntervalPartition.cpp
@@ -20,118 +20,19 @@
   for_each(begin(), end(), deleter<cfg::Interval>);
 }
 
-// addNodeToInterval - This method exists to assist the generic ProcessNode
-// with the task of adding a node to the new interval, depending on the 
-// type of the source node.  In the case of a CFG source graph (BasicBlock 
-// case), the BasicBlock itself is added to the interval.
+// addIntervalToPartition - Add an interval to the internal list of intervals,
+// and then add mappings from all of the basic blocks in the interval to the
+// interval itself (in the IntervalMap).
 //
-inline void IntervalPartition::addNodeToInterval(Interval *Int, BasicBlock *BB){
-  Int->Nodes.push_back(BB);
-  IntervalMap.insert(make_pair(BB, Int));
-}
-
-// addNodeToInterval - This method exists to assist the generic ProcessNode
-// with the task of adding a node to the new interval, depending on the 
-// type of the source node.  In the case of a CFG source graph (BasicBlock 
-// case), the BasicBlock itself is added to the interval.  In the case of
-// an IntervalPartition source graph (Interval case), all of the member
-// BasicBlocks are added to the interval.
-//
-inline void IntervalPartition::addNodeToInterval(Interval *Int, Interval *I) {
-  // Add all of the nodes in I as new nodes in Int.
-  copy(I->Nodes.begin(), I->Nodes.end(), back_inserter(Int->Nodes));
+void IntervalPartition::addIntervalToPartition(Interval *I) {
+  IntervalList.push_back(I);
 
   // Add mappings for all of the basic blocks in I to the IntervalPartition
   for (Interval::node_iterator It = I->Nodes.begin(), End = I->Nodes.end();
        It != End; ++It)
-    IntervalMap.insert(make_pair(*It, Int));
+    IntervalMap.insert(make_pair(*It, I));
 }
 
-
-// ProcessNode - This method is called by ProcessInterval to add nodes to the
-// interval being constructed, and it is also called recursively as it walks
-// the source graph.  A node is added to the current interval only if all of
-// its predecessors are already in the graph.  This also takes care of keeping
-// the successor set of an interval up to date.
-//
-// This method is templated because it may operate on two different source
-// graphs: a basic block graph, or a preexisting interval graph.
-//
-template<class NodeTy, class OrigContainer>
-void IntervalPartition::ProcessNode(Interval *Int, 
-				    NodeTy *Node, OrigContainer *OC) {
-  assert(Int && "Null interval == bad!");
-  assert(Node && "Null Node == bad!");
-  
-  BasicBlock *NodeHeader = getNodeHeader(Node);
-  Interval *CurInt = getBlockInterval(NodeHeader);
-  if (CurInt == Int) {                  // Already in this interval...
-    return;
-  } else if (CurInt != 0) {             // In another interval, add as successor
-    if (!Int->isSuccessor(NodeHeader))  // Add only if not already in set
-      Int->Successors.push_back(NodeHeader);
-  } else {                              // Otherwise, not in interval yet
-    for (typename NodeTy::pred_iterator I = pred_begin(Node), 
-                                        E = pred_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);
-	return;                         // See you later
-      }
-    }
-    
-    // If we get here, then all of the predecessors of BB are in the interval
-    // already.  In this case, we must add BB to the interval!
-    addNodeToInterval(Int, Node);
-    
-    if (Int->isSuccessor(NodeHeader)) {
-      // If we were in the successor list from before... remove from succ list
-      Int->Successors.erase(remove(Int->Successors.begin(),
-				   Int->Successors.end(), NodeHeader), 
-			    Int->Successors.end());
-    }
-    
-    // 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 = succ_begin(Node), 
-                                       End = succ_end(Node); It != End; ++It)
-      ProcessNode(Int, getSourceGraphNode(OC, *It), OC);
-  }
-}
-
-
-// ProcessInterval - This method is used during the construction of the 
-// interval graph.  It walks through the source graph, recursively creating
-// an interval per invokation until the entire graph is covered.  This uses
-// the ProcessNode method to add all of the nodes to the interval.
-//
-// This method is templated because it may operate on two different source
-// graphs: a basic block graph, or a preexisting interval graph.
-//
-template<class NodeTy, class OrigContainer>
-void IntervalPartition::ProcessInterval(NodeTy *Node, OrigContainer *OC) {
-  BasicBlock *Header = getNodeHeader(Node);
-  if (getBlockInterval(Header)) return;  // Interval already constructed?
-
-  // Create a new interval and add the interval to our current set
-  Interval *Int = new Interval(Header);
-  IntervalList.push_back(Int);
-  IntervalMap.insert(make_pair(Header, Int));
-
-  // Check all of our successors to see if they are in the interval...
-  for (typename NodeTy::succ_iterator I = succ_begin(Node), E = succ_end(Node); 
-       I != E; ++I)
-    ProcessNode(Int, getSourceGraphNode(OC, *I), OC);
-
-  // Build all of the successor intervals of this interval now...
-  for(Interval::succ_iterator I = Int->Successors.begin(), 
-                              E = Int->Successors.end(); I != E; ++I) {
-    ProcessInterval(getSourceGraphNode(OC, *I), OC);
-  }
-}
-
-
-
 // updatePredecessors - Interval generation only sets the successor fields of
 // the interval data structures.  After interval generation is complete,
 // run through all of the intervals and propogate successor info as
@@ -144,22 +45,26 @@
     getBlockInterval(*I)->Predecessors.push_back(Header);
 }
 
-
-
 // IntervalPartition ctor - Build the first level interval partition for the
 // specified method...
 //
 IntervalPartition::IntervalPartition(Method *M) {
-  BasicBlock *MethodStart = M->getBasicBlocks().front();
-  assert(MethodStart && "Cannot operate on prototypes!");
+  assert(M->getBasicBlocks().front() && "Cannot operate on prototypes!");
 
-  ProcessInterval(MethodStart, M);
-  RootInterval = getBlockInterval(MethodStart);
+  // Pass false to intervals_begin because we take ownership of it's memory
+  method_interval_iterator I = intervals_begin(M, false);
+  method_interval_iterator End = intervals_end(M);
+  assert(I != End && "No intervals in method!?!?!");
+
+  addIntervalToPartition(RootInterval = *I);
+
+  for (++I; I != End; ++I)
+    addIntervalToPartition(*I);
 
   // Now that we know all of the successor information, propogate this to the
   // predecessors for each block...
-  for(iterator I = begin(), E = end(); I != E; ++I)
-    updatePredecessors(*I);
+  for(iterator It = begin(), E = end(); It != E; ++It)
+    updatePredecessors(*It);
 }
 
 
@@ -167,12 +72,19 @@
 // existing interval graph.  This takes an additional boolean parameter to
 // distinguish it from a copy constructor.  Always pass in false for now.
 //
-IntervalPartition::IntervalPartition(IntervalPartition &I, bool) {
-  Interval *MethodStart = I.getRootInterval();
+IntervalPartition::IntervalPartition(IntervalPartition &IP, bool) {
+  Interval *MethodStart = IP.getRootInterval();
   assert(MethodStart && "Cannot operate on empty IntervalPartitions!");
 
-  ProcessInterval(MethodStart, &I);
-  RootInterval = getBlockInterval(*MethodStart->Nodes.begin());
+  // Pass false to intervals_begin because we take ownership of it's memory
+  interval_part_interval_iterator I = intervals_begin(IP, false);
+  interval_part_interval_iterator End = intervals_end(IP);
+  assert(I != End && "No intervals in interval partition!?!?!");
+
+  addIntervalToPartition(RootInterval = *I);
+
+  for (++I; I != End; ++I)
+    addIntervalToPartition(*I);
 
   // Now that we know all of the successor information, propogate this to the
   // predecessors for each block...
diff --git a/lib/Analysis/LoopDepth.cpp b/lib/Analysis/LoopDepth.cpp
new file mode 100644
index 0000000..67576e2
--- /dev/null
+++ b/lib/Analysis/LoopDepth.cpp
@@ -0,0 +1,46 @@
+//===- LoopDepth.cpp - Loop Dpeth Calculation --------------------*- C++ -*--=//
+//
+// This file provides a simple class to calculate the loop depth of a 
+// BasicBlock.
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/Analysis/LoopDepth.h"
+#include "llvm/Analysis/IntervalPartition.h"
+#include "llvm/Tools/STLExtras.h"
+#include <algorithm>
+
+inline void LoopDepthCalculator::AddBB(const BasicBlock *BB) {
+  ++LoopDepth[BB];   // Increment the loop depth count for the specified BB
+}
+
+inline void LoopDepthCalculator::ProcessInterval(cfg::Interval *I) {
+  if (!I->isLoop()) return;  // Ignore nonlooping intervals...
+
+  for_each(I->Nodes.begin(), I->Nodes.end(), 
+	   bind_obj(this, &LoopDepthCalculator::AddBB));
+}
+
+LoopDepthCalculator::LoopDepthCalculator(Method *M) {
+  //map<const BasicBlock*, unsigned> LoopDepth;
+
+  cfg::IntervalPartition *IP = new cfg::IntervalPartition(M);
+  while (!IP->isDegeneratePartition()) {
+    for_each(IP->begin(), IP->end(), 
+	     bind_obj(this, &LoopDepthCalculator::ProcessInterval));
+
+    // Calculate the reduced version of this graph until we get to an 
+    // irreducible graph or a degenerate graph...
+    //
+    cfg::IntervalPartition *NewIP = new cfg::IntervalPartition(*IP, true);
+    if (NewIP->size() == IP->size()) {
+      cerr << "IRREDUCIBLE GRAPH FOUND!!!\n";
+      // TODO: fix irreducible graph
+      return;
+    }
+    delete IP;
+    IP = NewIP;
+  }
+
+  delete IP;
+}
