Hello,

Honza, I'd like to ping this.

Kugan, have you had a chance to check if this helps with your AutoFDO
count scaling issues?

Thanks,

Martin


On Fri, Sep 04 2026, Martin Jambor wrote:
> Hi,
>
> With profile-feedback, the run-times used for opportunity evaluations
> is not currently scaled to the total measured run time of the
> program/compilation unit, which is an obvious mistake.  This patch
> adds such scaling by run-time which is however itself also scaled down
> so that the resulting scores rougly fall in line with the scores on
> hot loops we get using guessed profile.
>
> Kugan, please have a look if this helps addressing the issues you see
> with AutoFDO (though I have not looked at whether the default value of
> ipa-cp-profile-runtime-scaling is appropriate also for AutoFDO).
>
> I have bootstrapped and tested this on an x86_64-linux in a normal way
> and then also did a bootstrap with LTO, PGO and -O3 optimization level.
> OK for master?
>
> Martin
>
>
>
> gcc/ChangeLog:
>
> 2026-05-15  Martin Jambor  <[email protected]>
>
>       * ipa-cp.cc (overall_scaled_runtime): New.
>       (good_cloning_opportunity_p): Scale PGO evaluations by
>       overall_scaled_runtime.
>       (ipcp_propagate_stage): Calculate also overall_scaled_runtime and
>       print it and unscaled time.
>       (ipa_cp_cc_finalize): Set overall_scaled_runtime to zero.
>       * params.opt (ipa-cp-profile-runtime-scaling): New.
>       * doc/params.texi (ipa-cp-profile-runtime-scaling): New.
> ---
>  gcc/doc/params.texi |  5 +++++
>  gcc/ipa-cp.cc       | 40 ++++++++++++++++++++++++++++++++++------
>  gcc/params.opt      |  4 ++++
>  3 files changed, 43 insertions(+), 6 deletions(-)
>
> diff --git a/gcc/doc/params.texi b/gcc/doc/params.texi
> index e69be2d2923..2c2e1abef57 100644
> --- a/gcc/doc/params.texi
> +++ b/gcc/doc/params.texi
> @@ -1292,6 +1292,11 @@ of iterations of a loop known, it adds a bonus of
>  @option{ipa-cp-loop-hint-bonus} to the profitability score of
>  the candidate.
>  
> +@paindex ipa-cp-profile-runtime-scaling
> +@item ipa-cp-profile-runtime-scaling
> +When using profile feedback, by how many bits to shift the run-time
> +before it is used as the basis for IPA-CP evaluations.
> +
>  @paindex ipa-max-loop-predicates
>  @item ipa-max-loop-predicates
>  The maximum number of different predicates IPA uses to describe when
> diff --git a/gcc/ipa-cp.cc b/gcc/ipa-cp.cc
> index d0428d04684..78a3891d811 100644
> --- a/gcc/ipa-cp.cc
> +++ b/gcc/ipa-cp.cc
> @@ -153,6 +153,12 @@ object_allocator<ipcp_agg_lattice> ipcp_agg_lattice_pool
>  
>  static long overall_size, orig_overall_size;
>  
> +/* Overall run-time of the part of the program or the compilation unit for
> +   which profile information is available, scaled by
> +   param_ipa_cp_min_recursive_probability.  */
> +
> +static sreal overall_scaled_runtime;
> +
>  /* The maximum number of IPA-CP decision sweeps that any node requested in 
> its
>     param.  */
>  static int max_number_sweeps;
> @@ -3474,8 +3480,8 @@ good_cloning_opportunity_p (struct cgraph_node *node, 
> sreal time_benefit,
>    if (count_sum.nonzero_p ())
>      {
>        profile_count saved_time = count_sum * time_benefit;
> -      sreal evaluation = saved_time.to_sreal_scale (profile_count::one ())
> -                           / size_cost;
> +      sreal evaluation = (saved_time.to_sreal_scale (profile_count::one ())
> +                         / overall_scaled_runtime) / size_cost;
>        evaluation = incorporate_penalties (node, info, evaluation);
>  
>        if (dump_file && (dump_flags & TDF_DETAILS))
> @@ -4079,6 +4085,8 @@ static void
>  ipcp_propagate_stage (class ipa_topo_info *topo)
>  {
>    struct cgraph_node *node;
> +  sreal overall_runtime = 0;
> +  overall_scaled_runtime = 0;
>  
>    if (dump_file)
>      fprintf (dump_file, "\n Propagating constants:\n\n");
> @@ -4100,15 +4108,34 @@ ipcp_propagate_stage (class ipa_topo_info *topo)
>       if (max_number_sweeps < num_sweeps)
>         max_number_sweeps = num_sweeps;
>        }
> -    ipa_size_summary *s = ipa_size_summaries->get (node);
> -    if (node->definition && !node->alias && s != NULL)
> -      overall_size += s->self_size;
> +
> +    if (!node->alias)
> +      {
> +       ipa_size_summary *szs = ipa_size_summaries->get (node);
> +       if (szs)
> +         overall_size += szs->self_size;
> +       ipa_fn_summary *fns = ipa_fn_summaries->get (node);
> +       if (fns)
> +         {
> +           int shift = opt_for_fn (node->decl,
> +                                   param_ipa_cp_profile_runtime_scaling);
> +           sreal frt = fns->time;
> +           overall_runtime += frt;
> +           overall_scaled_runtime += frt.shift(-shift);
> +         }
> +      }
>    }
>  
>    orig_overall_size = overall_size;
>  
>    if (dump_file)
> -    fprintf (dump_file, "\noverall_size: %li\n", overall_size);
> +    {
> +      fprintf (dump_file, "\noverall_size: %li\n", overall_size);
> +      fprintf (dump_file, "overall_runtime: %.2e\n",
> +              overall_runtime.to_double ());
> +      fprintf (dump_file, "overall_scaled_runtime: %.2e\n",
> +              overall_scaled_runtime.to_double ());
> +    }
>  
>    propagate_constants_topo (topo);
>    if (flag_checking)
> @@ -6869,6 +6896,7 @@ ipa_cp_cc_finalize (void)
>  {
>    overall_size = 0;
>    orig_overall_size = 0;
> +  overall_scaled_runtime = 0;
>    ipcp_free_transformation_sum ();
>  }
>  
> diff --git a/gcc/params.opt b/gcc/params.opt
> index 0c6a3e51457..cda19a04b7f 100644
> --- a/gcc/params.opt
> +++ b/gcc/params.opt
> @@ -261,6 +261,10 @@ Threshold ipa-cp opportunity evaluation that is still 
> considered beneficial to c
>  Common Joined UInteger Var(param_ipa_cp_loop_hint_bonus) Init(64) Param 
> Optimization
>  Compile-time bonus IPA-CP assigns to candidates which make loop bounds or 
> strides known.
>  
> +-param=ipa-cp-profile-runtime-scaling=
> +Common Joined UInteger Var(param_ipa_cp_profile_runtime_scaling) Init(19) 
> Param Optimization
> +With profile feedback, by how many bits to shift the run-time before it is 
> used as the basis for IPA-CP evaluations.
> +
>  -param=ipa-cp-max-recursive-depth=
>  Common Joined UInteger Var(param_ipa_cp_max_recursive_depth) Init(8) Param 
> Optimization
>  Maximum depth of recursive cloning for self-recursive function.
> -- 
> 2.55.0

Reply via email to