annotate gcc/testsuite/gcc.dg/strlenopt-9.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 /* { dg-do run } */
kono
parents:
diff changeset
2 /* { dg-options "-O2 -fno-code-hoisting -fdump-tree-strlen -fdump-tree-optimized" } */
kono
parents:
diff changeset
3
kono
parents:
diff changeset
4 #include "strlenopt.h"
kono
parents:
diff changeset
5
kono
parents:
diff changeset
6 __attribute__((noinline, noclone)) char *
kono
parents:
diff changeset
7 fn1 (int r)
kono
parents:
diff changeset
8 {
kono
parents:
diff changeset
9 char *p = r ? "a" : "bc";
kono
parents:
diff changeset
10 /* String length for p varies, therefore strchr below isn't
kono
parents:
diff changeset
11 optimized away. */
kono
parents:
diff changeset
12 return strchr (p, '\0');
kono
parents:
diff changeset
13 }
kono
parents:
diff changeset
14
kono
parents:
diff changeset
15 __attribute__((noinline, noclone)) size_t
kono
parents:
diff changeset
16 fn2 (int r)
kono
parents:
diff changeset
17 {
kono
parents:
diff changeset
18 char *p, q[10];
kono
parents:
diff changeset
19 strcpy (q, "abc");
kono
parents:
diff changeset
20 p = r ? "a" : q;
kono
parents:
diff changeset
21 /* String length is constant for both alternatives, and strlen is
kono
parents:
diff changeset
22 optimized away. */
kono
parents:
diff changeset
23 return strlen (p);
kono
parents:
diff changeset
24 }
kono
parents:
diff changeset
25
kono
parents:
diff changeset
26 __attribute__((noinline, noclone)) size_t
kono
parents:
diff changeset
27 fn3 (char *p, int n)
kono
parents:
diff changeset
28 {
kono
parents:
diff changeset
29 int i;
kono
parents:
diff changeset
30 p = strchr (p, '\0');
kono
parents:
diff changeset
31 /* strcat here can be optimized into memcpy. */
kono
parents:
diff changeset
32 strcat (p, "abcd");
kono
parents:
diff changeset
33 for (i = 0; i < n; i++)
kono
parents:
diff changeset
34 if ((i % 123) == 53)
kono
parents:
diff changeset
35 /* strcat here is optimized into strlen and memcpy. */
kono
parents:
diff changeset
36 strcat (p, "efg");
kono
parents:
diff changeset
37 /* The strlen here can't be optimized away, as in the loop string
kono
parents:
diff changeset
38 length of p might change. */
kono
parents:
diff changeset
39 return strlen (p);
kono
parents:
diff changeset
40 }
kono
parents:
diff changeset
41
kono
parents:
diff changeset
42 char buf[64];
kono
parents:
diff changeset
43
kono
parents:
diff changeset
44 __attribute__((noinline, noclone)) size_t
kono
parents:
diff changeset
45 fn4 (char *x, int n)
kono
parents:
diff changeset
46 {
kono
parents:
diff changeset
47 int i;
kono
parents:
diff changeset
48 size_t l;
kono
parents:
diff changeset
49 char a[64];
kono
parents:
diff changeset
50 char *p = strchr (x, '\0');
kono
parents:
diff changeset
51 /* strcpy here is optimized into memcpy, length computed as p - x + 1. */
kono
parents:
diff changeset
52 strcpy (a, x);
kono
parents:
diff changeset
53 /* strcat here is optimized into memcpy. */
kono
parents:
diff changeset
54 strcat (p, "abcd");
kono
parents:
diff changeset
55 for (i = 0; i < n; i++)
kono
parents:
diff changeset
56 if ((i % 123) == 53)
kono
parents:
diff changeset
57 /* strcat here is optimized into strlen and memcpy. */
kono
parents:
diff changeset
58 strcat (a, "efg");
kono
parents:
diff changeset
59 /* The strlen should be optimized here into 4. */
kono
parents:
diff changeset
60 l = strlen (p);
kono
parents:
diff changeset
61 /* This stays strcpy. */
kono
parents:
diff changeset
62 strcpy (buf, a);
kono
parents:
diff changeset
63 return l;
kono
parents:
diff changeset
64 }
kono
parents:
diff changeset
65
kono
parents:
diff changeset
66 int
kono
parents:
diff changeset
67 main ()
kono
parents:
diff changeset
68 {
kono
parents:
diff changeset
69 volatile int l = 1;
kono
parents:
diff changeset
70 char b[64];
kono
parents:
diff changeset
71
kono
parents:
diff changeset
72 if (memcmp (fn1 (l) - 1, "a", 2) != 0)
kono
parents:
diff changeset
73 abort ();
kono
parents:
diff changeset
74 if (memcmp (fn1 (!l) - 2, "bc", 3) != 0)
kono
parents:
diff changeset
75 abort ();
kono
parents:
diff changeset
76 if (fn2 (l) != 1 || fn2 (!l) != 3)
kono
parents:
diff changeset
77 abort ();
kono
parents:
diff changeset
78 memset (b, '\0', sizeof b);
kono
parents:
diff changeset
79 memset (b, 'a', 3);
kono
parents:
diff changeset
80 if (fn3 (b, 10) != 4 || memcmp (b, "aaaabcd", 8) != 0)
kono
parents:
diff changeset
81 abort ();
kono
parents:
diff changeset
82 if (fn3 (b, 128) != 7 || memcmp (b, "aaaabcdabcdefg", 15) != 0)
kono
parents:
diff changeset
83 abort ();
kono
parents:
diff changeset
84 if (fn3 (b, 256) != 10 || memcmp (b, "aaaabcdabcdefgabcdefgefg", 25) != 0)
kono
parents:
diff changeset
85 abort ();
kono
parents:
diff changeset
86 if (fn4 (b, 10) != 4
kono
parents:
diff changeset
87 || memcmp (b, "aaaabcdabcdefgabcdefgefgabcd", 29) != 0
kono
parents:
diff changeset
88 || memcmp (buf, "aaaabcdabcdefgabcdefgefg", 25) != 0)
kono
parents:
diff changeset
89 abort ();
kono
parents:
diff changeset
90 if (fn4 (b, 128) != 4
kono
parents:
diff changeset
91 || memcmp (b, "aaaabcdabcdefgabcdefgefgabcdabcd", 33) != 0
kono
parents:
diff changeset
92 || memcmp (buf, "aaaabcdabcdefgabcdefgefgabcdefg", 32) != 0)
kono
parents:
diff changeset
93 abort ();
kono
parents:
diff changeset
94 if (fn4 (b, 256) != 4
kono
parents:
diff changeset
95 || memcmp (b, "aaaabcdabcdefgabcdefgefgabcdabcdabcd", 37) != 0
kono
parents:
diff changeset
96 || memcmp (buf, "aaaabcdabcdefgabcdefgefgabcdabcdefgefg", 39) != 0)
kono
parents:
diff changeset
97 abort ();
kono
parents:
diff changeset
98 return 0;
kono
parents:
diff changeset
99 }
kono
parents:
diff changeset
100
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
101 /* { dg-final { scan-tree-dump-times "strlen \\(" 5 "strlen1" } } */
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
102 /* { dg-final { scan-tree-dump-times "memcpy \\(" 6 "strlen1" } } */
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
103 /* { dg-final { scan-tree-dump-times "strcpy \\(" 1 "strlen1" } } */
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
104 /* { dg-final { scan-tree-dump-times "strcat \\(" 0 "strlen1" } } */
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
105 /* { dg-final { scan-tree-dump-times "strchr \\(" 0 "strlen1" } } */
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
106 /* { dg-final { scan-tree-dump-times "stpcpy \\(" 0 "strlen1" } } */
111
kono
parents:
diff changeset
107 /* { dg-final { scan-tree-dump-times "return 4;" 1 "optimized" } } */