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; }