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
