# HG changeset patch # User kvn # Date 1203553183 28800 # Node ID 953939ef62ab3a8e6fbbf3ecb76645a3bd2b3df7 # Parent 9bdad1bb1c3170428c15b31150f489309b609ddc 6614330: Node::dump(n) does not print full graph for specified depth. Summary: A node is not processed in dump_nodes() if it was visited during processing previous inputs. Reviewed-by: rasbold diff -r 9bdad1bb1c31 -r 953939ef62ab src/share/vm/opto/node.cpp --- a/src/share/vm/opto/node.cpp Tue Feb 12 18:37:50 2008 -0800 +++ b/src/share/vm/opto/node.cpp Wed Feb 20 16:19:43 2008 -0800 @@ -1486,70 +1486,75 @@ Node* s = (Node*)start; // remove const if (NotANode(s)) return; + uint depth = (uint)ABS(d); + int direction = d; Compile* C = Compile::current(); ResourceArea *area = Thread::current()->resource_area(); - Node_Stack stack(area, MIN2((uint)ABS(d), C->unique() >> 1)); - OldNewVectorSet visited(C->node_arena(), area); + Node_Stack stack(area, MIN2(depth, C->unique() >> 1)); + OldNewVectorSet dumped(C->node_arena(), area); OldNewVectorSet on_stack(C->node_arena(), area); - visited.set(s); on_stack.set(s); stack.push(s, 0); - if (d < 0) s->dump(); + if (direction < 0) { + dumped.set(s); + s->dump(); + } // Do a depth first walk over edges while (stack.is_nonempty()) { Node* tp = stack.node(); uint idx = stack.index(); - uint limit = d > 0 ? tp->len() : tp->outcnt(); + uint limit; + // Limit depth + if (stack.size() < depth) { + limit = direction > 0 ? tp->len() : tp->outcnt(); + } else { + limit = 0; // reached depth limit. + } if (idx >= limit) { // no more arcs to visit - if (d > 0) tp->dump(); + if (direction > 0 && !dumped.test_set(tp)) tp->dump(); on_stack.del(tp); stack.pop(); } else { // process the "idx"th arc stack.set_index(idx + 1); - Node* n = d > 0 ? tp->in(idx) : tp->raw_out(idx); + Node* n = direction > 0 ? tp->in(idx) : tp->raw_out(idx); if (NotANode(n)) continue; // do not recurse through top or the root (would reach unrelated stuff) if (n->is_Root() || n->is_top()) continue; if (only_ctrl && !n->is_CFG()) continue; - if (!visited.test_set(n)) { // forward arc - // Limit depth - if (stack.size() < (uint)ABS(d)) { - if (d < 0) n->dump(); - stack.push(n, 0); - on_stack.set(n); - } + if (!on_stack.test(n)) { // forward arc + if (direction < 0 && !dumped.test_set(n)) n->dump(); + stack.push(n, 0); + on_stack.set(n); } else { // back or cross arc - if (on_stack.test(n)) { // back arc - // print loop if there are no phis or regions in the mix - bool found_loop_breaker = false; - int k; - for (k = stack.size() - 1; k >= 0; k--) { - Node* m = stack.node_at(k); - if (m->is_Phi() || m->is_Region() || m->is_Root() || m->is_Start()) { - found_loop_breaker = true; - break; - } - if (m == n) // Found loop head - break; + // print loop if there are no phis or regions in the mix + bool found_loop_breaker = false; + int k; + for (k = stack.size() - 1; k >= 0; k--) { + Node* m = stack.node_at(k); + if (m->is_Phi() || m->is_Region() || m->is_Root() || m->is_Start()) { + found_loop_breaker = true; + break; } - assert(k >= 0, "n must be on stack"); + if (m == n) // Found loop head + break; + } + assert(k >= 0, "n must be on stack"); - if (!found_loop_breaker) { - tty->print("# %s LOOP FOUND:", only_ctrl ? "CONTROL" : "DATA"); - for (int i = stack.size() - 1; i >= k; i--) { - Node* m = stack.node_at(i); - bool mnew = C->node_arena()->contains(m); - tty->print(" %s%d:%s", (mnew? "": "o"), m->_idx, m->Name()); - if (i != 0) tty->print(d > 0? " <-": " ->"); - } - tty->cr(); + if (!found_loop_breaker) { + tty->print("# %s LOOP FOUND:", only_ctrl ? "CONTROL" : "DATA"); + for (int i = stack.size() - 1; i >= k; i--) { + Node* m = stack.node_at(i); + bool mnew = C->node_arena()->contains(m); + tty->print(" %s%d:%s", (mnew? "": "o"), m->_idx, m->Name()); + if (i != 0) tty->print(direction > 0? " <-": " ->"); } + tty->cr(); } } }