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

Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
     Ever confirmed|0                           |1
   Last reconfirmed|                            |2025-03-24
             Status|UNCONFIRMED                 |NEW

--- Comment #1 from Richard Biener <rguenth at gcc dot gnu.org> ---
Confirmed.  The double-ternary is of course most interesting to solve, we
expand from

  <bb 2> [local count: 1073741824]:
  _2 = y;
  _4 = x;
  pretmp_9 = z;
  if (_2 < _4)
    goto <bb 3>; [50.00%]
  else
    goto <bb 4>; [50.00%]

  <bb 3> [local count: 536870912]:
  _8 = _2 > pretmp_9;
  _7 = _8 ? pretmp_9 : _2;
  goto <bb 5>; [100.00%]

  <bb 4> [local count: 536870912]:
  _6 = _4 > pretmp_9;
  _5 = _6 ? pretmp_9 : _4;

  <bb 5> [local count: 1073741824]:
  # _3 = PHI <_7(3), _5(4)>
  return _3;

and the main issue is that we do not resolve the redundant load from *c
by hoisting it before phiopt early but it takes until PRE and late PHIopt
which then does not fully recognize

  <bb 2> [local count: 1073741824]:
  _2 = y;
  _4 = x;
  pretmp_9 = z; 
  if (_2 < _4)
    goto <bb 3>; [50.00%]
  else 
    goto <bb 5>; [50.00%]

  <bb 3> [local count: 536870912]:
  if (_2 > pretmp_9)
    goto <bb 4>; [50.00%]
  else
    goto <bb 7>; [50.00%]

  <bb 4> [local count: 268435456]:
  goto <bb 7>; [100.00%]

  <bb 5> [local count: 536870912]:
  if (_4 > pretmp_9)
    goto <bb 6>; [50.00%]
  else
    goto <bb 7>; [50.00%]

  <bb 6> [local count: 268435456]:

  <bb 7> [local count: 1073741824]:
  # _3 = PHI <_2(3), _4(5), pretmp_9(6), pretmp_9(4)>
  return _3;

since the "nested" min/max recognition code does not recognize the

  _8 = _2 > pretmp_9;
  _7 = _8 ? pretmp_9 : _2;

form of min/max.

Reply via email to