1 /* { dg-do compile } */
2 /* { dg-options "-O2" } */
3 
4 char *buffer;
5 char *test;
6 
7 #define SIZE 100
8 
9 char *
10 __attribute__((noinline))
my_memcpy(char * d,char * s,unsigned l)11 my_memcpy (char *d, char *s, unsigned l)
12 {
13   return __builtin_memcpy (d, s, l);
14 }
15 
16 char *
17 __attribute__((noinline))
my_mempcpy(char * d,char * s,unsigned l)18 my_mempcpy (char *d, char *s, unsigned l)
19 {
20   return __builtin_mempcpy (d, s, l);
21 }
22 
23 void
run_test(char * d,char * s,unsigned l)24 run_test (char *d, char *s, unsigned l)
25 {
26   char *r = my_mempcpy (d, s, l);
27   if (r != d + l)
28     __builtin_abort ();
29 
30   r = my_memcpy (d, s, l);
31   if (r != d)
32     __builtin_abort ();
33 }
34 
35 int
main(void)36 main (void)
37 {
38   const char* const foo = "hello world";
39   unsigned l = __builtin_strlen (foo) + 1;
40 
41   buffer = __builtin_malloc (SIZE);
42   __builtin_memcpy (buffer, foo, l);
43   test = __builtin_malloc (SIZE);
44 
45   run_test (test, buffer, l);
46 
47   return 0;
48 }
49 
50 /* { dg-final { scan-assembler "mempcpy" } } */
51 /* { dg-final { scan-assembler "memcpy" } } */
52