diff --git a/tools/qfcc/include/dags.h b/tools/qfcc/include/dags.h index 7cefa98ec..6dc3f5f1c 100644 --- a/tools/qfcc/include/dags.h +++ b/tools/qfcc/include/dags.h @@ -92,7 +92,7 @@ typedef struct dag_s { } dag_t; const char *daglabel_string (daglabel_t *label); -void print_dag (struct dstring_s *dstr, dag_t *dag); +void print_dag (struct dstring_s *dstr, dag_t *dag, const char *label); /** Make a dag for a single basic block. diff --git a/tools/qfcc/source/dot_dag.c b/tools/qfcc/source/dot_dag.c index 224e82a84..21f15050e 100644 --- a/tools/qfcc/source/dot_dag.c +++ b/tools/qfcc/source/dot_dag.c @@ -68,8 +68,8 @@ print_root_nodes (dstring_t *dstr, dag_t *dag) node_iter = set_next (node_iter)) { dagnode_t *node = dag->nodes[node_iter->member]; print_node_def (dstr, node); - dasprintf (dstr, " dag_%p ->dagnode_%p [style=invis];\n", dag, - node); + dasprintf (dstr, " dag_enter_%p ->dagnode_%p [style=invis];\n", + dag, node); } dasprintf (dstr, " }\n"); } @@ -130,17 +130,24 @@ print_node (dstring_t *dstr, dag_t *dag, dagnode_t *node) dasprintf (dstr, " \n"); dasprintf (dstr, " >];\n"); } + if (set_is_empty (node->edges)) + dasprintf (dstr, + " \"dagnode_%p\" -> \"dag_leave_%p\" [style=invis];\n", + node, dag); } void -print_dag (dstring_t *dstr, dag_t *dag) +print_dag (dstring_t *dstr, dag_t *dag, const char *label) { int i; dasprintf (dstr, " subgraph cluster_dag_%p {\n", dag); - dasprintf (dstr, " dag_%p [label=\"\", style=invis];\n", dag); + if (label) + dasprintf (dstr, " label=\"%s\";\n", label); + dasprintf (dstr, " dag_enter_%p [label=\"\", style=invis];\n", dag); print_root_nodes (dstr, dag); print_child_nodes (dstr, dag); for (i = 0; i < dag->num_nodes; i++) print_node (dstr, dag, dag->nodes[i]); + dasprintf (dstr, " dag_leave_%p [label=\"\", style=invis];\n", dag); dasprintf (dstr, " }\n"); } diff --git a/tools/qfcc/source/dot_flow.c b/tools/qfcc/source/dot_flow.c index 6f61bdf49..3a7e8309c 100644 --- a/tools/qfcc/source/dot_flow.c +++ b/tools/qfcc/source/dot_flow.c @@ -67,8 +67,12 @@ print_flow_node (dstring_t *dstr, flowgraph_t *graph, flownode_t *node, //dasprintf (dstr, "%*s rank=same;\n", indent, ""); indent += 2; } - dasprintf (dstr, "%*s\"fn_%p\" [label=\"%d (%d)\"];\n", indent, "", node, - node->id, node->dfn); + if (node->dag) { + print_dag (dstr, node->dag, va ("%d (%d)", node->id, node->dfn)); + } else { + dasprintf (dstr, "%*s\"fn_%p\" [label=\"%d (%d)\"];\n", indent, "", + node, node->id, node->dfn); + } if (live) { dasprintf (dstr, "%*slv_%p [shape=none,label=<\n", indent, "", node); dasprintf (dstr, "%*s