1/* { dg-do run } */ 2/* { dg-options "-O2" } */ 3/* { dg-additional-options "-minline-all-stringops" { target { i?86-*-* x86_64-*-* } } } */ 4 5extern void abort (void); 6 7#define MAX_OFFSET (sizeof (long long)) 8#define MAX_COPY (8 * sizeof (long long)) 9#define MAX_EXTRA (sizeof (long long)) 10 11#define MAX_LENGTH (MAX_OFFSET + MAX_COPY + MAX_EXTRA) 12 13static union { 14 char buf[MAX_LENGTH]; 15 long long align_int; 16 long double align_fp; 17} u; 18 19char A[MAX_LENGTH]; 20 21int 22main () 23{ 24 int off, len, i; 25 char *p, *q; 26 27 for (i = 0; i < MAX_LENGTH; i++) 28 A[i] = 'A'; 29 30 for (off = 0; off < MAX_OFFSET; off++) 31 for (len = 1; len < MAX_COPY; len++) 32 { 33 for (i = 0; i < MAX_LENGTH; i++) 34 u.buf[i] = 'a'; 35 36 p = __builtin_memcpy (u.buf + off, A, len); 37 if (p != u.buf + off) 38 abort (); 39 40 q = u.buf; 41 for (i = 0; i < off; i++, q++) 42 if (*q != 'a') 43 abort (); 44 45 for (i = 0; i < len; i++, q++) 46 if (*q != 'A') 47 abort (); 48 49 for (i = 0; i < MAX_EXTRA; i++, q++) 50 if (*q != 'a') 51 abort (); 52 } 53 54 return 0; 55} 56