+
+static void descend_and_dump(FILE *F, ir_node *n, int depth, pset *mark_set) {
+ if (pset_find_ptr(mark_set, n)) return;
+
+ pset_insert_ptr(mark_set, n);
+
+ if (depth > 0) {
+ int i, start = is_Block(n) ? 0 : -1;
+ dump_whole_node(n, F);
+ for (i = start; i < get_irn_arity(n); ++i)
+ descend_and_dump(F, get_irn_n(n, i), depth-1, mark_set);
+ } else {
+ dump_node(F, n);
+ /* Don't dump edges to nodes further out. These might be edges to
+ nodes we already dumped, if there is a shorter path to these. */
+ }
+}
+
+static int subgraph_counter = 0;
+void dump_subgraph (ir_node *root, int depth, const char *suffix) {
+ FILE *F;
+ char buf[32];
+ pset *mark_set = pset_new_ptr(1);
+ sprintf(buf, "-subg_%03d", subgraph_counter++);
+ F = vcg_open(get_irn_irg(root), suffix, buf);
+ dump_vcg_header(F, get_irg_dump_name(get_irn_irg(root)), NULL);
+ descend_and_dump(F, root, depth, mark_set);
+ vcg_close(F);
+ del_pset(mark_set);
+}
+
+