diff mbox

Fix profile count updates during tail merging

Message ID CAAe5K+UGneuko=W_UDb9AZ63TQE7O1Ryk2=hwB7h5qBM1QKdAw@mail.gmail.com
State New
Headers show

Commit Message

Teresa Johnson Oct. 15, 2013, 1:43 p.m. UTC
This patch fixes a profile count insanity introduced by ssa tail
merging. When replacing bb1 with bb2, which has the same successors,
the bb counts were being merged, but the successor edge weights
were not.

Bootstrapped and tested on x86_64-unknown-linux-gnu. Ok for trunk?

Thanks,
Teresa

2013-10-15  Teresa Johnson  <tejohnson@google.com>

        * tree-ssa-tail-merge.c (replace_block_by): Update edge
        weights during merging.

Comments

Jan Hubicka Oct. 15, 2013, 9:05 p.m. UTC | #1
> This patch fixes a profile count insanity introduced by ssa tail
> merging. When replacing bb1 with bb2, which has the same successors,
> the bb counts were being merged, but the successor edge weights
> were not.
> 
> Bootstrapped and tested on x86_64-unknown-linux-gnu. Ok for trunk?
> 
> Thanks,
> Teresa
> 
> 2013-10-15  Teresa Johnson  <tejohnson@google.com>
> 
>         * tree-ssa-tail-merge.c (replace_block_by): Update edge
>         weights during merging.
> 
> Index: tree-ssa-tail-merge.c
> ===================================================================
> --- tree-ssa-tail-merge.c       (revision 203389)
> +++ tree-ssa-tail-merge.c       (working copy)
> @@ -1462,6 +1462,8 @@ static void
>  replace_block_by (basic_block bb1, basic_block bb2)
>  {
>    edge pred_edge;
> +  edge e1;
> +  edge_iterator ei;
>    unsigned int i;
>    gimple bb2_phi;
> 
> @@ -1488,6 +1490,15 @@ replace_block_by (basic_block bb1, basic_block bb2
>                    pred_edge, UNKNOWN_LOCATION);
>      }
> 
> +  /* Merge the outgoing edge counts from bb1 onto bb2.  */
> +  FOR_EACH_EDGE (e1, ei, bb1->succs)
> +    {
> +      edge e2;
> +      e2 = find_edge (bb2, e1->dest);
> +      gcc_assert (e2);
> +      e2->count += e1->count;

Don't you need to redistribute the counts via edge probabilities?

Honza
> +    }
> +
>    bb2->frequency += bb1->frequency;
>    if (bb2->frequency > BB_FREQ_MAX)
>      bb2->frequency = BB_FREQ_MAX;
> 
> 
> -- 
> Teresa Johnson | Software Engineer | tejohnson@google.com | 408-460-2413
diff mbox

Patch

Index: tree-ssa-tail-merge.c
===================================================================
--- tree-ssa-tail-merge.c       (revision 203389)
+++ tree-ssa-tail-merge.c       (working copy)
@@ -1462,6 +1462,8 @@  static void
 replace_block_by (basic_block bb1, basic_block bb2)
 {
   edge pred_edge;
+  edge e1;
+  edge_iterator ei;
   unsigned int i;
   gimple bb2_phi;

@@ -1488,6 +1490,15 @@  replace_block_by (basic_block bb1, basic_block bb2
                   pred_edge, UNKNOWN_LOCATION);
     }

+  /* Merge the outgoing edge counts from bb1 onto bb2.  */
+  FOR_EACH_EDGE (e1, ei, bb1->succs)
+    {
+      edge e2;
+      e2 = find_edge (bb2, e1->dest);
+      gcc_assert (e2);
+      e2->count += e1->count;
+    }
+
   bb2->frequency += bb1->frequency;
   if (bb2->frequency > BB_FREQ_MAX)
     bb2->frequency = BB_FREQ_MAX;