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 
test_array_ref_2_3(void)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 
test_array_off_2_3(void)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 
test_array_ref_2_2_5(void)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 
test_array_off_2_2_5(void)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 
main()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 }
211