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

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

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|                            |missed-optimization
      Known to fail|                            |13.0
                 CC|                            |rguenth at gcc dot gnu.org
     Ever confirmed|0                           |1
   Last reconfirmed|                            |2023-04-12
          Component|rtl-optimization            |tree-optimization
             Status|UNCONFIRMED                 |NEW

--- Comment #1 from Richard Biener <rguenth at gcc dot gnu.org> ---
Confirmed also on x86_64.  We end up with

  <bb 2> [local count: 118111600]:
  _10 = this_6(D)->ptr_;
  _11 = this_6(D)->data_;
  if (_10 > _11)
    goto <bb 3>; [89.00%]
  else
    goto <bb 4>; [11.00%]

  <bb 3> [local count: 955630225]:
  # _12 = PHI <_1(3), _10(2)>
  _1 = _12 + 18446744073709551608;
  this_6(D)->ptr_ = _1;
  if (_1 > _11)
    goto <bb 3>; [89.00%]
  else
    goto <bb 4>; [11.00%]

  <bb 4> [local count: 118111600]:
  return;

where for some reason we fail to sink the store out of the loop.  Ah,
at sink/sm time we still have

  <bb 3> [local count: 955630225]:
  # _12 = PHI <_1(6), _10(5)>
  _1 = _12 + 18446744073709551608;
  this_6(D)->ptr_ = _1;
  MEM[(long int *)_12 + -8B] ={v} {CLOBBER};
  if (_1 > _11)

there's another bug about this inability to handle CLOBBERs (from LIM),
but I can't find it right now.  I think we need to get rid of
pointer-based clobbers way earlier (before loop opts - currently they
survive until fab), but the issue is also present for decl clobbers.

Reply via email to