1/* { dg-do run } */
2/* { dg-options "-O2" } */
3
4void *x (void *pdst, const void *psrc, unsigned int pn)
5{
6  register void *return_dst = pdst;
7  register unsigned char *dst = pdst;
8  register unsigned const char *src = psrc;
9  register int n __asm__ ("ebx") = pn;
10
11  if (src < dst && dst < src + n)
12    {
13      src += n;
14      dst += n;
15      while (n--)
16        *--dst = *--src;
17      return return_dst;
18    }
19
20  while (n >= 16) n--;
21
22  return return_dst;
23}
24extern void abort ();
25extern void exit (int);
26char xx[30] = "abc";
27int main (void)
28{
29  char yy[30] = "aab";
30
31  if (x (xx + 1, xx, 2) != xx + 1 || memcmp (xx, yy, sizeof (yy)) != 0)
32    abort ();
33  exit (0);
34}
35