diff mbox

Fix PR ipa/58862 (profiled bootstrap failure)

Message ID CAAe5K+VVz76TiiZ5OBT8-121TB00Dq-r04Vx2J9Bkjkk7ejSuA@mail.gmail.com
State New
Headers show

Commit Message

Teresa Johnson Oct. 29, 2013, 6:42 p.m. UTC
This patch fixes a profiledbootstrap failure that occurred after I
added some profile fixup. The initial profile insanity occurred
upstream of my change, but my change caused the insanity to spread to
the edge probability, resulting in a verify failure. The patch below
ensures this doesn't occur.

Bootstrapped and tested on x86-64-unknown-linux-gnu. A
profiledbootstrap build also now succeeds. Ok for trunk?

Thanks,
Teresa

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

        PR ipa/58862
        * tree-ssa-tail-merge.c (replace_block_by): Tolerate profile
        insanities when updating probabilities.

Comments

Jan Hubicka Oct. 29, 2013, 8:28 p.m. UTC | #1
> This patch fixes a profiledbootstrap failure that occurred after I
> added some profile fixup. The initial profile insanity occurred
> upstream of my change, but my change caused the insanity to spread to
> the edge probability, resulting in a verify failure. The patch below
> ensures this doesn't occur.
> 
> Bootstrapped and tested on x86-64-unknown-linux-gnu. A
> profiledbootstrap build also now succeeds. Ok for trunk?

OK.

Honza
> 
> Thanks,
> Teresa
> 
> 2013-10-29  Teresa Johnson  <tejohnson@google.com>
> 
>         PR ipa/58862
>         * tree-ssa-tail-merge.c (replace_block_by): Tolerate profile
>         insanities when updating probabilities.
> 
> Index: tree-ssa-tail-merge.c
> ===================================================================
> --- tree-ssa-tail-merge.c       (revision 204166)
> +++ tree-ssa-tail-merge.c       (working copy)
> @@ -1467,7 +1467,7 @@ static void
>  replace_block_by (basic_block bb1, basic_block bb2)
>  {
>    edge pred_edge;
> -  edge e1;
> +  edge e1, e2;
>    edge_iterator ei;
>    unsigned int i;
>    gimple bb2_phi;
> @@ -1502,16 +1502,22 @@ replace_block_by (basic_block bb1, basic_block bb2
>    bb2->count += bb1->count;
> 
>    /* Merge the outgoing edge counts from bb1 onto bb2.  */
> +  gcov_type out_sum = 0;
>    FOR_EACH_EDGE (e1, ei, bb1->succs)
>      {
> -      edge e2;
>        e2 = find_edge (bb2, e1->dest);
>        gcc_assert (e2);
>        e2->count += e1->count;
> -      /* Recompute the probability from the new merged edge count (bb2->count
> -         was updated above).  */
> -      e2->probability = GCOV_COMPUTE_SCALE (e2->count, bb2->count);
> +      out_sum += e2->count;
>      }
> +  /* Recompute the edge probabilities from the new merged edge count.
> +     Use the sum of the new merged edge counts computed above instead
> +     of bb2's merged count, in case there are profile count insanities
> +     making the bb count inconsistent with the edge weights.  */
> +  FOR_EACH_EDGE (e2, ei, bb2->succs)
> +    {
> +      e2->probability = GCOV_COMPUTE_SCALE (e2->count, out_sum);
> +    }
> 
>    /* Do updates that use bb1, before deleting bb1.  */
>    release_last_vdef (bb1);
> 
> 
> -- 
> 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 204166)
+++ tree-ssa-tail-merge.c       (working copy)
@@ -1467,7 +1467,7 @@  static void
 replace_block_by (basic_block bb1, basic_block bb2)
 {
   edge pred_edge;
-  edge e1;
+  edge e1, e2;
   edge_iterator ei;
   unsigned int i;
   gimple bb2_phi;
@@ -1502,16 +1502,22 @@  replace_block_by (basic_block bb1, basic_block bb2
   bb2->count += bb1->count;

   /* Merge the outgoing edge counts from bb1 onto bb2.  */
+  gcov_type out_sum = 0;
   FOR_EACH_EDGE (e1, ei, bb1->succs)
     {
-      edge e2;
       e2 = find_edge (bb2, e1->dest);
       gcc_assert (e2);
       e2->count += e1->count;
-      /* Recompute the probability from the new merged edge count (bb2->count
-         was updated above).  */
-      e2->probability = GCOV_COMPUTE_SCALE (e2->count, bb2->count);
+      out_sum += e2->count;
     }
+  /* Recompute the edge probabilities from the new merged edge count.
+     Use the sum of the new merged edge counts computed above instead
+     of bb2's merged count, in case there are profile count insanities
+     making the bb count inconsistent with the edge weights.  */
+  FOR_EACH_EDGE (e2, ei, bb2->succs)
+    {
+      e2->probability = GCOV_COMPUTE_SCALE (e2->count, out_sum);
+    }

   /* Do updates that use bb1, before deleting bb1.  */
   release_last_vdef (bb1);