OSDN Git Service

Latest updates from FSF 4.7 branch
[pf3gnuchains/gcc-fork.git] / gcc / testsuite / gcc.dg / strlenopt-11.c
1 /* { dg-do run } */
2 /* { dg-options "-O2 -fdump-tree-strlen" } */
3 /* { dg-skip-if "" { m32c-*-* } { "*" } { "" } } */
4
5 #include "strlenopt.h"
6
7 __attribute__((noinline, noclone)) void
8 fn1 (char *p, const char *z, size_t *lp)
9 {
10   char *q, *r, *s;
11   char buf[64];
12   size_t l[11];
13   /* The first strlen stays, all the strcpy calls can be optimized
14      into memcpy and most other strlen calls and all strchr calls
15      optimized away.  l[6] = strlen (r); and l[9] = strlen (r); need
16      to stay, because we need to invalidate the knowledge about
17      r strlen after strcpy (q, "jklmnopqrst").  */
18   l[0] = strlen (z);
19   strcpy (buf, z);
20   strcpy (p, "abcde");
21   q = strchr (p, '\0');
22   strcpy (q, "efghi");
23   r = strchr (q, '\0');
24   strcpy (r, buf);
25   l[1] = strlen (p);
26   l[2] = strlen (q);
27   l[3] = strlen (r);
28   strcpy (q, "jklmnopqrst");
29   l[4] = strlen (p);
30   l[5] = strlen (q);
31   l[6] = strlen (r);
32   s = strchr (q, '\0');
33   strcpy (s, buf);
34   l[7] = strlen (p);
35   l[8] = strlen (q);
36   l[9] = strlen (r);
37   l[10] = strlen (s);
38   memcpy (lp, l, sizeof l);
39 }
40
41 int
42 main ()
43 {
44   char buf[64];
45   size_t l[11];
46   const char *volatile z = "ABCDEFG";
47   memset (buf, '\0', sizeof buf);
48   fn1 (buf, z, l);
49   if (memcmp (buf, "abcdejklmnopqrstABCDEFG", 24) != 0)
50     abort ();
51   if (l[0] != 7)
52     abort ();
53   if (l[1] != 17 || l[2] != 12 || l[3] != 7)
54     abort ();
55   if (l[4] != 16 || l[5] != 11 || l[6] != 6)
56     abort ();
57   if (l[7] != 23 || l[8] != 18 || l[9] != 13 || l[10] != 7)
58     abort ();
59   return 0;
60 }
61
62 /* { dg-final { scan-tree-dump-times "strlen \\(" 3 "strlen" } } */
63 /* { dg-final { scan-tree-dump-times "memcpy \\(" 7 "strlen" } } */
64 /* { dg-final { scan-tree-dump-times "strcpy \\(" 0 "strlen" } } */
65 /* { dg-final { scan-tree-dump-times "strcat \\(" 0 "strlen" } } */
66 /* { dg-final { scan-tree-dump-times "strchr \\(" 0 "strlen" } } */
67 /* { dg-final { scan-tree-dump-times "stpcpy \\(" 0 "strlen" } } */
68 /* { dg-final { scan-tree-dump-times "  D\.\[0-9_\]* = strlen \\(\[^\n\r\]*;\[\n\r\]*  l.0. = " 1 "strlen" } } */
69 /* { dg-final { scan-tree-dump-times "  D\.\[0-9_\]* = strlen \\(\[^\n\r\]*;\[\n\r\]*  l.6. = " 1 "strlen" } } */
70 /* { dg-final { scan-tree-dump-times "  D\.\[0-9_\]* = strlen \\(\[^\n\r\]*;\[\n\r\]*  l.9. = " 1 "strlen" } } */
71 /* { dg-final { cleanup-tree-dump "strlen" } } */