re PR ipa/58862 (LTO profiledbootstrap failure: lto1: ICE in edge_badness, at ipa...
authorTeresa Johnson <tejohnson@google.com>
Wed, 13 Nov 2013 21:51:44 +0000 (21:51 +0000)
committerTeresa Johnson <tejohnson@gcc.gnu.org>
Wed, 13 Nov 2013 21:51:44 +0000 (21:51 +0000)
2013-11-13  Teresa Johnson  <tejohnson@google.com>

PR ipa/58862
* predict.c (drop_profile): Error is currently too strict.
(handle_missing_profiles): Pass call_count to drop_profile.

From-SVN: r204756

gcc/ChangeLog
gcc/predict.c

index bf8306dd58a372a1b0bf50e3a1c3f542fa227d30..cea26ec2f2210d706da8de80caf7eb5489fcd9a0 100644 (file)
@@ -1,3 +1,9 @@
+2013-11-13  Teresa Johnson  <tejohnson@google.com>
+
+       PR ipa/58862
+       * predict.c (drop_profile): Error is currently too strict.
+       (handle_missing_profiles): Pass call_count to drop_profile.
+
 2013-11-13  Teresa Johnson  <tejohnson@google.com>
 
        PR ipa/58862
index 2a500eaa78d2b1a93b538d2c947b7f864d379004..3cfa258abed599f9cded69f51b2cc776474a1118 100644 (file)
@@ -2766,12 +2766,17 @@ estimate_loops (void)
 }
 
 /* Drop the profile for NODE to guessed, and update its frequency based on
-   whether it is expected to be HOT.  */
+   whether it is expected to be hot given the CALL_COUNT.  */
 
 static void
-drop_profile (struct cgraph_node *node, bool hot)
+drop_profile (struct cgraph_node *node, gcov_type call_count)
 {
   struct function *fn = DECL_STRUCT_FUNCTION (node->decl);
+  /* In the case where this was called by another function with a
+     dropped profile, call_count will be 0. Since there are no
+     non-zero call counts to this function, we don't know for sure
+     whether it is hot, and therefore it will be marked normal below.  */
+  bool hot = maybe_hot_count_p (NULL, call_count);
 
   if (dump_file)
     fprintf (dump_file,
@@ -2781,8 +2786,13 @@ drop_profile (struct cgraph_node *node, bool hot)
   /* We only expect to miss profiles for functions that are reached
      via non-zero call edges in cases where the function may have
      been linked from another module or library (COMDATs and extern
-     templates). See the comments below for handle_missing_profiles.  */
-  if (!DECL_COMDAT (node->decl) && !DECL_EXTERNAL (node->decl))
+     templates). See the comments below for handle_missing_profiles.
+     Also, only warn in cases where the missing counts exceed the
+     number of training runs. In certain cases with an execv followed
+     by a no-return call the profile for the no-return call is not
+     dumped and there can be a mismatch.  */
+  if (!DECL_COMDAT (node->decl) && !DECL_EXTERNAL (node->decl)
+      && call_count > profile_info->runs)
     {
       if (flag_profile_correction)
         {
@@ -2792,8 +2802,8 @@ drop_profile (struct cgraph_node *node, bool hot)
                      cgraph_node_name (node), node->order);
         }
       else
-        error ("Missing counts for called function %s/%i",
-               cgraph_node_name (node), node->order);
+        warning (0, "Missing counts for called function %s/%i",
+                 cgraph_node_name (node), node->order);
     }
 
   profile_status_for_function (fn)
@@ -2839,9 +2849,7 @@ handle_missing_profiles (void)
           && fn && fn->cfg
           && (call_count * unlikely_count_fraction >= profile_info->runs))
         {
-          bool maybe_hot = maybe_hot_count_p (NULL, call_count);
-
-          drop_profile (node, maybe_hot);
+          drop_profile (node, call_count);
           worklist.safe_push (node);
         }
     }
@@ -2863,11 +2871,7 @@ handle_missing_profiles (void)
           if (DECL_COMDAT (callee->decl) && fn && fn->cfg
               && profile_status_for_function (fn) == PROFILE_READ)
             {
-              /* Since there are no non-0 call counts to this function,
-                 we don't know for sure whether it is hot. Indicate to
-                 the drop_profile routine that function should be marked
-                 normal, rather than hot.  */
-              drop_profile (node, false);
+              drop_profile (node, 0);
               worklist.safe_push (callee);
             }
         }