> 2020-12-10  Jakub Jelinek  <ja...@redhat.com>
> 
>       PR rtl-optimization/98212
>       * dojump.c (do_compare_rtx_and_jump): Change computation of
>       first_prob for and_them.  Add comment explaining and_them case.
> 
>       * gcc.dg/predict-8.c: Adjust expected probability.
> 
> --- gcc/dojump.c.jj   2020-12-10 12:30:50.677948803 +0100
> +++ gcc/dojump.c      2020-12-10 13:17:30.568082332 +0100
> @@ -1138,19 +1138,38 @@ do_compare_rtx_and_jump (rtx op0, rtx op
>               cprob = cprob.apply_scale (99, 100);
>             else
>               cprob = profile_probability::even ();
> -           /* We want to split:
> +           /* For and_them we want to split:
>                if (x) goto t; // prob;
> +              goto f;
>                into
> -              if (a) goto t; // first_prob;
> -              if (b) goto t; // prob;
> +              if (a) ; else goto f; // first_prob for ;
> +                                    // 1 - first_prob for goto 
f;
> +              if (b) goto t; // adjusted prob;
> +              goto f;
>                such that the overall probability of jumping to t
> -              remains the same and first_prob is prob * cprob.  */
> +              remains the same.  The and_them case should be
> +              probability-wise equivalent to the !and_them case with
> +              f and t swapped and also the conditions inverted, i.e.
> +              if (!a) goto f;
> +              if (!b) goto f;
> +              goto t;
> +              where the overall probability of jumping to f is
> +              1 - prob (thus the first prob.invert () below).
> +              cprob.invert () is because the a condition is inverted,
> +              so if it was originally ORDERED, !a is UNORDERED and
> +              thus should be relative 1% rather than 99%.
> +              The invert () on assignment to first_prob is because
> +              first_prob represents the probability of fallthru,
> +              rather than goto f.  And the last prob.invert () is
> +              because the adjusted prob represents the probability of
> +              jumping to t rather than to f.  */
>             if (and_them)
>               {
>                 rtx_code_label *dest_label;
> -               prob = prob.invert ();
> -               profile_probability first_prob = prob.split 
(cprob).invert ();
> -               prob = prob.invert ();
> +               prob = prob.invert ();
> +               profile_probability first_prob
> +                 = prob.split (cprob.invert ()).invert ();
> +               prob = prob.invert ();
>                 /* If we only jump if true, just bypass the second 
jump.  */
>                 if (! if_false_label)
>                   {

OK, thanks, but aren't there missing TABs in the new version?  Only one line 
is changed in the end AFAICS.

-- 
Eric Botcazou


Reply via email to