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

gcc-9.2.0
author anatofuz
date Thu, 13 Feb 2020 11:34:05 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
145
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1 /* PR tree-optimization/92226 - live nul char store to array eliminated
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2 { dg-do compile }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3 { dg-options "-O2 -fdump-tree-strlen" } */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
4
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
5 #include "strlenopt.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
6
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
7 #define NOIPA __attribute__ ((noipa))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
8
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
9 /* Verify that the nul store into the destination is only eliminated
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
10 when overwrites the existing terminating nul added by the strcpy call.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
11 Also verify that the second strlen call is eliminated in all cases. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
12 #define T(SIZE, IDX) \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
13 NOIPA void test_ ## SIZE ## _store_nul_ ## IDX (const char *s) \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
14 { \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
15 extern char a ## SIZE[SIZE]; \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
16 char *d = a ## SIZE; \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
17 size_t len = SIZE - 1; \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
18 size_t idx = IDX; \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
19 if (strlen (s) == len) \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
20 { \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
21 strcpy (d, s); \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
22 d[idx] = 0; \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
23 if (strlen (d) != idx) \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
24 abort (); \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
25 } \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
26 } typedef void dummy_type
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
27
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
28
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
29 T (1, 0); // expect nul store to be eliminated
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
30
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
31 T (2, 0); // nul store must be retained
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
32 T (2, 1); // expect nul store to be eliminated
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
33
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
34 // Same as above but for larger arrays.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
35 T (3, 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
36 T (3, 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
37 T (3, 2);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
38
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
39 T (4, 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
40 T (4, 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
41 T (4, 2);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
42 T (4, 3);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
43
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
44 T (5, 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
45 T (5, 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
46 T (5, 2);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
47 T (5, 3);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
48 T (5, 4);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
49
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
50 T (6, 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
51 T (6, 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
52 T (6, 2);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
53 T (6, 3);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
54 T (6, 4);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
55 T (6, 5);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
56
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
57 T (7, 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
58 T (7, 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
59 T (7, 2);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
60 T (7, 3);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
61 T (7, 4);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
62 T (7, 5);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
63 T (7, 6);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
64
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
65 T (8, 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
66 T (8, 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
67 T (8, 2);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
68 T (8, 3);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
69 T (8, 4);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
70 T (8, 5);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
71 T (8, 6);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
72 T (8, 7);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
73
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
74 /* Verify that each function makes just one call to strlen to compute
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
75 the length of its argument (and not also to compute the length of
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
76 the copy):
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
77 { dg-final { scan-tree-dump-times "strlen \\(s_" 36 "strlen1" } }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
78 { dg-final { scan-tree-dump-not "strlen \\(\\&a" "strlen1" } }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
79
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
80 Verify that nul stores into the last array element have been eliminated
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
81 (they are preceded by a strcpy storing into all the elements of the array:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
82 { dg-final { scan-tree-dump-not "a1\\\] = 0;" "strlen1" } }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
83 { dg-final { scan-tree-dump-not "a2 \\\+ 1B\\\] = 0;" "strlen1" } }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
84 { dg-final { scan-tree-dump-not "a3 \\\+ 2B\\\] = 0;" "strlen1" } }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
85 { dg-final { scan-tree-dump-not "a4 \\\+ 3B\\\] = 0;" "strlen1" } }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
86 { dg-final { scan-tree-dump-not "a5 \\\+ 4B\\\] = 0;" "strlen1" } }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
87 { dg-final { scan-tree-dump-not "a6 \\\+ 5B\\\] = 0;" "strlen1" } }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
88 { dg-final { scan-tree-dump-not "a7 \\\+ 6B\\\] = 0;" "strlen1" } }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
89 { dg-final { scan-tree-dump-not "a8 \\\+ 7B\\\] = 0;" "strlen1" } } */