On 30-03-15 10:15, Jan Hubicka wrote:
Also move_sese_region_to_fn seem to mis updating of counts. Can you, please, add that and send updated patch?
Like this? OK for stage1 if bootstrap and reg-test on x86_64 are ok? Thanks, - Tom
Preserve edge count in move_sese_region_to_fn 2015-03-30 Tom de Vries <t...@codesourcery.com> * tree-cfg.c (move_sese_region_to_fn): Add entry_count and exit_count arrays, and used the to propagate edge counts alongside edge probabilities. --- gcc/tree-cfg.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c index 6db6dff..ad528a3 100644 --- a/gcc/tree-cfg.c +++ b/gcc/tree-cfg.c @@ -6976,6 +6976,7 @@ move_sese_region_to_fn (struct function *dest_cfun, basic_block entry_bb, struct function *saved_cfun = cfun; int *entry_flag, *exit_flag; unsigned *entry_prob, *exit_prob; + gcov_type *entry_count, *exit_count; unsigned i, num_entry_edges, num_exit_edges, num_nodes; edge e; edge_iterator ei; @@ -7014,10 +7015,12 @@ move_sese_region_to_fn (struct function *dest_cfun, basic_block entry_bb, entry_pred = XNEWVEC (basic_block, num_entry_edges); entry_flag = XNEWVEC (int, num_entry_edges); entry_prob = XNEWVEC (unsigned, num_entry_edges); + entry_count = XNEWVEC (gcov_type, num_entry_edges); i = 0; for (ei = ei_start (entry_bb->preds); (e = ei_safe_edge (ei)) != NULL;) { entry_prob[i] = e->probability; + entry_count[i] = e->count; entry_flag[i] = e->flags; entry_pred[i++] = e->src; remove_edge (e); @@ -7029,10 +7032,12 @@ move_sese_region_to_fn (struct function *dest_cfun, basic_block entry_bb, exit_succ = XNEWVEC (basic_block, num_exit_edges); exit_flag = XNEWVEC (int, num_exit_edges); exit_prob = XNEWVEC (unsigned, num_exit_edges); + exit_count = XNEWVEC (gcov_type, num_exit_edges); i = 0; for (ei = ei_start (exit_bb->succs); (e = ei_safe_edge (ei)) != NULL;) { exit_prob[i] = e->probability; + exit_count[i] = e->count; exit_flag[i] = e->flags; exit_succ[i++] = e->dest; remove_edge (e); @@ -7044,6 +7049,7 @@ move_sese_region_to_fn (struct function *dest_cfun, basic_block entry_bb, exit_succ = NULL; exit_flag = NULL; exit_prob = NULL; + exit_count = NULL; } /* Switch context to the child function to initialize DEST_FN's CFG. */ @@ -7221,12 +7227,14 @@ move_sese_region_to_fn (struct function *dest_cfun, basic_block entry_bb, { e = make_edge (entry_pred[i], bb, entry_flag[i]); e->probability = entry_prob[i]; + e->count = entry_count[i]; } for (i = 0; i < num_exit_edges; i++) { e = make_edge (bb, exit_succ[i], exit_flag[i]); e->probability = exit_prob[i]; + e->count = exit_count[i]; } set_immediate_dominator (CDI_DOMINATORS, bb, dom_entry); @@ -7237,10 +7245,12 @@ move_sese_region_to_fn (struct function *dest_cfun, basic_block entry_bb, if (exit_bb) { free (exit_prob); + free (exit_count); free (exit_flag); free (exit_succ); } free (entry_prob); + free (entry_count); free (entry_flag); free (entry_pred); bbs.release (); -- 1.9.1