1 /* Copyright (C) 2002 Free Software Foundation.
2
3 Test that (A & C1) op C2 optimizations behave correctly where C1 is
4 a constant power of 2, op is == or !=, and C2 is C1 or zero.
5
6 Written by Roger Sayle, 5th May 2002. */
7
8 #include <limits.h>
9
10 extern void abort (void);
11
12 void test1 (signed char c, int set);
13 void test2 (unsigned char c, int set);
14 void test3 (short s, int set);
15 void test4 (unsigned short s, int set);
16 void test5 (int i, int set);
17 void test6 (unsigned int i, int set);
18 void test7 (long long l, int set);
19 void test8 (unsigned long long l, int set);
20
21 #ifndef LONG_LONG_MAX
22 #define LONG_LONG_MAX __LONG_LONG_MAX__
23 #endif
24 #ifndef LONG_LONG_MIN
25 #define LONG_LONG_MIN (-LONG_LONG_MAX-1)
26 #endif
27 #ifndef ULONG_LONG_MAX
28 #define ULONG_LONG_MAX (LONG_LONG_MAX * 2ULL + 1)
29 #endif
30
31
32 void
test1(signed char c,int set)33 test1 (signed char c, int set)
34 {
35 if ((c & (SCHAR_MAX+1)) == 0)
36 {
37 if (set) abort ();
38 }
39 else
40 if (!set) abort ();
41
42 if ((c & (SCHAR_MAX+1)) != 0)
43 {
44 if (!set) abort ();
45 }
46 else
47 if (set) abort ();
48
49 if ((c & (SCHAR_MAX+1)) == (SCHAR_MAX+1))
50 {
51 if (!set) abort ();
52 }
53 else
54 if (set) abort ();
55
56 if ((c & (SCHAR_MAX+1)) != (SCHAR_MAX+1))
57 {
58 if (set) abort ();
59 }
60 else
61 if (!set) abort ();
62 }
63
64 void
test2(unsigned char c,int set)65 test2 (unsigned char c, int set)
66 {
67 if ((c & (SCHAR_MAX+1)) == 0)
68 {
69 if (set) abort ();
70 }
71 else
72 if (!set) abort ();
73
74 if ((c & (SCHAR_MAX+1)) != 0)
75 {
76 if (!set) abort ();
77 }
78 else
79 if (set) abort ();
80
81 if ((c & (SCHAR_MAX+1)) == (SCHAR_MAX+1))
82 {
83 if (!set) abort ();
84 }
85 else
86 if (set) abort ();
87
88 if ((c & (SCHAR_MAX+1)) != (SCHAR_MAX+1))
89 {
90 if (set) abort ();
91 }
92 else
93 if (!set) abort ();
94 }
95
96 void
test3(short s,int set)97 test3 (short s, int set)
98 {
99 if ((s & (SHRT_MAX+1)) == 0)
100 {
101 if (set) abort ();
102 }
103 else
104 if (!set) abort ();
105
106 if ((s & (SHRT_MAX+1)) != 0)
107 {
108 if (!set) abort ();
109 }
110 else
111 if (set) abort ();
112
113 if ((s & (SHRT_MAX+1)) == (SHRT_MAX+1))
114 {
115 if (!set) abort ();
116 }
117 else
118 if (set) abort ();
119
120 if ((s & (SHRT_MAX+1)) != (SHRT_MAX+1))
121 {
122 if (set) abort ();
123 }
124 else
125 if (!set) abort ();
126 }
127
128 void
test4(unsigned short s,int set)129 test4 (unsigned short s, int set)
130 {
131 if ((s & (SHRT_MAX+1)) == 0)
132 {
133 if (set) abort ();
134 }
135 else
136 if (!set) abort ();
137
138 if ((s & (SHRT_MAX+1)) != 0)
139 {
140 if (!set) abort ();
141 }
142 else
143 if (set) abort ();
144
145 if ((s & (SHRT_MAX+1)) == (SHRT_MAX+1))
146 {
147 if (!set) abort ();
148 }
149 else
150 if (set) abort ();
151
152 if ((s & (SHRT_MAX+1)) != (SHRT_MAX+1))
153 {
154 if (set) abort ();
155 }
156 else
157 if (!set) abort ();
158 }
159
160 void
test5(int i,int set)161 test5 (int i, int set)
162 {
163 if ((i & (INT_MAX+1U)) == 0)
164 {
165 if (set) abort ();
166 }
167 else
168 if (!set) abort ();
169
170 if ((i & (INT_MAX+1U)) != 0)
171 {
172 if (!set) abort ();
173 }
174 else
175 if (set) abort ();
176
177 if ((i & (INT_MAX+1U)) == (INT_MAX+1U))
178 {
179 if (!set) abort ();
180 }
181 else
182 if (set) abort ();
183
184 if ((i & (INT_MAX+1U)) != (INT_MAX+1U))
185 {
186 if (set) abort ();
187 }
188 else
189 if (!set) abort ();
190 }
191
192 void
test6(unsigned int i,int set)193 test6 (unsigned int i, int set)
194 {
195 if ((i & (INT_MAX+1U)) == 0)
196 {
197 if (set) abort ();
198 }
199 else
200 if (!set) abort ();
201
202 if ((i & (INT_MAX+1U)) != 0)
203 {
204 if (!set) abort ();
205 }
206 else
207 if (set) abort ();
208
209 if ((i & (INT_MAX+1U)) == (INT_MAX+1U))
210 {
211 if (!set) abort ();
212 }
213 else
214 if (set) abort ();
215
216 if ((i & (INT_MAX+1U)) != (INT_MAX+1U))
217 {
218 if (set) abort ();
219 }
220 else
221 if (!set) abort ();
222 }
223
224 void
test7(long long l,int set)225 test7 (long long l, int set)
226 {
227 if ((l & (LONG_LONG_MAX+1ULL)) == 0)
228 {
229 if (set) abort ();
230 }
231 else
232 if (!set) abort ();
233
234 if ((l & (LONG_LONG_MAX+1ULL)) != 0)
235 {
236 if (!set) abort ();
237 }
238 else
239 if (set) abort ();
240
241 if ((l & (LONG_LONG_MAX+1ULL)) == (LONG_LONG_MAX+1ULL))
242 {
243 if (!set) abort ();
244 }
245 else
246 if (set) abort ();
247
248 if ((l & (LONG_LONG_MAX+1ULL)) != (LONG_LONG_MAX+1ULL))
249 {
250 if (set) abort ();
251 }
252 else
253 if (!set) abort ();
254 }
255
256 void
test8(unsigned long long l,int set)257 test8 (unsigned long long l, int set)
258 {
259 if ((l & (LONG_LONG_MAX+1ULL)) == 0)
260 {
261 if (set) abort ();
262 }
263 else
264 if (!set) abort ();
265
266 if ((l & (LONG_LONG_MAX+1ULL)) != 0)
267 {
268 if (!set) abort ();
269 }
270 else
271 if (set) abort ();
272
273 if ((l & (LONG_LONG_MAX+1ULL)) == (LONG_LONG_MAX+1ULL))
274 {
275 if (!set) abort ();
276 }
277 else
278 if (set) abort ();
279
280 if ((l & (LONG_LONG_MAX+1ULL)) != (LONG_LONG_MAX+1ULL))
281 {
282 if (set) abort ();
283 }
284 else
285 if (!set) abort ();
286 }
287
288 int
main()289 main ()
290 {
291 test1 (0, 0);
292 test1 (SCHAR_MAX, 0);
293 test1 (SCHAR_MIN, 1);
294 test1 (UCHAR_MAX, 1);
295
296 test2 (0, 0);
297 test2 (SCHAR_MAX, 0);
298 test2 (SCHAR_MIN, 1);
299 test2 (UCHAR_MAX, 1);
300
301 test3 (0, 0);
302 test3 (SHRT_MAX, 0);
303 test3 (SHRT_MIN, 1);
304 test3 (USHRT_MAX, 1);
305
306 test4 (0, 0);
307 test4 (SHRT_MAX, 0);
308 test4 (SHRT_MIN, 1);
309 test4 (USHRT_MAX, 1);
310
311 test5 (0, 0);
312 test5 (INT_MAX, 0);
313 test5 (INT_MIN, 1);
314 test5 (UINT_MAX, 1);
315
316 test6 (0, 0);
317 test6 (INT_MAX, 0);
318 test6 (INT_MIN, 1);
319 test6 (UINT_MAX, 1);
320
321 test7 (0, 0);
322 test7 (LONG_LONG_MAX, 0);
323 test7 (LONG_LONG_MIN, 1);
324 test7 (ULONG_LONG_MAX, 1);
325
326 test8 (0, 0);
327 test8 (LONG_LONG_MAX, 0);
328 test8 (LONG_LONG_MIN, 1);
329 test8 (ULONG_LONG_MAX, 1);
330
331 return 0;
332 }
333
334