> r12-4526 cancelled jump thread path rotates loop. It exposes a issue in
> profile-estimate when predict_extra_loop_exits, outer loop's exit edge
> is marked as inner loop's extra loop exit and set with incorrect
> prediction, then a hot inner loop will become cold loop finally through
> optimizations, this patch add loop check when searching extra exit edges
> to avoid unexpected predict_edge from predict_paths_for_bb.
> 
> Regression tested on P8LE, OK for master?
> 
> gcc/ChangeLog:
> 
>       PR middle-end/103270
>       * predict.c (predict_extra_loop_exits): Add loop parameter.
>       (predict_loops): Call with loop argument.

With changes to branch predictors it is useful to re-test their
effectivity on spec and see if their hitrates are still mathcing
reality.  You can do it by buiding spec with -fprofile-generate, train
it and then build with -fprofile-use -fdump-tree-ipa-profile-details
and use contrib/analyze_brprob.py that will collect info on how they
work.

This patch looks good to me, but it would be nice to have things reality
checked (and since we did not do the stats for some time, there may be
surprises) so if you could run the specs and post results of
analyze_brprob, it would be great.  I will also try to get to that soon,
but currently I am bit swamped by other problems I noticed on clang
builds.

Thanks a lot for working on profile fixes - I am trying now to get
things into shape.  With Martin we added basic testing infrastructure
for keeping track of profile updates and I am trying to see how it works
in practice now.  Hopefully it will make it easier to judge on profile
updating patches. I would welcome list of patches I should look at.

I will write separate mail on this.
Honza
> 
> gcc/testsuite/ChangeLog:
> 
>       PR middle-end/103270
>       * gcc.dg/pr103270.c: New test.
> ---
>  gcc/predict.c                   | 10 ++++++----
>  gcc/testsuite/gcc.dg/pr103270.c | 19 +++++++++++++++++++
>  2 files changed, 25 insertions(+), 4 deletions(-)
>  create mode 100644 gcc/testsuite/gcc.dg/pr103270.c
> 
> diff --git a/gcc/predict.c b/gcc/predict.c
> index 3cb4e3c0eb5..5b6e0cf722b 100644
> --- a/gcc/predict.c
> +++ b/gcc/predict.c
> @@ -1859,7 +1859,7 @@ predict_iv_comparison (class loop *loop, basic_block bb,
>     exits to predict them using PRED_LOOP_EXTRA_EXIT.  */
>  
>  static void
> -predict_extra_loop_exits (edge exit_edge)
> +predict_extra_loop_exits (class loop *loop, edge exit_edge)
>  {
>    unsigned i;
>    bool check_value_one;
> @@ -1912,12 +1912,14 @@ predict_extra_loop_exits (edge exit_edge)
>       continue;
>        if (EDGE_COUNT (e->src->succs) != 1)
>       {
> -       predict_paths_leading_to_edge (e, PRED_LOOP_EXTRA_EXIT, NOT_TAKEN);
> +       predict_paths_leading_to_edge (e, PRED_LOOP_EXTRA_EXIT, NOT_TAKEN,
> +                                      loop);
>         continue;
>       }
>  
>        FOR_EACH_EDGE (e1, ei, e->src->preds)
> -     predict_paths_leading_to_edge (e1, PRED_LOOP_EXTRA_EXIT, NOT_TAKEN);
> +     predict_paths_leading_to_edge (e1, PRED_LOOP_EXTRA_EXIT, NOT_TAKEN,
> +                                    loop);
>      }
>  }
>  
> @@ -2008,7 +2010,7 @@ predict_loops (void)
>                        ex->src->index, ex->dest->index);
>             continue;
>           }
> -       predict_extra_loop_exits (ex);
> +       predict_extra_loop_exits (loop, ex);
>  
>         if (number_of_iterations_exit (loop, ex, &niter_desc, false, false))
>           niter = niter_desc.niter;
> diff --git a/gcc/testsuite/gcc.dg/pr103270.c b/gcc/testsuite/gcc.dg/pr103270.c
> new file mode 100644
> index 00000000000..819310e360e
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/pr103270.c
> @@ -0,0 +1,19 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -fdump-tree-profile_estimate" } */
> +
> +void test(int a, int* i)
> +{
> +  for (; a < 5; ++a)
> +    {
> +      int b = 0;
> +      int c = 0;
> +      for (; b != -11; b--)
> +     for (int d = 0; d ==0; d++)
> +       {
> +         *i += c & a;
> +         c = b;
> +       }
> +    }
> +}
> +
> +/* { dg-final { scan-tree-dump-not "extra loop exit heuristics of 
> edge\[^:\]*:" "profile_estimate"} } */
> -- 
> 2.25.1
> 

Reply via email to