131
|
1 /* PR tree-optimization/86532 - Wrong code due to a wrong strlen folding */
|
|
2
|
|
3 extern __SIZE_TYPE__ strlen (const char*);
|
|
4
|
|
5 static const char a[2][3] = { "1", "12" };
|
|
6 static const char b[2][2][5] = { { "1", "12" }, { "123", "1234" } };
|
|
7
|
|
8 volatile int v0 = 0;
|
|
9 volatile int v1 = 1;
|
|
10 volatile int v2 = 2;
|
|
11
|
|
12 #define A(expr) \
|
|
13 ((expr) ? (void)0 : (__builtin_printf ("assertion on line %i: %s\n", \
|
|
14 __LINE__, #expr), \
|
|
15 __builtin_abort ()))
|
|
16
|
|
17 void test_array_ref_2_3 (void)
|
|
18 {
|
|
19 A (strlen (a[v0]) == 1);
|
|
20 A (strlen (&a[v0][v0]) == 1);
|
|
21 A (strlen (&a[0][v0]) == 1);
|
|
22 A (strlen (&a[v0][0]) == 1);
|
|
23
|
|
24 A (strlen (a[v1]) == 2);
|
|
25 A (strlen (&a[v1][0]) == 2);
|
|
26 A (strlen (&a[1][v0]) == 2);
|
|
27 A (strlen (&a[v1][v0]) == 2);
|
|
28
|
|
29 A (strlen (&a[v1][1]) == 1);
|
|
30 A (strlen (&a[v1][1]) == 1);
|
|
31
|
|
32 A (strlen (&a[v1][2]) == 0);
|
|
33 A (strlen (&a[v1][v2]) == 0);
|
|
34
|
|
35 int i0 = 0;
|
|
36 int i1 = i0 + 1;
|
|
37 int i2 = i1 + 1;
|
|
38
|
|
39 A (strlen (a[v0]) == 1);
|
|
40 A (strlen (&a[v0][v0]) == 1);
|
|
41 A (strlen (&a[i0][v0]) == 1);
|
|
42 A (strlen (&a[v0][i0]) == 1);
|
|
43
|
|
44 A (strlen (a[v1]) == 2);
|
|
45 A (strlen (&a[v1][i0]) == 2);
|
|
46 A (strlen (&a[i1][v0]) == 2);
|
|
47 A (strlen (&a[v1][v0]) == 2);
|
|
48
|
|
49 A (strlen (&a[v1][i1]) == 1);
|
|
50 A (strlen (&a[v1][i1]) == 1);
|
|
51
|
|
52 A (strlen (&a[v1][i2]) == 0);
|
|
53 A (strlen (&a[v1][v2]) == 0);
|
|
54 }
|
|
55
|
|
56 void test_array_off_2_3 (void)
|
|
57 {
|
|
58 A (strlen (a[0] + 0) == 1);
|
|
59 A (strlen (a[0] + v0) == 1);
|
|
60 A (strlen (a[v0] + 0) == 1);
|
|
61 A (strlen (a[v0] + v0) == 1);
|
|
62
|
|
63 A (strlen (a[v1] + 0) == 2);
|
|
64 A (strlen (a[1] + v0) == 2);
|
|
65 A (strlen (a[v1] + 0) == 2);
|
|
66 A (strlen (a[v1] + v0) == 2);
|
|
67
|
|
68 A (strlen (a[v1] + 1) == 1);
|
|
69 A (strlen (a[v1] + v1) == 1);
|
|
70
|
|
71 A (strlen (a[v1] + 2) == 0);
|
|
72 A (strlen (a[v1] + v2) == 0);
|
|
73
|
|
74 int i0 = 0;
|
|
75 int i1 = i0 + 1;
|
|
76 int i2 = i1 + 1;
|
|
77
|
|
78 A (strlen (a[i0] + i0) == 1);
|
|
79 A (strlen (a[i0] + v0) == 1);
|
|
80 A (strlen (a[v0] + i0) == 1);
|
|
81 A (strlen (a[v0] + v0) == 1);
|
|
82
|
|
83 A (strlen (a[v1] + i0) == 2);
|
|
84 A (strlen (a[i1] + v0) == 2);
|
|
85 A (strlen (a[v1] + i0) == 2);
|
|
86 A (strlen (a[v1] + v0) == 2);
|
|
87
|
|
88 A (strlen (a[v1] + i1) == 1);
|
|
89 A (strlen (a[v1] + v1) == 1);
|
|
90
|
|
91 A (strlen (a[v1] + i2) == 0);
|
|
92 A (strlen (a[v1] + v2) == 0);
|
|
93 }
|
|
94
|
|
95 void test_array_ref_2_2_5 (void)
|
|
96 {
|
|
97 A (strlen (b[0][v0]) == 1);
|
|
98 A (strlen (b[v0][0]) == 1);
|
|
99
|
|
100 A (strlen (&b[0][0][v0]) == 1);
|
|
101 A (strlen (&b[0][v0][0]) == 1);
|
|
102 A (strlen (&b[v0][0][0]) == 1);
|
|
103
|
|
104 A (strlen (&b[0][v0][v0]) == 1);
|
|
105 A (strlen (&b[v0][0][v0]) == 1);
|
|
106 A (strlen (&b[v0][v0][0]) == 1);
|
|
107
|
|
108 A (strlen (b[0][v1]) == 2);
|
|
109 A (strlen (b[v1][0]) == 3);
|
|
110
|
|
111 A (strlen (&b[0][0][v1]) == 0);
|
|
112 A (strlen (&b[0][v1][0]) == 2);
|
|
113 A (strlen (&b[v0][0][0]) == 1);
|
|
114
|
|
115 A (strlen (&b[0][v0][v0]) == 1);
|
|
116 A (strlen (&b[v0][0][v0]) == 1);
|
|
117 A (strlen (&b[v0][v0][0]) == 1);
|
|
118
|
|
119 A (strlen (&b[0][v1][v1]) == 1);
|
|
120 A (strlen (&b[v1][0][v1]) == 2);
|
|
121 A (strlen (&b[v1][v1][0]) == 4);
|
|
122 A (strlen (&b[v1][v1][1]) == 3);
|
|
123 A (strlen (&b[v1][v1][2]) == 2);
|
|
124
|
|
125 int i0 = 0;
|
|
126 int i1 = i0 + 1;
|
|
127 int i2 = i1 + 1;
|
|
128
|
|
129 A (strlen (b[i0][v0]) == 1);
|
|
130 A (strlen (b[v0][i0]) == 1);
|
|
131
|
|
132 A (strlen (&b[i0][i0][v0]) == 1);
|
|
133 A (strlen (&b[i0][v0][i0]) == 1);
|
|
134 A (strlen (&b[v0][i0][i0]) == 1);
|
|
135
|
|
136 A (strlen (&b[i0][v0][v0]) == 1);
|
|
137 A (strlen (&b[v0][i0][v0]) == 1);
|
|
138 A (strlen (&b[v0][v0][i0]) == 1);
|
|
139
|
|
140 A (strlen (b[i0][v1]) == 2);
|
|
141 A (strlen (b[v1][i0]) == 3);
|
|
142
|
|
143 A (strlen (&b[i0][i0][v1]) == 0);
|
|
144 A (strlen (&b[i0][v1][i0]) == 2);
|
|
145 A (strlen (&b[v0][i0][i0]) == 1);
|
|
146
|
|
147 A (strlen (&b[i0][v0][v0]) == 1);
|
|
148 A (strlen (&b[v0][i0][v0]) == 1);
|
|
149 A (strlen (&b[v0][v0][i0]) == 1);
|
|
150
|
|
151 A (strlen (&b[i0][v1][v1]) == 1);
|
|
152 A (strlen (&b[v1][i0][v1]) == 2);
|
|
153 A (strlen (&b[v1][v1][i0]) == 4);
|
|
154 A (strlen (&b[v1][v1][i1]) == 3);
|
|
155 A (strlen (&b[v1][v1][i2]) == 2);
|
|
156 }
|
|
157
|
|
158 void test_array_off_2_2_5 (void)
|
|
159 {
|
|
160 A (strlen (b[0][0] + v0) == 1);
|
|
161 A (strlen (b[0][v0] + v0) == 1);
|
|
162 A (strlen (b[v0][0] + v0) == 1);
|
|
163 A (strlen (b[v0][v0] + v0) == 1);
|
|
164
|
|
165 A (strlen (b[0][0] + v1) == 0);
|
|
166 A (strlen (b[0][v1] + 0) == 2);
|
|
167 A (strlen (b[v0][0] + 0) == 1);
|
|
168
|
|
169 A (strlen (b[0][v0] + v0) == 1);
|
|
170 A (strlen (b[v0][0] + v0) == 1);
|
|
171 A (strlen (b[v0][v0] + 0) == 1);
|
|
172
|
|
173 A (strlen (b[0][v1] + v1) == 1);
|
|
174 A (strlen (b[v1][0] + v1) == 2);
|
|
175 A (strlen (b[v1][v1] + 0) == 4);
|
|
176 A (strlen (b[v1][v1] + 1) == 3);
|
|
177 A (strlen (b[v1][v1] + 2) == 2);
|
|
178
|
|
179 int i0 = 0;
|
|
180 int i1 = i0 + 1;
|
|
181 int i2 = i1 + 1;
|
|
182
|
|
183 A (strlen (b[i0][i0] + v0) == 1);
|
|
184 A (strlen (b[i0][v0] + v0) == 1);
|
|
185 A (strlen (b[v0][i0] + v0) == 1);
|
|
186 A (strlen (b[v0][v0] + v0) == 1);
|
|
187
|
|
188 A (strlen (b[i0][i0] + v1) == 0);
|
|
189 A (strlen (b[i0][v1] + i0) == 2);
|
|
190 A (strlen (b[v0][i0] + i0) == 1);
|
|
191
|
|
192 A (strlen (b[i0][v0] + v0) == 1);
|
|
193 A (strlen (b[v0][i0] + v0) == 1);
|
|
194 A (strlen (b[v0][v0] + i0) == 1);
|
|
195
|
|
196 A (strlen (b[i0][v1] + v1) == 1);
|
|
197 A (strlen (b[v1][i0] + v1) == 2);
|
|
198 A (strlen (b[v1][v1] + i0) == 4);
|
|
199 A (strlen (b[v1][v1] + i1) == 3);
|
|
200 A (strlen (b[v1][v1] + i2) == 2);
|
|
201 }
|
|
202
|
|
203 int main ()
|
|
204 {
|
|
205 test_array_ref_2_3 ();
|
|
206 test_array_off_2_3 ();
|
|
207
|
|
208 test_array_ref_2_2_5 ();
|
|
209 test_array_off_2_2_5 ();
|
|
210 }
|