> 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