[PATCH] decide edge's hotness when there is profile info

Jan Hubicka hubicka@ucw.cz
Thu Nov 14 00:17:00 GMT 2013


> Ok, that sounds good. Here is the new patch. Is this ok for trunk if
> testing (bootstrap regression and lto profiledbootstrap) succeeds?
> 
> Thanks,
> Teresa
> 
> 2013-11-13  Teresa Johnson  <tejohnson@google.com>
> 
>         * predict.c (drop_profile): Error is currently too strict.
>         (handle_missing_profiles): Pass call_count to drop_profile.

OK, thanks

Honza
> 
> Index: predict.c
> ===================================================================
> --- predict.c   (revision 204704)
> +++ predict.c   (working copy)
> @@ -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 @@ static void
>    /* 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 @@ static void
>                       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);
>              }
>          }
> 
> >
> > Honza
> 
> 
> 
> -- 
> Teresa Johnson | Software Engineer | tejohnson@google.com | 408-460-2413



More information about the Gcc-patches mailing list