1 /* PR tree-optimization/77357 - strlen of constant strings not folded
3 { dg-options "-O2 -Wall -fdump-tree-gimple -fdump-tree-ccp" } */
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__)
11 #define FAIL(name) do { \
12 extern void FAILNAME (name) (void); \
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. */
22 if (!(expr)) FAIL (in_true_branch_not_eliminated); else (void)0
24 #define T(s, n) ELIM (strlen (s) == n)
29 char a1
[1], a2
[2], a3
[3], a4
[4], a5
[5], a6
[6], a7
[7], a8
[8], a9
[9];
42 const char a9
[][9] = { S0
, S1
, S2
, S3
, S4
, S5
, S6
, S7
, S8
};
44 const char a_1_9
[1][9] = { S8
};
45 const char a_2_9
[2][9] = { S8
, S7
};
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
}
59 const struct S s
= { S0
, S1
, S2
, S3
, S4
, S5
, S6
, S7
, S8
};
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
}
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
78 void test_global_array (void)
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);
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);
111 void test_global_array_array (void)
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);
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);
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);
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);
154 void test_global_struct (void)
167 void test_global_struct_array (void)
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);
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);
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);
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);
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);
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);
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);
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);
251 const struct SS ssa
[] = {
253 .a9
= { [3] = S3
, [7] = S7
},
254 .sa9
= { [5] = { .a5
= S4
, .a7
= S6
} }
257 .a9
= { [1] = S8
, [5] = S4
},
258 .sa9
= { [3] = { .a3
= S2
, .a6
= S3
} }
262 void test_global_struct_struct_array (void)
266 T (ssa
[0].sa9
[5].a5
, 0);
267 T (ssa
[0].sa9
[5].a7
, 0);
273 T (ssa
[1].sa9
[5].a5
, 4);
274 T (ssa
[1].sa9
[5].a7
, 6);
278 T (ssa
[2].sa9
[5].a5
, 0);
279 T (ssa
[2].sa9
[5].a7
, 0);
283 T (ssa
[5].sa9
[3].a3
, 2);
284 T (ssa
[5].sa9
[3].a6
, 3);
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" } } */