> 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 and don't invert prob around it.
> 
>       * gcc.dg/predict-8.c: Adjust expected probability.
> 
> --- gcc/dojump.c.jj   2020-12-09 15:11:17.042888002 +0100
> +++ gcc/dojump.c      2020-12-10 12:24:56.991844956 +0100
> @@ -1138,19 +1138,21 @@ 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 (a) ; else goto f; // first_prob for ;
> +                                    // 1 - first_prob for goto 
f;
>                if (b) goto t; // prob;
> +              goto f;
>                such that the overall probability of jumping to t
> -              remains the same and first_prob is prob * cprob.  */
> +              remains the same and first_prob is 1 - prob * (1 - 
cprob).  */



>             if (and_them)
>               {
>                 rtx_code_label *dest_label;
> -               prob = prob.invert ();
> -               profile_probability first_prob = prob.split 
(cprob).invert ();
> -               prob = prob.invert ();
> +               profile_probability first_prob
> +                 = prob.split (cprob.invert ()).invert ();
>                 /* If we only jump if true, just bypass the second 
jump.  */
>                 if (! if_false_label)
>                   {
> @@ -1163,6 +1170,15 @@ do_compare_rtx_and_jump (rtx op0, rtx op
>                    do_compare_rtx_and_jump (op0, op1, first_code, unsignedp,
> mode, size, dest_label, NULL, first_prob);
>               }
> +           /* 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;
> +              goto f;
> +              such that the overall probability of jumping to t
> +              remains the same and first_prob is prob * cprob.  */
>                else
>               {
>                 profile_probability first_prob = prob.split (cprob);

prob.split adjusts prob so this needs to be reflected in the comment (maybe 
"adjusted prob" or the formula if it is simple).  Otherwise looks good to me.

-- 
Eric Botcazou


Reply via email to