Hi Honza,

> -----Original Message-----
> From: Gcc-patches <gcc-patches-boun...@gcc.gnu.org> On Behalf Of Jan
> Hubicka
> Sent: Tuesday, August 11, 2020 11:04 AM
> To: gcc-patches@gcc.gnu.org
> Subject: Do not combine PRED_LOOP_GUARD and
> PRED_LOOP_GUARD_WITH_RECURSION
> 
> Hi,
> this patch avoids both PRED_LOOP_GUARD and
> PRED_LOOP_GUARD_WITH_RECURSION to be attached to one edge.  We
> have logic that prevents same predictor to apply to one edge twice, but since
> we split LOOP_GUARD to two more specialized cases, this no longer fires.
> 
> Double prediction happens in exchange benchmark and leads to
> unrealistically low hitrates on some edges which in turn leads to bad IPA
> profile and misguides ipa-cp.
> 
> Unforutnately it seems that the bad profile also leads to bit better
> performance by disabling some of loop stuff, but that really ought to be done
> in some meaningful way, not by an accident.

Hmm the regression on exchange2 is 11%. Or 1.22% on specint 2017 overall..
This is a rather big regression.. What would be the correct way to do this?

Kind Regards,
Tamar

> 
> Bootstrapped/regtested x86_64-linux, comitted.
> 
> Honza
> 
> gcc/ChangeLog:
> 
> 2020-08-11  Jan Hubicka  <hubi...@ucw.cz>
> 
>       * predict.c (not_loop_guard_equal_edge_p): New function.
>       (maybe_predict_edge): New function.
>       (predict_paths_for_bb): Use it.
>       (predict_paths_leading_to_edge): Use it.
> 
> gcc/testsuite/ChangeLog:
> 
> 2020-08-11  Jan Hubicka  <hubi...@ucw.cz>
> 
>       * gcc.dg/ipa/ipa-clone-2.c: Lower threshold from 500 to 400.
> 
> diff --git a/gcc/predict.c b/gcc/predict.c index 2164a06e083..4c4bba54939
> 100644
> --- a/gcc/predict.c
> +++ b/gcc/predict.c
> @@ -3122,6 +3122,35 @@ tree_guess_outgoing_edge_probabilities
> (basic_block bb)
>    bb_predictions = NULL;
>  }
> 
> 
> 
> +/* Filter function predicate that returns true for a edge predicate P
> +   if its edge is equal to DATA.  */
> +
> +static bool
> +not_loop_guard_equal_edge_p (edge_prediction *p, void *data) {
> +  return p->ep_edge != (edge)data || p->ep_predictor !=
> +PRED_LOOP_GUARD; }
> +
> +/* Predict edge E with PRED unless it is already predicted by some predictor
> +   considered equivalent.  */
> +
> +static void
> +maybe_predict_edge (edge e, enum br_predictor pred, enum prediction
> +taken) {
> +  if (edge_predicted_by_p (e, pred, taken))
> +    return;
> +  if (pred == PRED_LOOP_GUARD
> +      && edge_predicted_by_p (e, PRED_LOOP_GUARD_WITH_RECURSION,
> taken))
> +    return;
> +  /* Consider PRED_LOOP_GUARD_WITH_RECURSION superrior to
> LOOP_GUARD.
> +*/
> +  if (pred == PRED_LOOP_GUARD_WITH_RECURSION)
> +    {
> +      edge_prediction **preds = bb_predictions->get (e->src);
> +      if (preds)
> +     filter_predictions (preds, not_loop_guard_equal_edge_p, e);
> +    }
> +  predict_edge_def (e, pred, taken);
> +}
>  /* Predict edges to successors of CUR whose sources are not postdominated
> by
>     BB by PRED and recurse to all postdominators.  */
> 
> @@ -3177,10 +3206,7 @@ predict_paths_for_bb (basic_block cur,
> basic_block bb,
>        regions that are only reachable by abnormal edges.  We simply
>        prevent visiting given BB twice.  */
>        if (found)
> -     {
> -       if (!edge_predicted_by_p (e, pred, taken))
> -            predict_edge_def (e, pred, taken);
> -     }
> +     maybe_predict_edge (e, pred, taken);
>        else if (bitmap_set_bit (visited, e->src->index))
>       predict_paths_for_bb (e->src, e->src, pred, taken, visited, in_loop);
>      }
> @@ -3223,7 +3249,7 @@ predict_paths_leading_to_edge (edge e, enum
> br_predictor pred,
>    if (!has_nonloop_edge)
>      predict_paths_for_bb (bb, bb, pred, taken, auto_bitmap (), in_loop);
>    else
> -    predict_edge_def (e, pred, taken);
> +    maybe_predict_edge (e, pred, taken);
>  }
> 
> 
> 
>  /* This is used to carry information about basic blocks.  It is diff --git
> a/gcc/testsuite/gcc.dg/ipa/ipa-clone-2.c b/gcc/testsuite/gcc.dg/ipa/ipa-
> clone-2.c
> index d513020ee8b..53ae25a1e24 100644
> --- a/gcc/testsuite/gcc.dg/ipa/ipa-clone-2.c
> +++ b/gcc/testsuite/gcc.dg/ipa/ipa-clone-2.c
> @@ -1,5 +1,5 @@
>  /* { dg-do compile } */
> -/* { dg-options "-O3 -fdump-ipa-cp-details -fno-early-inlining --param ipa-
> cp-max-recursive-depth=8" } */
> +/* { dg-options "-O3 -fdump-ipa-cp-details -fno-early-inlining --param
> +ipa-cp-max-recursive-depth=8 --param=ipa-cp-eval-threshold=400" } */
> 
>  int fn();
> 

Reply via email to