aboutsummaryrefslogtreecommitdiff
path: root/lib/Analysis/LoopDepth.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Analysis/LoopDepth.cpp')
-rw-r--r--lib/Analysis/LoopDepth.cpp46
1 files changed, 46 insertions, 0 deletions
diff --git a/lib/Analysis/LoopDepth.cpp b/lib/Analysis/LoopDepth.cpp
new file mode 100644
index 0000000000..67576e200b
--- /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;
+}