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

Reply via email to