1 /* Check rotate pattern detection. */
2 /* { dg-do compile } */
3 /* { dg-options "-O2 -fno-ipa-icf -fdump-tree-optimized" } */
4 /* Rotates should be recognized only in functions with | instead of + or ^,
5 or in functions that have constant shift counts (unused attribute on y). */
6 /* { dg-final { scan-tree-dump-times "r\[<>]\[<>]" 48 "optimized" } } */
7
8 unsigned int
9 f1 (unsigned int x, unsigned int y)
10 {
11 return (x << y) | (x >> ((-y) & (__CHAR_BIT__ * __SIZEOF_INT__ - 1)));
12 }
13
14 unsigned int
15 f2 (unsigned int x, unsigned long int y)
16 {
17 return (x << y) | (x >> ((-y) & (__CHAR_BIT__ * __SIZEOF_INT__ - 1)));
18 }
19
20 unsigned int
21 f3 (unsigned int x, int y __attribute__((unused)))
22 {
23 return (x << 1) | (x >> ((-1) & (__CHAR_BIT__ * __SIZEOF_INT__ - 1)));
24 }
25
26 unsigned int
27 f4 (unsigned int x, int y __attribute__((unused)))
28 {
29 return (x << ((-1) & (__CHAR_BIT__ * __SIZEOF_INT__ - 1))) | (x >> 1);
30 }
31
32 unsigned short int
33 f5 (unsigned short int x, unsigned int y)
34 {
35 if (y >= __CHAR_BIT__ * __SIZEOF_SHORT__)
36 __builtin_unreachable ();
37 return (x << y) | (x >> ((-y) & (__CHAR_BIT__ * __SIZEOF_SHORT__ - 1)));
38 }
39
40 unsigned short int
41 f6 (unsigned short int x, unsigned long int y)
42 {
43 if (y >= __CHAR_BIT__ * __SIZEOF_SHORT__)
44 __builtin_unreachable ();
45 return (x << y) | (x >> ((-y) & (__CHAR_BIT__ * __SIZEOF_SHORT__ - 1)));
46 }
47
48 unsigned char
49 f7 (unsigned char x, unsigned int y)
50 {
51 if (y >= __CHAR_BIT__)
52 __builtin_unreachable ();
53 return (x << y) | (x >> ((-y) & (__CHAR_BIT__ - 1)));
54 }
55
56 unsigned char
57 f8 (unsigned char x, unsigned long int y)
58 {
59 if (y >= __CHAR_BIT__)
60 __builtin_unreachable ();
61 return (x << y) | (x >> ((-y) & (__CHAR_BIT__ - 1)));
62 }
63
64 unsigned int
65 f9 (unsigned int x, unsigned int y)
66 {
67 return (x << y) | (x >> ((-y) & (__CHAR_BIT__ * sizeof (unsigned int) - 1)));
68 }
69
70 unsigned int
71 f10 (unsigned int x, unsigned long int y)
72 {
73 return (x << y) | (x >> ((-y) & (__CHAR_BIT__ * sizeof (unsigned int) - 1)));
74 }
75
76 unsigned int
77 f11 (unsigned int x, int y __attribute__((unused)))
78 {
79 return (x << 1) | (x >> ((-1) & (__CHAR_BIT__ * sizeof (unsigned int) - 1)));
80 }
81
82 unsigned int
83 f12 (unsigned int x, int y __attribute__((unused)))
84 {
85 return (x << ((-1) & (__CHAR_BIT__ * sizeof (unsigned int) - 1))) | (x >> 1);
86 }
87
88 unsigned short int
89 f13 (unsigned short int x, unsigned int y)
90 {
91 if (y >= __CHAR_BIT__ * __SIZEOF_SHORT__)
92 __builtin_unreachable ();
93 return (x << y) | (x >> ((-y) & (__CHAR_BIT__ * sizeof (unsigned short) - 1)));
94 }
95
96 unsigned short int
97 f14 (unsigned short int x, unsigned long int y)
98 {
99 if (y >= __CHAR_BIT__ * __SIZEOF_SHORT__)
100 __builtin_unreachable ();
101 return (x << y) | (x >> ((-y) & (__CHAR_BIT__ * sizeof (unsigned short) - 1)));
102 }
103
104 unsigned char
105 f15 (unsigned char x, unsigned int y)
106 {
107 if (y >= __CHAR_BIT__)
108 __builtin_unreachable ();
109 return (x << y) | (x >> ((-y) & (__CHAR_BIT__ * sizeof (unsigned char) - 1)));
110 }
111
112 unsigned char
113 f16 (unsigned char x, unsigned long int y)
114 {
115 if (y >= __CHAR_BIT__)
116 __builtin_unreachable ();
117 return (x << y) | (x >> ((-y) & (__CHAR_BIT__ * sizeof (unsigned char) - 1)));
118 }
119
120 unsigned int
121 f17 (unsigned int x, unsigned int y)
122 {
123 return (x >> ((-y) & (__CHAR_BIT__ * __SIZEOF_INT__ - 1))) ^ (x << y);
124 }
125
126 unsigned int
127 f18 (unsigned int x, unsigned long int y)
128 {
129 return (x >> ((-y) & (__CHAR_BIT__ * __SIZEOF_INT__ - 1))) ^ (x << y);
130 }
131
132 unsigned int
133 f19 (unsigned int x, int y __attribute__((unused)))
134 {
135 return (x >> ((-1) & (__CHAR_BIT__ * __SIZEOF_INT__ - 1))) ^ (x << 1);
136 }
137
138 unsigned int
139 f20 (unsigned int x, int y __attribute__((unused)))
140 {
141 return (x >> 1) ^ (x << ((-1) & (__CHAR_BIT__ * __SIZEOF_INT__ - 1)));
142 }
143
144 unsigned short int
145 f21 (unsigned short int x, unsigned int y)
146 {
147 return (x >> ((-y) & (__CHAR_BIT__ * __SIZEOF_SHORT__ - 1))) ^ (x << y);
148 }
149
150 unsigned short int
151 f22 (unsigned short int x, unsigned long int y)
152 {
153 return (x >> ((-y) & (__CHAR_BIT__ * __SIZEOF_SHORT__ - 1))) ^ (x << y);
154 }
155
156 unsigned char
157 f23 (unsigned char x, unsigned int y)
158 {
159 return (x >> ((-y) & (__CHAR_BIT__ - 1))) ^ (x << y);
160 }
161
162 unsigned char
163 f24 (unsigned char x, unsigned long int y)
164 {
165 return (x >> ((-y) & (__CHAR_BIT__ - 1))) ^ (x << y);
166 }
167
168 unsigned int
169 f25 (unsigned int x, unsigned int y)
170 {
171 return (x >> ((-y) & (__CHAR_BIT__ * sizeof (unsigned int) - 1))) ^ (x << y);
172 }
173
174 unsigned int
175 f26 (unsigned int x, unsigned long int y)
176 {
177 return (x >> ((-y) & (__CHAR_BIT__ * sizeof (unsigned int) - 1))) ^ (x << y);
178 }
179
180 unsigned int
181 f27 (unsigned int x, int y __attribute__((unused)))
182 {
183 return (x >> ((-1) & (__CHAR_BIT__ * sizeof (unsigned int) - 1))) ^ (x << 1);
184 }
185
186 unsigned int
187 f28 (unsigned int x, int y __attribute__((unused)))
188 {
189 return (x >> 1) ^ (x << ((-1) & (__CHAR_BIT__ * sizeof (unsigned int) - 1)));
190 }
191
192 unsigned short int
193 f29 (unsigned short int x, unsigned int y)
194 {
195 return (x >> ((-y) & (__CHAR_BIT__ * sizeof (unsigned short) - 1))) ^ (x << y);
196 }
197
198 unsigned short int
199 f30 (unsigned short int x, unsigned long int y)
200 {
201 return (x >> ((-y) & (__CHAR_BIT__ * sizeof (unsigned short) - 1))) ^ (x << y);
202 }
203
204 unsigned char
205 f31 (unsigned char x, unsigned int y)
206 {
207 return (x >> ((-y) & (__CHAR_BIT__ * sizeof (unsigned char) - 1))) ^ (x << y);
208 }
209
210 unsigned char
211 f32 (unsigned char x, unsigned long int y)
212 {
213 return (x >> ((-y) & (__CHAR_BIT__ * sizeof (unsigned char) - 1))) ^ (x << y);
214 }
215
216 unsigned int
217 f33 (unsigned int x, unsigned int y)
218 {
219 return (x >> y) | (x << ((-y) & (__CHAR_BIT__ * __SIZEOF_INT__ - 1)));
220 }
221
222 unsigned int
223 f34 (unsigned int x, unsigned long int y)
224 {
225 return (x >> y) | (x << ((-y) & (__CHAR_BIT__ * __SIZEOF_INT__ - 1)));
226 }
227
228 unsigned int
229 f35 (unsigned int x, int y __attribute__((unused)))
230 {
231 return (x >> 1) | (x << ((-1) & (__CHAR_BIT__ * __SIZEOF_INT__ - 1)));
232 }
233
234 unsigned int
235 f36 (unsigned int x, int y __attribute__((unused)))
236 {
237 return (x >> ((-1) & (__CHAR_BIT__ * __SIZEOF_INT__ - 1))) | (x << 1);
238 }
239
240 unsigned short int
241 f37 (unsigned short int x, unsigned int y)
242 {
243 if (y >= __CHAR_BIT__ * __SIZEOF_SHORT__)
244 __builtin_unreachable ();
245 return (x >> y) | (x << ((-y) & (__CHAR_BIT__ * __SIZEOF_SHORT__ - 1)));
246 }
247
248 unsigned short int
249 f38 (unsigned short int x, unsigned long int y)
250 {
251 if (y >= __CHAR_BIT__ * __SIZEOF_SHORT__)
252 __builtin_unreachable ();
253 return (x >> y) | (x << ((-y) & (__CHAR_BIT__ * __SIZEOF_SHORT__ - 1)));
254 }
255
256 unsigned char
257 f39 (unsigned char x, unsigned int y)
258 {
259 if (y >= __CHAR_BIT__)
260 __builtin_unreachable ();
261 return (x >> y) | (x << ((-y) & (__CHAR_BIT__ - 1)));
262 }
263
264 unsigned char
265 f40 (unsigned char x, unsigned long int y)
266 {
267 if (y >= __CHAR_BIT__)
268 __builtin_unreachable ();
269 return (x >> y) | (x << ((-y) & (__CHAR_BIT__ - 1)));
270 }
271
272 unsigned int
273 f41 (unsigned int x, unsigned int y)
274 {
275 return (x >> y) | (x << ((-y) & (__CHAR_BIT__ * sizeof (unsigned int) - 1)));
276 }
277
278 unsigned int
279 f42 (unsigned int x, unsigned long int y)
280 {
281 return (x >> y) | (x << ((-y) & (__CHAR_BIT__ * sizeof (unsigned int) - 1)));
282 }
283
284 unsigned int
285 f43 (unsigned int x, int y __attribute__((unused)))
286 {
287 return (x >> 1) | (x << ((-1) & (__CHAR_BIT__ * sizeof (unsigned int) - 1)));
288 }
289
290 unsigned int
291 f44 (unsigned int x, int y __attribute__((unused)))
292 {
293 return (x >> ((-1) & (__CHAR_BIT__ * sizeof (unsigned int) - 1))) | (x << 1);
294 }
295
296 unsigned short int
297 f45 (unsigned short int x, unsigned int y)
298 {
299 if (y >= __CHAR_BIT__ * __SIZEOF_SHORT__)
300 __builtin_unreachable ();
301 return (x >> y) | (x << ((-y) & (__CHAR_BIT__ * sizeof (unsigned short) - 1)));
302 }
303
304 unsigned short int
305 f46 (unsigned short int x, unsigned long int y)
306 {
307 if (y >= __CHAR_BIT__ * __SIZEOF_SHORT__)
308 __builtin_unreachable ();
309 return (x >> y) | (x << ((-y) & (__CHAR_BIT__ * sizeof (unsigned short) - 1)));
310 }
311
312 unsigned char
313 f47 (unsigned char x, unsigned int y)
314 {
315 if (y >= __CHAR_BIT__)
316 __builtin_unreachable ();
317 return (x >> y) | (x << ((-y) & (__CHAR_BIT__ * sizeof (unsigned char) - 1)));
318 }
319
320 unsigned char
321 f48 (unsigned char x, unsigned long int y)
322 {
323 if (y >= __CHAR_BIT__)
324 __builtin_unreachable ();
325 return (x >> y) | (x << ((-y) & (__CHAR_BIT__ * sizeof (unsigned char) - 1)));
326 }
327
328 unsigned int
329 f49 (unsigned int x, unsigned int y)
330 {
331 return (x << ((-y) & (__CHAR_BIT__ * __SIZEOF_INT__ - 1))) ^ (x >> y);
332 }
333
334 unsigned int
335 f50 (unsigned int x, unsigned long int y)
336 {
337 return (x << ((-y) & (__CHAR_BIT__ * __SIZEOF_INT__ - 1))) ^ (x >> y);
338 }
339
340 unsigned int
341 f51 (unsigned int x, int y __attribute__((unused)))
342 {
343 return (x << ((-1) & (__CHAR_BIT__ * __SIZEOF_INT__ - 1))) ^ (x >> 1);
344 }
345
346 unsigned int
347 f52 (unsigned int x, int y __attribute__((unused)))
348 {
349 return (x << 1) ^ (x >> ((-1) & (__CHAR_BIT__ * __SIZEOF_INT__ - 1)));
350 }
351
352 unsigned short int
353 f53 (unsigned short int x, unsigned int y)
354 {
355 return (x << ((-y) & (__CHAR_BIT__ * __SIZEOF_SHORT__ - 1))) ^ (x >> y);
356 }
357
358 unsigned short int
359 f54 (unsigned short int x, unsigned long int y)
360 {
361 return (x << ((-y) & (__CHAR_BIT__ * __SIZEOF_SHORT__ - 1))) ^ (x >> y);
362 }
363
364 unsigned char
365 f55 (unsigned char x, unsigned int y)
366 {
367 return (x << ((-y) & (__CHAR_BIT__ - 1))) ^ (x >> y);
368 }
369
370 unsigned char
371 f56 (unsigned char x, unsigned long int y)
372 {
373 return (x << ((-y) & (__CHAR_BIT__ - 1))) ^ (x >> y);
374 }
375
376 unsigned int
377 f57 (unsigned int x, unsigned int y)
378 {
379 return (x << ((-y) & (__CHAR_BIT__ * sizeof (unsigned int) - 1))) ^ (x >> y);
380 }
381
382 unsigned int
383 f58 (unsigned int x, unsigned long int y)
384 {
385 return (x << ((-y) & (__CHAR_BIT__ * sizeof (unsigned int) - 1))) ^ (x >> y);
386 }
387
388 unsigned int
389 f59 (unsigned int x, int y __attribute__((unused)))
390 {
391 return (x << ((-1) & (__CHAR_BIT__ * sizeof (unsigned int) - 1))) ^ (x >> 1);
392 }
393
394 unsigned int
395 f60 (unsigned int x, int y __attribute__((unused)))
396 {
397 return (x << 1) ^ (x >> ((-1) & (__CHAR_BIT__ * sizeof (unsigned int) - 1)));
398 }
399
400 unsigned short int
401 f61 (unsigned short int x, unsigned int y)
402 {
403 return (x << ((-y) & (__CHAR_BIT__ * sizeof (unsigned short) - 1))) ^ (x >> y);
404 }
405
406 unsigned short int
407 f62 (unsigned short int x, unsigned long int y)
408 {
409 return (x << ((-y) & (__CHAR_BIT__ * sizeof (unsigned short) - 1))) ^ (x >> y);
410 }
411
412 unsigned char
413 f63 (unsigned char x, unsigned int y)
414 {
415 return (x << ((-y) & (__CHAR_BIT__ * sizeof (unsigned char) - 1))) ^ (x >> y);
416 }
417
418 unsigned char
419 f64 (unsigned char x, unsigned long int y)
420 {
421 return (x << ((-y) & (__CHAR_BIT__ * sizeof (unsigned char) - 1))) ^ (x >> y);
422 }
423
424 unsigned int
425 f65 (unsigned int x, unsigned int y)
426 {
427 return (x << y) + (x >> ((-y) & (__CHAR_BIT__ * __SIZEOF_INT__ - 1)));
428 }
429
430 unsigned int
431 f66 (unsigned int x, unsigned long int y)
432 {
433 return (x << y) + (x >> ((-y) & (__CHAR_BIT__ * __SIZEOF_INT__ - 1)));
434 }
435
436 unsigned int
437 f67 (unsigned int x, int y __attribute__((unused)))
438 {
439 return (x << 1) + (x >> ((-1) & (__CHAR_BIT__ * __SIZEOF_INT__ - 1)));
440 }
441
442 unsigned int
443 f68 (unsigned int x, int y __attribute__((unused)))
444 {
445 return (x << ((-1) & (__CHAR_BIT__ * __SIZEOF_INT__ - 1))) + (x >> 1);
446 }
447
448 unsigned short int
449 f69 (unsigned short int x, unsigned int y)
450 {
451 return (x << y) + (x >> ((-y) & (__CHAR_BIT__ * __SIZEOF_SHORT__ - 1)));
452 }
453
454 unsigned short int
455 f70 (unsigned short int x, unsigned long int y)
456 {
457 return (x << y) + (x >> ((-y) & (__CHAR_BIT__ * __SIZEOF_SHORT__ - 1)));
458 }
459
460 unsigned char
461 f71 (unsigned char x, unsigned int y)
462 {
463 return (x << y) + (x >> ((-y) & (__CHAR_BIT__ - 1)));
464 }
465
466 unsigned char
467 f72 (unsigned char x, unsigned long int y)
468 {
469 return (x << y) + (x >> ((-y) & (__CHAR_BIT__ - 1)));
470 }
471
472 unsigned int
473 f73 (unsigned int x, unsigned int y)
474 {
475 return (x << y) + (x >> ((-y) & (__CHAR_BIT__ * sizeof (unsigned int) - 1)));
476 }
477
478 unsigned int
479 f74 (unsigned int x, unsigned long int y)
480 {
481 return (x << y) + (x >> ((-y) & (__CHAR_BIT__ * sizeof (unsigned int) - 1)));
482 }
483
484 unsigned int
485 f75 (unsigned int x, int y __attribute__((unused)))
486 {
487 return (x << 1) + (x >> ((-1) & (__CHAR_BIT__ * sizeof (unsigned int) - 1)));
488 }
489
490 unsigned int
491 f76 (unsigned int x, int y __attribute__((unused)))
492 {
493 return (x << ((-1) & (__CHAR_BIT__ * sizeof (unsigned int) - 1))) + (x >> 1);
494 }
495
496 unsigned short int
497 f77 (unsigned short int x, unsigned int y)
498 {
499 return (x << y) + (x >> ((-y) & (__CHAR_BIT__ * sizeof (unsigned short) - 1)));
500 }
501
502 unsigned short int
503 f78 (unsigned short int x, unsigned long int y)
504 {
505 return (x << y) + (x >> ((-y) & (__CHAR_BIT__ * sizeof (unsigned short) - 1)));
506 }
507
508 unsigned char
509 f79 (unsigned char x, unsigned int y)
510 {
511 return (x << y) + (x >> ((-y) & (__CHAR_BIT__ * sizeof (unsigned char) - 1)));
512 }
513
514 unsigned char
515 f80 (unsigned char x, unsigned long int y)
516 {
517 return (x << y) + (x >> ((-y) & (__CHAR_BIT__ * sizeof (unsigned char) - 1)));
518 }
519
520 unsigned int
521 f81 (unsigned int x, unsigned int y)
522 {
523 return (x << ((-y) & (__CHAR_BIT__ * __SIZEOF_INT__ - 1))) + (x >> y);
524 }
525
526 unsigned int
527 f82 (unsigned int x, unsigned long int y)
528 {
529 return (x << ((-y) & (__CHAR_BIT__ * __SIZEOF_INT__ - 1))) + (x >> y);
530 }
531
532 unsigned int
533 f83 (unsigned int x, int y __attribute__((unused)))
534 {
535 return (x << ((-1) & (__CHAR_BIT__ * __SIZEOF_INT__ - 1))) + (x >> 1);
536 }
537
538 unsigned int
539 f84 (unsigned int x, int y __attribute__((unused)))
540 {
541 return (x << 1) + (x >> ((-1) & (__CHAR_BIT__ * __SIZEOF_INT__ - 1)));
542 }
543
544 unsigned short int
545 f85 (unsigned short int x, unsigned int y)
546 {
547 return (x << ((-y) & (__CHAR_BIT__ * __SIZEOF_SHORT__ - 1))) + (x >> y);
548 }
549
550 unsigned short int
551 f86 (unsigned short int x, unsigned long int y)
552 {
553 return (x << ((-y) & (__CHAR_BIT__ * __SIZEOF_SHORT__ - 1))) + (x >> y);
554 }
555
556 unsigned char
557 f87 (unsigned char x, unsigned int y)
558 {
559 return (x << ((-y) & (__CHAR_BIT__ - 1))) + (x >> y);
560 }
561
562 unsigned char
563 f88 (unsigned char x, unsigned long int y)
564 {
565 return (x << ((-y) & (__CHAR_BIT__ - 1))) + (x >> y);
566 }
567
568 unsigned int
569 f89 (unsigned int x, unsigned int y)
570 {
571 return (x << ((-y) & (__CHAR_BIT__ * sizeof (unsigned int) - 1))) + (x >> y);
572 }
573
574 unsigned int
575 f90 (unsigned int x, unsigned long int y)
576 {
577 return (x << ((-y) & (__CHAR_BIT__ * sizeof (unsigned int) - 1))) + (x >> y);
578 }
579
580 unsigned int
581 f91 (unsigned int x, int y __attribute__((unused)))
582 {
583 return (x << ((-1) & (__CHAR_BIT__ * sizeof (unsigned int) - 1))) + (x >> 1);
584 }
585
586 unsigned int
587 f92 (unsigned int x, int y __attribute__((unused)))
588 {
589 return (x << 1) + (x >> ((-1) & (__CHAR_BIT__ * sizeof (unsigned int) - 1)));
590 }
591
592 unsigned short int
593 f93 (unsigned short int x, unsigned int y)
594 {
595 return (x << ((-y) & (__CHAR_BIT__ * sizeof (unsigned short) - 1))) + (x >> y);
596 }
597
598 unsigned short int
599 f94 (unsigned short int x, unsigned long int y)
600 {
601 return (x << ((-y) & (__CHAR_BIT__ * sizeof (unsigned short) - 1))) + (x >> y);
602 }
603
604 unsigned char
605 f95 (unsigned char x, unsigned int y)
606 {
607 return (x << ((-y) & (__CHAR_BIT__ * sizeof (unsigned char) - 1))) + (x >> y);
608 }
609
610 unsigned char
611 f96 (unsigned char x, unsigned long int y)
612 {
613 return (x << ((-y) & (__CHAR_BIT__ * sizeof (unsigned char) - 1))) + (x >> y);
614 }