re PR ipa/58862 (LTO profiledbootstrap failure: lto1: ICE in edge_badness, at ipa...
authorTeresa Johnson <tejohnson@google.com>
Tue, 29 Oct 2013 20:39:49 +0000 (20:39 +0000)
committerTeresa Johnson <tejohnson@gcc.gnu.org>
Tue, 29 Oct 2013 20:39:49 +0000 (20:39 +0000)
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.

From-SVN: r204178

gcc/ChangeLog
gcc/tree-ssa-tail-merge.c

index 9f350ce4c021c57da5e9b135042d5dd130f38c8b..d7be352cb881773498bee4547a975d7392bf46f8 100644 (file)
@@ -1,3 +1,9 @@
+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.
+
 2013-10-29  David Malcolm  <dmalcolm@redhat.com>
 
        * gdbhooks.py (CGraphNodePrinter.to_string): Update gdb
index be5b71e58a8fb3f407be9290a92fa62df8004b1b..db95ce1059c16b660fd390d31324e70f32007c9f 100644 (file)
@@ -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,15 +1502,21 @@ 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.  */