]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
* ipa-inline.c (edge_badness): Cap edge->count at max_count for badness
authorpmatos <pmatos@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 21 Oct 2013 15:41:46 +0000 (15:41 +0000)
committerpmatos <pmatos@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 21 Oct 2013 15:41:46 +0000 (15:41 +0000)
calculations.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@203897 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/ipa-inline.c

index 54298e482b7b00a88ddd650d2658d86072936062..06a31ad3cd26cd2c3e478a1a923ae494c9975dc1 100644 (file)
@@ -1,3 +1,8 @@
+2013-10-21  Paulo Matos  <pmatos@broadcom.com>
+
+       * ipa-inline.c (edge_badness): Cap edge->count at max_count for badness
+       calculations.
+
 2013-10-21  Jeff Law  <law@redhat.com>
 
        * tree-ssa-threadedge.c (thread_through_normal_block): New argument VISITED.
index 4822c38ca58b95fb93e1f3ee5f0063acd7dcd155..26c410ba39c7c178cfc7940d9317b5fbb1987077 100644 (file)
@@ -903,12 +903,16 @@ edge_badness (struct cgraph_edge *edge, bool dump)
     {
       sreal tmp, relbenefit_real, growth_real;
       int relbenefit = relative_time_benefit (callee_info, edge, edge_time);
+      /* Capping edge->count to max_count. edge->count can be larger than
+        max_count if an inline adds new edges which increase max_count
+        after max_count is computed.  */
+      int edge_count = edge->count > max_count ? max_count : edge->count;
 
       sreal_init (&relbenefit_real, relbenefit, 0);
       sreal_init (&growth_real, growth, 0);
 
       /* relative_edge_count.  */
-      sreal_init (&tmp, edge->count, 0);
+      sreal_init (&tmp, edge_count, 0);
       sreal_div (&tmp, &tmp, &max_count_real);
 
       /* relative_time_benefit.  */
@@ -921,16 +925,14 @@ edge_badness (struct cgraph_edge *edge, bool dump)
 
       badness = -1 * sreal_to_int (&tmp);
  
-      /* Be sure that insanity of the profile won't lead to increasing counts
-        in the scalling and thus to overflow in the computation above.  */
-      gcc_assert (max_count >= edge->count);
       if (dump)
        {
          fprintf (dump_file,
-                  "      %i (relative %f): profile info. Relative count %f"
+                  "      %i (relative %f): profile info. Relative count %f%s"
                   " * Relative benefit %f\n",
                   (int) badness, (double) badness / INT_MIN,
-                  (double) edge->count / max_count,
+                  (double) edge_count / max_count,
+                  edge->count > max_count ? " (capped to max_count)" : "",
                   relbenefit * 100.0 / RELATIVE_TIME_BENEFIT_RANGE);
        }
     }