annotate gcc/testsuite/gcc.dg/strlenopt-14g.c @ 145:1830386684a0

gcc-9.2.0
author anatofuz
date Thu, 13 Feb 2020 11:34:05 +0900
parents 04ced10e8804
children
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 and mempcpy functions. */
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
2 /* { dg-do run { target *-*-linux* *-*-gnu* *-*-uclinux* } } */
111
kono
parents:
diff changeset
3 /* { dg-options "-O2 -fdump-tree-strlen" } */
kono
parents:
diff changeset
4 /* Bionic targets don't have mempcpy */
kono
parents:
diff changeset
5 /* { dg-require-effective-target non_bionic } */
kono
parents:
diff changeset
6
kono
parents:
diff changeset
7 #define USE_GNU
kono
parents:
diff changeset
8 #include "strlenopt.h"
kono
parents:
diff changeset
9
kono
parents:
diff changeset
10 __attribute__((noinline, noclone)) char *
kono
parents:
diff changeset
11 fn1 (char *p, size_t *l1, size_t *l2)
kono
parents:
diff changeset
12 {
kono
parents:
diff changeset
13 char *a = mempcpy (p, "abcde", 6);
kono
parents:
diff changeset
14 /* This strlen needs to stay. */
kono
parents:
diff changeset
15 size_t la = strlen (a);
kono
parents:
diff changeset
16 /* This strlen can be optimized into 5. */
kono
parents:
diff changeset
17 size_t lp = strlen (p);
kono
parents:
diff changeset
18 *l1 = la;
kono
parents:
diff changeset
19 *l2 = lp;
kono
parents:
diff changeset
20 return a;
kono
parents:
diff changeset
21 }
kono
parents:
diff changeset
22
kono
parents:
diff changeset
23 __attribute__((noinline, noclone)) char *
kono
parents:
diff changeset
24 fn2 (char *p, const char *q, size_t *l1, size_t *l2, size_t *l3)
kono
parents:
diff changeset
25 {
kono
parents:
diff changeset
26 /* This strlen needs to stay. */
kono
parents:
diff changeset
27 size_t lq = strlen (q);
kono
parents:
diff changeset
28 char *a = mempcpy (p, q, lq + 1);
kono
parents:
diff changeset
29 /* This strlen needs to stay. */
kono
parents:
diff changeset
30 size_t la = strlen (a);
kono
parents:
diff changeset
31 /* This strlen can be optimized into lq. */
kono
parents:
diff changeset
32 size_t lp = strlen (p);
kono
parents:
diff changeset
33 *l1 = lq;
kono
parents:
diff changeset
34 *l2 = la;
kono
parents:
diff changeset
35 *l3 = lp;
kono
parents:
diff changeset
36 return a;
kono
parents:
diff changeset
37 }
kono
parents:
diff changeset
38
kono
parents:
diff changeset
39 __attribute__((noinline, noclone)) char *
kono
parents:
diff changeset
40 fn3 (char *p, size_t *l1, size_t *l2)
kono
parents:
diff changeset
41 {
kono
parents:
diff changeset
42 char *a = stpcpy (p, "abcde");
kono
parents:
diff changeset
43 /* This strlen can be optimized into 0. */
kono
parents:
diff changeset
44 size_t la = strlen (a);
kono
parents:
diff changeset
45 /* This strlen can be optimized into 5. */
kono
parents:
diff changeset
46 size_t lp = strlen (p);
kono
parents:
diff changeset
47 *l1 = la;
kono
parents:
diff changeset
48 *l2 = lp;
kono
parents:
diff changeset
49 return a;
kono
parents:
diff changeset
50 }
kono
parents:
diff changeset
51
kono
parents:
diff changeset
52 __attribute__((noinline, noclone)) char *
kono
parents:
diff changeset
53 fn4 (char *p, const char *q, size_t *l1, size_t *l2, size_t *l3)
kono
parents:
diff changeset
54 {
kono
parents:
diff changeset
55 /* This strlen needs to stay. */
kono
parents:
diff changeset
56 size_t lq = strlen (q);
kono
parents:
diff changeset
57 char *a = stpcpy (p, q);
kono
parents:
diff changeset
58 /* This strlen can be optimized into 0. */
kono
parents:
diff changeset
59 size_t la = strlen (a);
kono
parents:
diff changeset
60 /* This strlen can be optimized into lq. */
kono
parents:
diff changeset
61 size_t lp = strlen (p);
kono
parents:
diff changeset
62 *l1 = lq;
kono
parents:
diff changeset
63 *l2 = la;
kono
parents:
diff changeset
64 *l3 = lp;
kono
parents:
diff changeset
65 return a;
kono
parents:
diff changeset
66 }
kono
parents:
diff changeset
67
kono
parents:
diff changeset
68 __attribute__((noinline, noclone)) char *
kono
parents:
diff changeset
69 fn5 (char *p, const char *q, size_t *l1, size_t *l2)
kono
parents:
diff changeset
70 {
kono
parents:
diff changeset
71 char *a = stpcpy (p, q);
kono
parents:
diff changeset
72 /* This strlen can be optimized into 0. */
kono
parents:
diff changeset
73 size_t la = strlen (a);
kono
parents:
diff changeset
74 /* This strlen can be optimized into a - p. */
kono
parents:
diff changeset
75 size_t lp = strlen (p);
kono
parents:
diff changeset
76 *l1 = la;
kono
parents:
diff changeset
77 *l2 = lp;
kono
parents:
diff changeset
78 return a;
kono
parents:
diff changeset
79 }
kono
parents:
diff changeset
80
kono
parents:
diff changeset
81 int
kono
parents:
diff changeset
82 main ()
kono
parents:
diff changeset
83 {
kono
parents:
diff changeset
84 char buf[64];
kono
parents:
diff changeset
85 const char *volatile q = "ABCDEFGH";
kono
parents:
diff changeset
86 size_t l1, l2, l3;
kono
parents:
diff changeset
87 memset (buf, '\0', sizeof buf);
kono
parents:
diff changeset
88 memset (buf + 6, 'z', 7);
kono
parents:
diff changeset
89 if (fn1 (buf, &l1, &l2) != buf + 6 || l1 != 7 || l2 != 5
kono
parents:
diff changeset
90 || memcmp (buf, "abcde\0zzzzzzz", 14) != 0)
kono
parents:
diff changeset
91 abort ();
kono
parents:
diff changeset
92 if (fn2 (buf, q, &l1, &l2, &l3) != buf + 9 || l1 != 8 || l2 != 4 || l3 != 8
kono
parents:
diff changeset
93 || memcmp (buf, "ABCDEFGH\0zzzz", 14) != 0)
kono
parents:
diff changeset
94 abort ();
kono
parents:
diff changeset
95 if (fn3 (buf, &l1, &l2) != buf + 5 || l1 != 0 || l2 != 5
kono
parents:
diff changeset
96 || memcmp (buf, "abcde\0GH\0zzzz", 14) != 0)
kono
parents:
diff changeset
97 abort ();
kono
parents:
diff changeset
98 l3 = 0;
kono
parents:
diff changeset
99 memset (buf, 'n', 9);
kono
parents:
diff changeset
100 if (fn4 (buf, q, &l1, &l2, &l3) != buf + 8 || l1 != 8 || l2 != 0 || l3 != 8
kono
parents:
diff changeset
101 || memcmp (buf, "ABCDEFGH\0zzzz", 14) != 0)
kono
parents:
diff changeset
102 abort ();
kono
parents:
diff changeset
103 memset (buf, 'm', 9);
kono
parents:
diff changeset
104 if (fn5 (buf, q, &l1, &l2) != buf + 8 || l1 != 0 || l2 != 8
kono
parents:
diff changeset
105 || memcmp (buf, "ABCDEFGH\0zzzz", 14) != 0)
kono
parents:
diff changeset
106 abort ();
kono
parents:
diff changeset
107 return 0;
kono
parents:
diff changeset
108 }
kono
parents:
diff changeset
109
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
110 /* { dg-final { scan-tree-dump-times "strlen \\(" 4 "strlen1" } } */
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
111 /* { dg-final { scan-tree-dump-times "memcpy \\(" 1 "strlen1" } } */
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
112 /* { dg-final { scan-tree-dump-times "mempcpy \\(" 2 "strlen1" } } */
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
113 /* { dg-final { scan-tree-dump-times "strcpy \\(" 0 "strlen1" } } */
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
114 /* { dg-final { scan-tree-dump-times "strcat \\(" 0 "strlen1" } } */
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
115 /* { dg-final { scan-tree-dump-times "strchr \\(" 0 "strlen1" } } */
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
116 /* { dg-final { scan-tree-dump-times "stpcpy \\(" 2 "strlen1" } } */