annotate gcc/testsuite/gcc.dg/strlenopt-17g.c @ 111:04ced10e8804

gcc 7
author kono
date Fri, 27 Oct 2017 22:46:09 +0900
parents
children 1830386684a0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 /* This test needs runtime that provides stpcpy function. */
kono
parents:
diff changeset
2 /* { dg-do run { target *-*-linux* *-*-gnu* } } */
kono
parents:
diff changeset
3 /* { dg-options "-O2 -fdump-tree-strlen" } */
kono
parents:
diff changeset
4
kono
parents:
diff changeset
5 #define USE_GNU
kono
parents:
diff changeset
6 #include "strlenopt.h"
kono
parents:
diff changeset
7
kono
parents:
diff changeset
8 __attribute__((noinline, noclone)) int
kono
parents:
diff changeset
9 foo (const char *p)
kono
parents:
diff changeset
10 {
kono
parents:
diff changeset
11 static int c;
kono
parents:
diff changeset
12 const char *q[] = { "123498765abcde", "123498765..", "129abcde", "129abcde" };
kono
parents:
diff changeset
13 if (strcmp (p, q[c]) != 0)
kono
parents:
diff changeset
14 abort ();
kono
parents:
diff changeset
15 return c++;
kono
parents:
diff changeset
16 }
kono
parents:
diff changeset
17
kono
parents:
diff changeset
18 __attribute__((noinline, noclone)) void
kono
parents:
diff changeset
19 bar (const char *p, const char *q)
kono
parents:
diff changeset
20 {
kono
parents:
diff changeset
21 size_t l;
kono
parents:
diff changeset
22 /* This strlen stays. */
kono
parents:
diff changeset
23 char *a = __builtin_alloca (strlen (p) + 50);
kono
parents:
diff changeset
24 /* strcpy can be optimized into memcpy. */
kono
parents:
diff changeset
25 strcpy (a, p);
kono
parents:
diff changeset
26 /* strcat into stpcpy. */
kono
parents:
diff changeset
27 strcat (a, q);
kono
parents:
diff changeset
28 /* This strlen can be optimized away. */
kono
parents:
diff changeset
29 l = strlen (a);
kono
parents:
diff changeset
30 /* This becomes memcpy. */
kono
parents:
diff changeset
31 strcat (a, "abcde");
kono
parents:
diff changeset
32 if (!foo (a))
kono
parents:
diff changeset
33 /* And this one too. */
kono
parents:
diff changeset
34 strcpy (a + l, "..");
kono
parents:
diff changeset
35 foo (a);
kono
parents:
diff changeset
36 }
kono
parents:
diff changeset
37
kono
parents:
diff changeset
38 int
kono
parents:
diff changeset
39 main ()
kono
parents:
diff changeset
40 {
kono
parents:
diff changeset
41 const char *volatile s1 = "1234";
kono
parents:
diff changeset
42 const char *volatile s2 = "98765";
kono
parents:
diff changeset
43 const char *volatile s3 = "12";
kono
parents:
diff changeset
44 const char *volatile s4 = "9";
kono
parents:
diff changeset
45 bar (s1, s2);
kono
parents:
diff changeset
46 bar (s3, s4);
kono
parents:
diff changeset
47 return 0;
kono
parents:
diff changeset
48 }
kono
parents:
diff changeset
49
kono
parents:
diff changeset
50 /* { dg-final { scan-tree-dump-times "strlen \\(" 1 "strlen" } } */
kono
parents:
diff changeset
51 /* { dg-final { scan-tree-dump-times "memcpy \\(" 3 "strlen" } } */
kono
parents:
diff changeset
52 /* { dg-final { scan-tree-dump-times "mempcpy \\(" 0 "strlen" } } */
kono
parents:
diff changeset
53 /* { dg-final { scan-tree-dump-times "strcpy \\(" 0 "strlen" } } */
kono
parents:
diff changeset
54 /* { dg-final { scan-tree-dump-times "strcat \\(" 0 "strlen" } } */
kono
parents:
diff changeset
55 /* { dg-final { scan-tree-dump-times "strchr \\(" 0 "strlen" } } */
kono
parents:
diff changeset
56 /* { dg-final { scan-tree-dump-times "stpcpy \\(" 1 "strlen" } } */