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