On 30/03/15 11:54, Tom de Vries wrote:
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?


Ping. Original posting at https://gcc.gnu.org/ml/gcc-patches/2015-03/msg01537.html .

Thanks,
- Tom

0002-Preserve-edge-count-in-move_sese_region_to_fn.patch


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