< prev index next >

src/share/vm/opto/gcm.cpp

Print this page

        

@@ -1736,10 +1736,33 @@
     ch->compute_loop_depth(depth + 1);
     ch = ch->_sibling;
   }
 }
 
+Block *CFGLoop::backedge_block() {
+  Block* hd = head();
+  Block* back_edge = NULL;
+  assert(_members.length() > 0, "no empty loops");
+  for (int i = 0; i < _members.length(); i++) {
+    CFGElement* s = _members.at(i);
+    if (s->is_block()) {
+      Block* b = s->as_Block();
+      if (b == hd) continue;
+      for (uint j = 0; j < b->_num_succs; j++) {
+        Block* sb = b->_succs[j];
+        if (sb == hd) {
+          back_edge = b;
+          break;
+        }
+      }
+    }
+    if (back_edge) break;
+  }
+
+  return back_edge;
+}
+
 //------------------------------compute_freq-----------------------------------
 // Compute the frequency of each block and loop, relative to a single entry
 // into the dominating loop head.
 void CFGLoop::compute_freq() {
   // Bottom up traversal of loop tree (visit inner loops first.)
< prev index next >