Drop this patch since
https://gcc.gnu.org/pipermail/gcc-patches/2025-June/686830.html could
be a better alternative.

On Tue, Jun 10, 2025 at 9:50 AM Hongtao Liu <crazy...@gmail.com> wrote:
>
> Ping
>
> On Mon, May 19, 2025 at 10:06 AM liuhongt <hongtao....@intel.com> wrote:
> >
> > From: "hongtao.liu" <hongtao....@intel.com>
> >
> > AutoFDO profile is a scaled profile, as a result, 0 sample does not
> > mean never executed. especially there's profile from function
> > body. Prevent combine_with_ipa_count·(ipa_count) from zeroing all
> > bb->count.
> >
> > Bootstrapped and regtested on x86_64-pc-linux-gnu{-m32,}
> > OK for trunk?
> >
> > gcc/ChangeLog:
> >
> >         PR gcov-profile/118551
> >         * predict.cc (estimate_bb_frequencies): Prevent
> >         combine_with_ipa_count·(ipa_count) from zeroing all bb->count
> >         when function body is known to be hot.
> > ---
> >  gcc/predict.cc | 73 +++++++++++++++++++++++++++++---------------------
> >  1 file changed, 42 insertions(+), 31 deletions(-)
> >
> > diff --git a/gcc/predict.cc b/gcc/predict.cc
> > index ef31c48bfe2..7d4bf5261ad 100644
> > --- a/gcc/predict.cc
> > +++ b/gcc/predict.cc
> > @@ -4105,40 +4105,51 @@ estimate_bb_frequencies ()
> >    if (freq_max < 16)
> >      freq_max = 16;
> >    profile_count ipa_count = ENTRY_BLOCK_PTR_FOR_FN (cfun)->count.ipa ();
> > -  cfun->cfg->count_max = profile_count::uninitialized ();
> > -  FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR_FOR_FN (cfun), NULL, next_bb)
> > +
> > +  /* AutoFDO profile is a scaled profile, as a result, 0 sample does not
> > +     mean never executed. especially there's profile from function
> > +     body. Prevent combine_with_ipa_count·(ipa_count) from zeroing all
> > +     bb->count.  */
> > +  if (!(ipa_count.quality () == AFDO
> > +       && cfun->cfg->count_max.quality () == AFDO
> > +       && !ipa_count.nonzero_p ()
> > +       && cfun->cfg->count_max.nonzero_p ()))
> >      {
> > -      sreal tmp = BLOCK_INFO (bb)->frequency;
> > -      if (tmp >= 1)
> > +      cfun->cfg->count_max = profile_count::uninitialized ();
> > +      FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR_FOR_FN (cfun), NULL, next_bb)
> >         {
> > -         gimple_stmt_iterator gsi;
> > -         tree decl;
> > -
> > -         /* Self recursive calls can not have frequency greater than 1
> > -            or program will never terminate.  This will result in an
> > -            inconsistent bb profile but it is better than greatly confusing
> > -            IPA cost metrics.  */
> > -         for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
> > -           if (is_gimple_call (gsi_stmt (gsi))
> > -               && (decl = gimple_call_fndecl (gsi_stmt (gsi))) != NULL
> > -               && recursive_call_p (current_function_decl, decl))
> > -             {
> > -               if (dump_file)
> > -                 fprintf (dump_file, "Dropping frequency of recursive call"
> > -                          " in bb %i from %f\n", bb->index,
> > -                          tmp.to_double ());
> > -               tmp = (sreal)9 / (sreal)10;
> > -               break;
> > -             }
> > +         sreal tmp = BLOCK_INFO (bb)->frequency;
> > +         if (tmp >= 1)
> > +           {
> > +             gimple_stmt_iterator gsi;
> > +             tree decl;
> > +
> > +             /* Self recursive calls can not have frequency greater than 1
> > +                or program will never terminate.  This will result in an
> > +                inconsistent bb profile but it is better than greatly 
> > confusing
> > +                IPA cost metrics.  */
> > +             for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next 
> > (&gsi))
> > +               if (is_gimple_call (gsi_stmt (gsi))
> > +                   && (decl = gimple_call_fndecl (gsi_stmt (gsi))) != NULL
> > +                   && recursive_call_p (current_function_decl, decl))
> > +                 {
> > +                   if (dump_file)
> > +                     fprintf (dump_file, "Dropping frequency of recursive 
> > call"
> > +                              " in bb %i from %f\n", bb->index,
> > +                              tmp.to_double ());
> > +                   tmp = (sreal)9 / (sreal)10;
> > +                   break;
> > +                 }
> > +           }
> > +         tmp = tmp * freq_max;
> > +         profile_count count = profile_count::from_gcov_type 
> > (tmp.to_nearest_int ());
> > +
> > +         /* If we have profile feedback in which this function was never
> > +            executed, then preserve this info.  */
> > +         if (!(bb->count == profile_count::zero ()))
> > +           bb->count = count.guessed_local ().combine_with_ipa_count 
> > (ipa_count);
> > +         cfun->cfg->count_max = cfun->cfg->count_max.max (bb->count);
> >         }
> > -      tmp = tmp * freq_max;
> > -      profile_count count = profile_count::from_gcov_type 
> > (tmp.to_nearest_int ());
> > -
> > -      /* If we have profile feedback in which this function was never
> > -        executed, then preserve this info.  */
> > -      if (!(bb->count == profile_count::zero ()))
> > -       bb->count = count.guessed_local ().combine_with_ipa_count 
> > (ipa_count);
> > -      cfun->cfg->count_max = cfun->cfg->count_max.max (bb->count);
> >      }
> >
> >    free_aux_for_blocks ();
> > --
> > 2.34.1
> >
>
>
> --
> BR,
> Hongtao



-- 
BR,
Hongtao

Reply via email to