https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67962

--- Comment #4 from Richard Biener <rguenth at gcc dot gnu.org> ---
(In reply to Andrew Pinski from comment #3)
> Mine, but for gcc 13.  The main problem I see if two cmov might be slower
> than a branch on x86_64 processors.

Two cmov definitely, a min/max pair not.

Now, phiopt will turn

  <bb 2> :
  if (y_16(D) < x_17(D))
    goto <bb 3>; [INV]
  else
    goto <bb 4>; [INV]

  <bb 3> :

  <bb 4> :
  # x_14 = PHI <x_17(D)(2), y_16(D)(3)>
  if (y_16(D) < x_17(D))
    goto <bb 5>; [INV]
  else
    goto <bb 6>; [INV]

  <bb 5> :

  <bb 6> :
  # y_15 = PHI <y_16(D)(2), x_17(D)(3)>

into the desired pair but fails for the equivalent

  <bb 2> :
  if (y_16(D) < x_17(D))
    goto <bb 3>; [INV]
  else
    goto <bb 4>; [INV]

  <bb 3> :

  <bb 4> :
  # x_14 = PHI <x_17(D)(2), y_16(D)(3)>
  # y_15 = PHI <y_16(D)(2), x_17(D)(3)>

We do value-replacement for more than one PHI but not others, not exactly
sure why.  We could dry-run convert all PHIs and only if that succeeds
and the condition goes away perform the transforms.  Of course some
transforms might still not be profitable then.

Reply via email to