Ping ? Thanks, Kugan
> On 4 Sep 2026, at 8:48 am, Kugan Vivekanandarajah <[email protected]> > wrote: > > AutoFDO count scaling should provide arithmetic precision without changing > optimization decisions. However, IPA-CP profitability and zero-count > ratios retains the absolute, causing cloning and profile > propagation decisions to vary with afdo_count_scale. > > In this patch: > Use normalized call frequencies for AutoFDO IPA-CP profitability. Derive > synthetic AutoFDO zero counts from the scaled profile cutoff and cap ratios > at one. > > AutoFDO performance with the patch relative to without the patch: > > 706.stockfish_r +3.05% > 707.ntest_r -0.70% > 708.sqlite_r -0.76% > 714.cpython_r +1.62% > 727.cppcheck_r +0.72% > 734.vpr_r +0.12% > 735.gem5_r -2.07% > 750.sealcrypto_r -2.36% > 753.ns3_r -1.34% > 760.rocksdb_r +5.62% > 777.zstd_r +0.34% > 709.cactus_r +2.78% > 722.palm_r +0.03% > 731.astcenc_r -0.60% > 736.ocio_r -0.70% > 737.gmsh_r -0.73% > 748.flightdm_r +8.58% > 749.fotonik3d_r +6.16% > 765.roms_r -0.70% > 766.femflow_r +17.97% > 772.marian_r +14.44% > 782.lbm_r -0.67% > > gcc/ChangeLog: > > * ipa-cp.cc (good_cloning_opportunity_p): Use normalized frequency > for AutoFDO profitability. > * profile-count.cc (profile_count::to_sreal_scale): Use the scaled > cutoff for synthetic AutoFDO zero counts and cap the resulting ratio. > > Signed-off-by: Kugan Vivekanandarajah <[email protected]> > --- > gcc/ipa-cp.cc | 8 ++++++-- > gcc/profile-count.cc | 2 +- > 2 files changed, 7 insertions(+), 3 deletions(-) > > diff --git a/gcc/ipa-cp.cc b/gcc/ipa-cp.cc > index d0428d04684..4a8f2ff3432 100644 > --- a/gcc/ipa-cp.cc > +++ b/gcc/ipa-cp.cc > @@ -3474,8 +3474,12 @@ 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; > + if (flag_auto_profile) > + evaluation = (time_benefit * freq_sum * 1000) / size_cost; > + else > + evaluation = saved_time.to_sreal_scale (profile_count::one ()) > + / size_cost; > evaluation = incorporate_penalties (node, info, evaluation); > > if (dump_file && (dump_flags & TDF_DETAILS)) > diff --git a/gcc/profile-count.cc b/gcc/profile-count.cc > index 9be209efda2..450e2db6538 100644 > --- a/gcc/profile-count.cc > +++ b/gcc/profile-count.cc > @@ -358,7 +358,7 @@ profile_count::to_sreal_scale (profile_count in, bool > *known) const > /* Auto-FDO 0 really just means that we have no samples. > Treat it as small non-zero frequency. */ > if (!m_val && quality () == AFDO) > - return (sreal)1 / (sreal)in.m_val; > + return MIN ((sreal) 1, force_nonzero ().to_sreal_scale (in)); > return (sreal)m_val / (sreal)in.m_val; > } > > -- > 2.34.1 >
