+static void dfs_dump_edge(const dfs_edge_t *edge, FILE *file)
+{
+ dfs_node_t *src = edge->s;
+ dfs_node_t *tgt = edge->t;
+ const char *s, *style;
+ int weight;
+
+#define XXX(e) case DFS_EDGE_ ## e: s = #e; break
+ switch (edge->kind) {
+ XXX(FWD);
+ XXX(CROSS);
+ default:
+ s = "";
+ }
+#undef XXX
+
+ weight = edge->kind == DFS_EDGE_BACK ? 1 : 1000;
+ style = edge->kind == DFS_EDGE_BACK ? "dashed" : "solid";
+
+ ir_fprintf(file, "\tn%d -> n%d [label=\"%s\",style=\"%s\",weight=\"%d\"];\n", src->pre_num, tgt->pre_num, s, style, weight);
+}
+
+static int node_level_cmp(const void *a, const void *b)
+{
+ const dfs_node_t *p = *(const dfs_node_t **) a;
+ const dfs_node_t *q = *(const dfs_node_t **) b;
+
+ if (p->level == q->level)
+ return p->pre_num - q->pre_num;
+ return p->level - q->level;
+}
+