diff options
Diffstat (limited to 'gcc/graph.c')
-rw-r--r-- | gcc/graph.c | 41 |
1 files changed, 34 insertions, 7 deletions
diff --git a/gcc/graph.c b/gcc/graph.c index 9261732d23e..9864120ff37 100644 --- a/gcc/graph.c +++ b/gcc/graph.c @@ -136,12 +136,16 @@ draw_cfg_node_succ_edges (pretty_printer *pp, int funcdef_no, basic_block bb) pp_printf (pp, "\tfn_%d_basic_block_%d:s -> fn_%d_basic_block_%d:n " - "[style=%s,color=%s,weight=%d,constraint=%s, label=\"[%i%%]\"];\n", + "[style=%s,color=%s,weight=%d,constraint=%s", funcdef_no, e->src->index, funcdef_no, e->dest->index, style, color, weight, - (e->flags & (EDGE_FAKE | EDGE_DFS_BACK)) ? "false" : "true", - e->probability * 100 / REG_BR_PROB_BASE); + (e->flags & (EDGE_FAKE | EDGE_DFS_BACK)) ? "false" : "true"); + if (e->probability.initialized_p ()) + pp_printf (pp, ",label=\"[%i%%]\"", + e->probability.to_reg_br_prob_base () + * 100 / REG_BR_PROB_BASE); + pp_printf (pp, "];\n"); } pp_flush (pp); } @@ -243,19 +247,42 @@ draw_cfg_nodes (pretty_printer *pp, struct function *fun) } /* Draw all edges in the CFG. Retreating edges are drawin as not - constraining, this makes the layout of the graph better. - (??? Calling mark_dfs_back may change the compiler's behavior when - dumping, but computing back edges here for ourselves is also not - desirable.) */ + constraining, this makes the layout of the graph better. */ static void draw_cfg_edges (pretty_printer *pp, struct function *fun) { basic_block bb; + + /* Save EDGE_DFS_BACK flag to dfs_back. */ + auto_bitmap dfs_back; + edge e; + edge_iterator ei; + unsigned int idx = 0; + FOR_EACH_BB_FN (bb, cfun) + FOR_EACH_EDGE (e, ei, bb->succs) + { + if (e->flags & EDGE_DFS_BACK) + bitmap_set_bit (dfs_back, idx); + idx++; + } + mark_dfs_back_edges (); FOR_ALL_BB_FN (bb, cfun) draw_cfg_node_succ_edges (pp, fun->funcdef_no, bb); + /* Restore EDGE_DFS_BACK flag from dfs_back. */ + idx = 0; + FOR_EACH_BB_FN (bb, cfun) + FOR_EACH_EDGE (e, ei, bb->succs) + { + if (bitmap_bit_p (dfs_back, idx)) + e->flags |= EDGE_DFS_BACK; + else + e->flags &= ~EDGE_DFS_BACK; + idx++; + } + /* Add an invisible edge from ENTRY to EXIT, to improve the graph layout. */ pp_printf (pp, "\tfn_%d_basic_block_%d:s -> fn_%d_basic_block_%d:n " |