Mercurial > hg > CbC > CbC_gcc
comparison gcc/testsuite/gcc.dg/strlenopt-52.c @ 131:84e7813d76e9
gcc-8.2
author | mir3636 |
---|---|
date | Thu, 25 Oct 2018 07:37:49 +0900 |
parents | |
children | 1830386684a0 |
comparison
equal
deleted
inserted
replaced
111:04ced10e8804 | 131:84e7813d76e9 |
---|---|
1 /* PR tree-optimization/77357 - strlen of constant strings not folded | |
2 { dg-do compile } | |
3 { dg-options "-O2 -Wall -fdump-tree-gimple -fdump-tree-ccp" } */ | |
4 | |
5 #include "strlenopt.h" | |
6 | |
7 #define CONCAT(x, y) x ## y | |
8 #define CAT(x, y) CONCAT (x, y) | |
9 #define FAILNAME(name) CAT (call_ ## name ##_on_line_, __LINE__) | |
10 | |
11 #define FAIL(name) do { \ | |
12 extern void FAILNAME (name) (void); \ | |
13 FAILNAME (name)(); \ | |
14 } while (0) | |
15 | |
16 /* Macro to emit a call to funcation named | |
17 call_in_true_branch_not_eliminated_on_line_NNN() | |
18 for each call that's expected to be eliminated. The dg-final | |
19 scan-tree-dump-time directive at the bottom of the test verifies | |
20 that no such call appears in output. */ | |
21 #define ELIM(expr) \ | |
22 if (!(expr)) FAIL (in_true_branch_not_eliminated); else (void)0 | |
23 | |
24 #define T(s, n) ELIM (strlen (s) == n) | |
25 | |
26 | |
27 struct S | |
28 { | |
29 char a1[1], a2[2], a3[3], a4[4], a5[5], a6[6], a7[7], a8[8], a9[9]; | |
30 }; | |
31 | |
32 #define S0 "" | |
33 #define S1 "1" | |
34 #define S2 "12" | |
35 #define S3 "123" | |
36 #define S4 "1234" | |
37 #define S5 "12345" | |
38 #define S6 "123456" | |
39 #define S7 "1234567" | |
40 #define S8 "12345678" | |
41 | |
42 const char a9[][9] = { S0, S1, S2, S3, S4, S5, S6, S7, S8 }; | |
43 | |
44 const char a_1_9[1][9] = { S8 }; | |
45 const char a_2_9[2][9] = { S8, S7}; | |
46 | |
47 const char a9_9[][9][9] = { | |
48 { S0, S0, S0, S0, S0, S0, S0, S0, S0 }, | |
49 { S0, S1, S1, S1, S1, S1, S1, S1, S1 }, | |
50 { S0, S1, S2, S2, S2, S2, S2, S2, S2 }, | |
51 { S0, S1, S2, S3, S3, S3, S3, S3, S3 }, | |
52 { S0, S1, S2, S3, S4, S4, S4, S4, S4 }, | |
53 { S0, S1, S2, S3, S4, S5, S5, S5, S5 }, | |
54 { S0, S1, S2, S3, S4, S5, S6, S6, S6 }, | |
55 { S0, S1, S2, S3, S4, S5, S6, S7, S7 }, | |
56 { S0, S1, S2, S3, S4, S5, S6, S7, S8 } | |
57 }; | |
58 | |
59 const struct S s = { S0, S1, S2, S3, S4, S5, S6, S7, S8 }; | |
60 | |
61 const struct S sa[9] = { | |
62 { S0, S0, S0, S0, S0, S0, S0, S0, S0 }, | |
63 { S0, S1, S1, S1, S1, S1, S1, S1, S1 }, | |
64 { S0, S1, S2, S2, S2, S2, S2, S2, S2 }, | |
65 { S0, S1, S2, S3, S3, S3, S3, S3, S3 }, | |
66 { S0, S1, S2, S3, S4, S4, S4, S4, S4 }, | |
67 { S0, S1, S2, S3, S4, S5, S5, S5, S5 }, | |
68 { S0, S1, S2, S3, S4, S5, S6, S6, S6 }, | |
69 { S0, S1, S2, S3, S4, S5, S6, S7, S7 }, | |
70 { S0, S1, S2, S3, S4, S5, S6, S7, S8 } | |
71 }; | |
72 | |
73 const struct S sa3_5_7[3][5][7] = { | |
74 [1][2][3].a2 = S1, [1][3][5].a3 = S2, [2][4][5].a4 = S3 | |
75 }; | |
76 | |
77 | |
78 void test_global_array (void) | |
79 { | |
80 T (a9[0], 0); T (a9[0] + 0, 0); T (a9[0] + 0, 0); T (a9[0] + 0, 0); | |
81 T (a9[1], 1); T (a9[1] + 1, 0); T (a9[1] + 1, 0); T (a9[1] + 1, 0); | |
82 T (a9[2], 2); | |
83 T (a9[2] + 1, 1); | |
84 T (a9[2] + 2, 0); | |
85 T (a9[2] + 2, 0); | |
86 | |
87 T (a9[3], 3); T (a9[3] + 1, 2); T (a9[3] + 2, 1); T (a9[3] + 3, 0); | |
88 T (a9[4], 4); T (a9[4] + 1, 3); T (a9[4] + 2, 2); T (a9[4] + 3, 1); | |
89 T (a9[5], 5); T (a9[5] + 1, 4); T (a9[5] + 2, 3); T (a9[5] + 3, 2); | |
90 T (a9[6], 6); T (a9[6] + 1, 5); T (a9[6] + 2, 4); T (a9[6] + 3, 3); | |
91 T (a9[7], 7); T (a9[7] + 1, 6); T (a9[7] + 2, 5); T (a9[7] + 3, 4); | |
92 T (a9[8], 8); T (a9[8] + 1, 7); T (a9[8] + 2, 6); T (a9[8] + 3, 5); | |
93 | |
94 T (a_1_9[0], 8); | |
95 T (a_1_9[0] + 1, 7); | |
96 T (a_1_9[0] + 7, 1); | |
97 T (a_1_9[0] + 8, 0); | |
98 | |
99 T (a_2_9[0], 8); | |
100 T (a_2_9[0] + 1, 7); | |
101 T (a_2_9[0] + 7, 1); | |
102 T (a_2_9[0] + 8, 0); | |
103 | |
104 T (a_2_9[1], 7); | |
105 T (a_2_9[1] + 1, 6); | |
106 T (a_2_9[1] + 6, 1); | |
107 T (a_2_9[1] + 7, 0); | |
108 T (a_2_9[1] + 8, 0); | |
109 } | |
110 | |
111 void test_global_array_array (void) | |
112 { | |
113 T (a9_9[0][0], 0); T (a9_9[1][0], 0); T (a9_9[2][0], 0); | |
114 T (a9_9[0][1], 0); T (a9_9[1][1], 1); T (a9_9[2][1], 1); | |
115 T (a9_9[0][2], 0); T (a9_9[1][2], 1); T (a9_9[2][2], 2); | |
116 T (a9_9[0][3], 0); T (a9_9[1][3], 1); T (a9_9[2][3], 2); | |
117 T (a9_9[0][4], 0); T (a9_9[1][4], 1); T (a9_9[2][4], 2); | |
118 T (a9_9[0][5], 0); T (a9_9[1][5], 1); T (a9_9[2][5], 2); | |
119 T (a9_9[0][6], 0); T (a9_9[1][6], 1); T (a9_9[2][6], 2); | |
120 T (a9_9[0][7], 0); T (a9_9[1][7], 1); T (a9_9[2][7], 2); | |
121 T (a9_9[0][8], 0); T (a9_9[1][8], 1); T (a9_9[2][8], 2); | |
122 | |
123 T (a9_9[3][0], 0); T (a9_9[4][0], 0); T (a9_9[5][0], 0); | |
124 T (a9_9[3][1], 1); T (a9_9[4][1], 1); T (a9_9[5][1], 1); | |
125 T (a9_9[3][2], 2); T (a9_9[4][2], 2); T (a9_9[5][2], 2); | |
126 T (a9_9[3][3], 3); T (a9_9[4][3], 3); T (a9_9[5][3], 3); | |
127 T (a9_9[3][4], 3); T (a9_9[4][4], 4); T (a9_9[5][4], 4); | |
128 T (a9_9[3][5], 3); T (a9_9[4][5], 4); T (a9_9[5][5], 5); | |
129 T (a9_9[3][6], 3); T (a9_9[4][6], 4); T (a9_9[5][6], 5); | |
130 T (a9_9[3][7], 3); T (a9_9[4][7], 4); T (a9_9[5][7], 5); | |
131 T (a9_9[3][8], 3); T (a9_9[4][8], 4); T (a9_9[5][8], 5); | |
132 | |
133 T (a9_9[6][0], 0); T (a9_9[7][0], 0); T (a9_9[8][0], 0); | |
134 T (a9_9[6][1], 1); T (a9_9[7][1], 1); T (a9_9[8][1], 1); | |
135 T (a9_9[6][2], 2); T (a9_9[7][2], 2); T (a9_9[8][2], 2); | |
136 T (a9_9[6][3], 3); T (a9_9[7][3], 3); T (a9_9[8][3], 3); | |
137 T (a9_9[6][4], 4); T (a9_9[7][4], 4); T (a9_9[8][4], 4); | |
138 T (a9_9[6][5], 5); T (a9_9[7][5], 5); T (a9_9[8][5], 5); | |
139 T (a9_9[6][6], 6); T (a9_9[7][6], 6); T (a9_9[8][6], 6); | |
140 T (a9_9[6][7], 6); T (a9_9[7][7], 7); T (a9_9[8][7], 7); | |
141 T (a9_9[6][8], 6); T (a9_9[7][8], 7); T (a9_9[8][8], 8); | |
142 | |
143 | |
144 T (a9_9[0][0] + 1, 0); T (a9_9[1][0] + 1, 0); T (a9_9[2][0] + 2, 0); | |
145 T (a9_9[0][1] + 2, 0); T (a9_9[1][1] + 1, 0); T (a9_9[2][1] + 2, 0); | |
146 T (a9_9[0][2] + 3, 0); T (a9_9[1][2] + 1, 0); T (a9_9[2][2] + 2, 0); | |
147 T (a9_9[0][3] + 4, 0); T (a9_9[1][3] + 1, 0); T (a9_9[2][3] + 2, 0); | |
148 T (a9_9[0][4] + 5, 0); T (a9_9[1][4] + 1, 0); T (a9_9[2][4] + 2, 0); | |
149 T (a9_9[0][5] + 6, 0); T (a9_9[1][5] + 1, 0); T (a9_9[2][5] + 2, 0); | |
150 T (a9_9[0][6] + 7, 0); T (a9_9[1][6] + 1, 0); T (a9_9[2][6] + 2, 0); | |
151 T (a9_9[0][7] + 8, 0); T (a9_9[1][7] + 1, 0); T (a9_9[2][7] + 2, 0); | |
152 } | |
153 | |
154 void test_global_struct (void) | |
155 { | |
156 T (s.a1, 0); | |
157 T (s.a2, 1); | |
158 T (s.a3, 2); | |
159 T (s.a4, 3); | |
160 T (s.a5, 4); | |
161 T (s.a6, 5); | |
162 T (s.a7, 6); | |
163 T (s.a8, 7); | |
164 T (s.a9, 8); | |
165 } | |
166 | |
167 void test_global_struct_array (void) | |
168 { | |
169 T (sa[0].a1, 0); T (sa[1].a1, 0); T (sa[2].a1, 0); T (sa[3].a1, 0); | |
170 T (sa[0].a2, 0); T (sa[1].a2, 1); T (sa[2].a2, 1); T (sa[3].a2, 1); | |
171 T (sa[0].a3, 0); T (sa[1].a3, 1); T (sa[2].a3, 2); T (sa[3].a3, 2); | |
172 T (sa[0].a4, 0); T (sa[1].a4, 1); T (sa[2].a4, 2); T (sa[3].a4, 3); | |
173 T (sa[0].a5, 0); T (sa[1].a5, 1); T (sa[2].a5, 2); T (sa[3].a5, 3); | |
174 T (sa[0].a6, 0); T (sa[1].a6, 1); T (sa[2].a6, 2); T (sa[3].a6, 3); | |
175 T (sa[0].a7, 0); T (sa[1].a7, 1); T (sa[2].a7, 2); T (sa[3].a7, 3); | |
176 T (sa[0].a8, 0); T (sa[1].a8, 1); T (sa[2].a8, 2); T (sa[3].a8, 3); | |
177 T (sa[0].a9, 0); T (sa[1].a9, 1); T (sa[2].a9, 2); T (sa[3].a9, 3); | |
178 | |
179 T (sa[4].a1, 0); T (sa[5].a1, 0); T (sa[6].a1, 0); T (sa[7].a1, 0); | |
180 T (sa[4].a2, 1); T (sa[5].a2, 1); T (sa[6].a2, 1); T (sa[7].a2, 1); | |
181 T (sa[4].a3, 2); T (sa[5].a3, 2); T (sa[6].a3, 2); T (sa[7].a3, 2); | |
182 T (sa[4].a4, 3); T (sa[5].a4, 3); T (sa[6].a4, 3); T (sa[7].a4, 3); | |
183 T (sa[4].a5, 4); T (sa[5].a5, 4); T (sa[6].a5, 4); T (sa[7].a5, 4); | |
184 T (sa[4].a6, 4); T (sa[5].a6, 5); T (sa[6].a6, 5); T (sa[7].a6, 5); | |
185 T (sa[4].a7, 4); T (sa[5].a7, 5); T (sa[6].a7, 6); T (sa[7].a7, 6); | |
186 T (sa[4].a8, 4); T (sa[5].a8, 5); T (sa[6].a8, 6); T (sa[7].a8, 7); | |
187 T (sa[4].a9, 4); T (sa[5].a9, 5); T (sa[6].a9, 6); T (sa[7].a9, 7); | |
188 | |
189 T (sa[8].a1, 0); | |
190 T (sa[8].a2, 1); T (sa[8].a2 + 1, 0); | |
191 T (sa[8].a3, 2); T (sa[8].a3 + 1, 1); T (sa[8].a3 + 2, 0); | |
192 T (sa[8].a4, 3); T (sa[8].a4 + 1, 2); T (sa[8].a4 + 2, 1); | |
193 T (sa[8].a5, 4); T (sa[8].a5 + 1, 3); T (sa[8].a5 + 2, 2); | |
194 T (sa[8].a6, 5); T (sa[8].a6 + 1, 4); T (sa[8].a6 + 2, 3); | |
195 T (sa[8].a7, 6); T (sa[8].a7 + 1, 5); T (sa[8].a7 + 2, 4); | |
196 T (sa[8].a8, 7); T (sa[8].a8 + 1, 6); T (sa[8].a8 + 2, 5); | |
197 T (sa[8].a9, 8); T (sa[8].a9 + 1, 7); T (sa[8].a9 + 2, 6); | |
198 | |
199 | |
200 T (sa3_5_7[1][2][3].a2, 1); | |
201 T (sa3_5_7[1][3][5].a3, 2); | |
202 T (sa3_5_7[2][4][5].a4, 3); | |
203 | |
204 T (sa3_5_7[0][0][0].a1, 0); | |
205 T (sa3_5_7[0][0][0].a2, 0); | |
206 T (sa3_5_7[0][0][0].a3, 0); | |
207 T (sa3_5_7[0][0][0].a4, 0); | |
208 T (sa3_5_7[0][0][0].a5, 0); | |
209 T (sa3_5_7[0][0][0].a6, 0); | |
210 T (sa3_5_7[0][0][0].a7, 0); | |
211 T (sa3_5_7[0][0][0].a8, 0); | |
212 T (sa3_5_7[0][0][0].a9, 0); | |
213 | |
214 T (sa3_5_7[0][0][1].a1, 0); | |
215 T (sa3_5_7[0][0][1].a2, 0); | |
216 T (sa3_5_7[0][0][1].a3, 0); | |
217 T (sa3_5_7[0][0][1].a4, 0); | |
218 T (sa3_5_7[0][0][1].a5, 0); | |
219 T (sa3_5_7[0][0][1].a6, 0); | |
220 T (sa3_5_7[0][0][1].a7, 0); | |
221 T (sa3_5_7[0][0][1].a8, 0); | |
222 T (sa3_5_7[0][0][1].a9, 0); | |
223 | |
224 T (sa3_5_7[0][1][0].a1, 0); | |
225 T (sa3_5_7[0][1][0].a2, 0); | |
226 T (sa3_5_7[0][1][0].a3, 0); | |
227 T (sa3_5_7[0][1][0].a4, 0); | |
228 T (sa3_5_7[0][1][0].a5, 0); | |
229 T (sa3_5_7[0][1][0].a6, 0); | |
230 T (sa3_5_7[0][1][0].a7, 0); | |
231 T (sa3_5_7[0][1][0].a8, 0); | |
232 T (sa3_5_7[0][1][0].a9, 0); | |
233 | |
234 T (sa3_5_7[1][0][0].a1, 0); | |
235 T (sa3_5_7[1][0][0].a2, 0); | |
236 T (sa3_5_7[1][0][0].a3, 0); | |
237 T (sa3_5_7[1][0][0].a4, 0); | |
238 T (sa3_5_7[1][0][0].a5, 0); | |
239 T (sa3_5_7[1][0][0].a6, 0); | |
240 T (sa3_5_7[1][0][0].a7, 0); | |
241 T (sa3_5_7[1][0][0].a8, 0); | |
242 T (sa3_5_7[1][0][0].a9, 0); | |
243 } | |
244 | |
245 | |
246 struct SS { | |
247 char a9[9][9]; | |
248 struct S sa9[9]; | |
249 }; | |
250 | |
251 const struct SS ssa[] = { | |
252 [1] = { | |
253 .a9 = { [3] = S3, [7] = S7 }, | |
254 .sa9 = { [5] = { .a5 = S4, .a7 = S6 } } | |
255 }, | |
256 [5] = { | |
257 .a9 = { [1] = S8, [5] = S4 }, | |
258 .sa9 = { [3] = { .a3 = S2, .a6 = S3 } } | |
259 } | |
260 }; | |
261 | |
262 void test_global_struct_struct_array (void) | |
263 { | |
264 T (ssa[0].a9[0], 0); | |
265 T (ssa[0].a9[3], 0); | |
266 T (ssa[0].sa9[5].a5, 0); | |
267 T (ssa[0].sa9[5].a7, 0); | |
268 | |
269 T (ssa[1].a9[0], 0); | |
270 | |
271 T (ssa[1].a9[3], 3); | |
272 T (ssa[1].a9[7], 7); | |
273 T (ssa[1].sa9[5].a5, 4); | |
274 T (ssa[1].sa9[5].a7, 6); | |
275 | |
276 T (ssa[2].a9[3], 0); | |
277 T (ssa[2].a9[7], 0); | |
278 T (ssa[2].sa9[5].a5, 0); | |
279 T (ssa[2].sa9[5].a7, 0); | |
280 | |
281 T (ssa[5].a9[1], 8); | |
282 T (ssa[5].a9[5], 4); | |
283 T (ssa[5].sa9[3].a3, 2); | |
284 T (ssa[5].sa9[3].a6, 3); | |
285 } | |
286 | |
287 /* { dg-final { scan-tree-dump-times "strlen" 0 "gimple" } } | |
288 { dg-final { scan-tree-dump-times "call_in_true_branch_not_eliminated" 0 "ccp1" } } */ |