http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57003
--- Comment #17 from Jakub Jelinek <jakub at gcc dot gnu.org> 2013-04-24 18:45:28 UTC --- Runtime testcase for -O2, works with -O2 -fno-cprop-registers. It doesn't fail always, but around in 50% of cases, and heavily depends on what glibc is in use and what CPU too (as contemporary glibc's have IFUNC memcpy and select implementations based on cpuid). #define N 2001 unsigned short *b, *c, *d; __attribute__ ((noinline, noclone)) unsigned bar (void) { asm volatile ("" : : : "memory"); return N; } __attribute__ ((noinline, noclone)) unsigned short * baz (unsigned long x) { if (x != N * sizeof (unsigned short) + 20) __builtin_abort (); asm volatile ("" : : : "memory"); return d; } __attribute__ ((ms_abi, noinline, noclone)) foo (void) { unsigned d; unsigned short *e; if ((d = bar ())) { e = baz (d * sizeof (unsigned short) + 20); __builtin_memcpy (e, b, d * sizeof (unsigned short)); c = e; } } int main () { unsigned short a[2 * N]; int i; for (i = 0; i < 2 * N; i++) a[i] = i + 1; b = a; d = a + N; asm volatile ("" : : : "memory"); foo (); for (i = 0; i < N; i++) if (a[i] != i + 1 || a[i + N] != i + 1) __builtin_abort (); if (c != a + N) __builtin_abort (); return 0; }