6614330: Node::dump(n) does not print full graph for specified depth

A node is not processed in dump_nodes() if it was visited during processing previous inputs.

Reviewed-by: rasbold
This commit is contained in:
Vladimir Kozlov 2008-02-20 16:19:43 -08:00
parent 90815abd51
commit 5ade869e8c

View File

@ -1486,70 +1486,75 @@ static void dump_nodes(const Node* start, int d, bool only_ctrl) {
Node* s = (Node*)start; // remove const Node* s = (Node*)start; // remove const
if (NotANode(s)) return; if (NotANode(s)) return;
uint depth = (uint)ABS(d);
int direction = d;
Compile* C = Compile::current(); Compile* C = Compile::current();
ResourceArea *area = Thread::current()->resource_area(); ResourceArea *area = Thread::current()->resource_area();
Node_Stack stack(area, MIN2((uint)ABS(d), C->unique() >> 1)); Node_Stack stack(area, MIN2(depth, C->unique() >> 1));
OldNewVectorSet visited(C->node_arena(), area); OldNewVectorSet dumped(C->node_arena(), area);
OldNewVectorSet on_stack(C->node_arena(), area); OldNewVectorSet on_stack(C->node_arena(), area);
visited.set(s);
on_stack.set(s); on_stack.set(s);
stack.push(s, 0); stack.push(s, 0);
if (d < 0) s->dump(); if (direction < 0) {
dumped.set(s);
s->dump();
}
// Do a depth first walk over edges // Do a depth first walk over edges
while (stack.is_nonempty()) { while (stack.is_nonempty()) {
Node* tp = stack.node(); Node* tp = stack.node();
uint idx = stack.index(); 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) { if (idx >= limit) {
// no more arcs to visit // no more arcs to visit
if (d > 0) tp->dump(); if (direction > 0 && !dumped.test_set(tp)) tp->dump();
on_stack.del(tp); on_stack.del(tp);
stack.pop(); stack.pop();
} else { } else {
// process the "idx"th arc // process the "idx"th arc
stack.set_index(idx + 1); 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; if (NotANode(n)) continue;
// do not recurse through top or the root (would reach unrelated stuff) // do not recurse through top or the root (would reach unrelated stuff)
if (n->is_Root() || n->is_top()) continue; if (n->is_Root() || n->is_top()) continue;
if (only_ctrl && !n->is_CFG()) continue; if (only_ctrl && !n->is_CFG()) continue;
if (!visited.test_set(n)) { // forward arc if (!on_stack.test(n)) { // forward arc
// Limit depth if (direction < 0 && !dumped.test_set(n)) n->dump();
if (stack.size() < (uint)ABS(d)) { stack.push(n, 0);
if (d < 0) n->dump(); on_stack.set(n);
stack.push(n, 0);
on_stack.set(n);
}
} else { // back or cross arc } else { // back or cross arc
if (on_stack.test(n)) { // back arc // print loop if there are no phis or regions in the mix
// print loop if there are no phis or regions in the mix bool found_loop_breaker = false;
bool found_loop_breaker = false; int k;
int k; for (k = stack.size() - 1; k >= 0; k--) {
for (k = stack.size() - 1; k >= 0; k--) { Node* m = stack.node_at(k);
Node* m = stack.node_at(k); if (m->is_Phi() || m->is_Region() || m->is_Root() || m->is_Start()) {
if (m->is_Phi() || m->is_Region() || m->is_Root() || m->is_Start()) { found_loop_breaker = true;
found_loop_breaker = true; break;
break;
}
if (m == n) // Found loop head
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) { if (!found_loop_breaker) {
tty->print("# %s LOOP FOUND:", only_ctrl ? "CONTROL" : "DATA"); tty->print("# %s LOOP FOUND:", only_ctrl ? "CONTROL" : "DATA");
for (int i = stack.size() - 1; i >= k; i--) { for (int i = stack.size() - 1; i >= k; i--) {
Node* m = stack.node_at(i); Node* m = stack.node_at(i);
bool mnew = C->node_arena()->contains(m); bool mnew = C->node_arena()->contains(m);
tty->print(" %s%d:%s", (mnew? "": "o"), m->_idx, m->Name()); tty->print(" %s%d:%s", (mnew? "": "o"), m->_idx, m->Name());
if (i != 0) tty->print(d > 0? " <-": " ->"); if (i != 0) tty->print(direction > 0? " <-": " ->");
}
tty->cr();
} }
tty->cr();
} }
} }
} }