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

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

           What    |Removed                     |Added
----------------------------------------------------------------------------
          Component|middle-end                  |libstdc++

--- Comment #2 from Richard Biener <rguenth at gcc dot gnu.org> ---
FRE5 does

   <bb 23> [local count: 2736164397]:
   # ivtmp.143_71 = PHI <ivtmp.143_186(23), ivtmp.143_187(22)>
   _221 = (void *) ivtmp.143_71;
   _124 = MEM[(int * *)_221 + 8B];
-  _115 = MEM[(const int &)_101];
   _162 = MEM[(const int &)_124];
-  _140 = _115 + _162;
-  *_101 = _140;
+  *_101 = _162;
   __p_61 = _101 + 4;
   _127 = _124 + 4;
-  _131 = MEM[(const int &)__p_61];
   _132 = *_127;
-  _133 = _131 + _132;
-  *__p_61 = _133;
+  *__p_61 = _132;
   __p_136 = __p_61 + 4;
   D.69731 ={v} {CLOBBER};
   ivtmp.143_186 = ivtmp.143_71 + 16;
-  if (ivtmp.143_186 != _60)
+  if (_158 != ivtmp.143_186)
     goto <bb 23>; [89.00%]

which looks wrong at a first glance.  Ah, it's OK because we have

  <bb 23> [local count: 2736164397]:
  # ivtmp.143_71 = PHI <ivtmp.143_186(23), ivtmp.143_187(22)>
  # PT = null { D.69770 } (escaped, escaped heap)
  _221 = (void *) ivtmp.143_71;
  # PT = nonlocal escaped null { D.69771 } (escaped, escaped heap)
  _124 = MEM[(int * *)_221 + 8B clique 11 base 0];
  _115 = MEM[(const int &)_101 clique 11 base 0];
  _162 = MEM[(const int &)_124 clique 11 base 0];
  _140 = _115 + _162;
  MEM[(int *)_101 clique 11 base 1] = _140;
  # PT = { D.69772 } (escaped, escaped heap)
  __p_61 = _101 + 4;
  # PT = nonlocal escaped null { D.69771 } (escaped, escaped heap)
  _127 = _124 + 4;
  _131 = MEM[(const int &)__p_61 clique 11 base 0];
  _132 = MEM[(const int &)_127 clique 11 base 0];
  _133 = _131 + _132;
  MEM[(int *)__p_61 clique 11 base 1] = _133;
  # PT = { D.69772 } (escaped, escaped heap)
  __p_136 = __p_61 + 4;
  D.69731 ={v} {CLOBBER};
  ivtmp.143_186 = ivtmp.143_71 + 16;
  if (ivtmp.143_186 != _60)
    goto <bb 23>; [89.00%]
  else
    goto <bb 21>; [11.00%]

so the load is from clique 11, base 0 while the store is to clique 11, base 1
so they do not alias because of some __restrict marking.  So the issue is
likely 
an invalid testcase or bogus annotation in libstdc++

Reply via email to