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;

}

Reply via email to