IntervalPartition: recode to use IntervalIterator to do all the work

LoopDepth.cpp: new file that calculates the depth of a loop, using
IntervalPartitions.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@71 91177308-0d34-0410-b5e6-96231b3b80d8
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;
+}