http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58453

--- Comment #9 from Richard Biener <rguenth at gcc dot gnu.org> ---
Ah, so we have

  _103 = fieldr.e[_51];
  _104 = _102 * _103;
  fieldr.e[_51] = _104;
  _106 = fieldr.d[_51];
  *dlo_107(D)[_51] = _106;
  _109 = _104 / _106;
  *eod_110(D)[_51] = _109;

and distribute it as

  _103 = fieldr.e[_51];
  _104 = _102 * _103;
  fieldr.e[_51] = _104;

  memcpy (dlo, &fieldr.d, ...)

  _103 = fieldr.e[_51];
  _104 = _102 * _103;
  _106 = fieldr.d[_51];
  _109 = _104 / _106;
  *eod_110(D)[_51] = _109;

but that's obviously wrong as we are re-loading a different fieldr.e.

Testcase:

extern void abort (void);

int a[128], b[128], c[128], d[128];

void __attribute__((noinline,noclone))
foo (void)
{
  int i;
  for (i = 0; i < 128; ++i)
    {
      a[i] = a[i] + 1;
      b[i] = d[i];
      c[i] = a[i] / d[i];
    }
}
int main()
{
  int i;
  for (i = 0; i < 128; ++i)
    a[i] = i;
  for (i = 0; i < 128; ++i)
    d[i] = 1;
  foo ();
  if (c[0] != 1)
    abort ();
  return 0;
}

Reply via email to