This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] Fix PR24574
On Wed, 13 Jul 2016, Alexander Monakov wrote:
> Hi,
>
> On Wed, 13 Jul 2016, Richard Biener wrote:
> > The following adds the ability to transform
> >
> > if (x != 0)
> > x = x / 10;
> >
> > to
> >
> > x = x / 10;
> >
> > as requested by PR. Plus it adds some more ops where such transform
> > is possible.
>
> In the bugzilla, you said,
>
> > Only for -Os, it's better to avoid the expensive division otherwise.
>
> But the patch seems to apply the transform irrespective of -Os; is that
> deliberate? (fwiw I agree with your bugzilla comment above)
I said that but I decided I was wrong as the conditional block will
be predicted as more likely executed. Also we were doing the transform
for other ops already. The most simple testcase has
;; basic block 2, loop depth 0, count 0, freq 10000, maybe hot
;; prev block 0, next block 3, flags: (NEW, REACHABLE)
;; pred: ENTRY [100.0%] (FALLTHRU,EXECUTABLE)
if (xD.1750_2(D) != 0)
goto <bb 3>;
else
goto <bb 4>;
;; succ: 3 [54.0%] (TRUE_VALUE,EXECUTABLE)
;; 4 [46.0%] (FALSE_VALUE,EXECUTABLE)
;; basic block 3, loop depth 0, count 0, freq 5400, maybe hot
;; prev block 2, next block 4, flags: (NEW, REACHABLE)
;; pred: 2 [54.0%] (TRUE_VALUE,EXECUTABLE)
xD.1750_3 = xD.1750_2(D) / 10;
so not exactly a 50/50 prediction. It is predicted by early return
predictor it seems. If I make the predictor not apply we predict
it as 50/50 chance. Hmm. Honza?
Anyway, the phiopt transform is guarded with
/* Size-wise, this is always profitable. */
if (optimize_bb_for_speed_p (cond_bb)
/* The special case is useless if it has a low probability. */
&& profile_status_for_fn (cfun) != PROFILE_ABSENT
&& EDGE_PRED (middle_bb, 0)->probability < PROB_EVEN
/* If assign is cheap, there is no point avoiding it. */
&& estimate_num_insns (assign, &eni_time_weights)
>= 3 * estimate_num_insns (cond, &eni_time_weights))
return 0;
and thus it should be handled correctly already (division and modulo
have higher time weights).
Richard.