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

Reply via email to