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" } } */
9 f1 (unsigned int x
, unsigned int y
)
11 return (x
<< y
) | (x
>> ((-y
) & (__CHAR_BIT__
* __SIZEOF_INT__
- 1)));
15 f2 (unsigned int x
, unsigned long int y
)
17 return (x
<< y
) | (x
>> ((-y
) & (__CHAR_BIT__
* __SIZEOF_INT__
- 1)));
21 f3 (unsigned int x
, int y
__attribute__((unused
)))
23 return (x
<< 1) | (x
>> ((-1) & (__CHAR_BIT__
* __SIZEOF_INT__
- 1)));
27 f4 (unsigned int x
, int y
__attribute__((unused
)))
29 return (x
<< ((-1) & (__CHAR_BIT__
* __SIZEOF_INT__
- 1))) | (x
>> 1);
33 f5 (unsigned short int x
, unsigned int y
)
35 if (y
>= __CHAR_BIT__
* __SIZEOF_SHORT__
)
36 __builtin_unreachable ();
37 return (x
<< y
) | (x
>> ((-y
) & (__CHAR_BIT__
* __SIZEOF_SHORT__
- 1)));
41 f6 (unsigned short int x
, unsigned long int y
)
43 if (y
>= __CHAR_BIT__
* __SIZEOF_SHORT__
)
44 __builtin_unreachable ();
45 return (x
<< y
) | (x
>> ((-y
) & (__CHAR_BIT__
* __SIZEOF_SHORT__
- 1)));
49 f7 (unsigned char x
, unsigned int y
)
51 if (y
>= __CHAR_BIT__
)
52 __builtin_unreachable ();
53 return (x
<< y
) | (x
>> ((-y
) & (__CHAR_BIT__
- 1)));
57 f8 (unsigned char x
, unsigned long int y
)
59 if (y
>= __CHAR_BIT__
)
60 __builtin_unreachable ();
61 return (x
<< y
) | (x
>> ((-y
) & (__CHAR_BIT__
- 1)));
65 f9 (unsigned int x
, unsigned int y
)
67 return (x
<< y
) | (x
>> ((-y
) & (__CHAR_BIT__
* sizeof (unsigned int) - 1)));
71 f10 (unsigned int x
, unsigned long int y
)
73 return (x
<< y
) | (x
>> ((-y
) & (__CHAR_BIT__
* sizeof (unsigned int) - 1)));
77 f11 (unsigned int x
, int y
__attribute__((unused
)))
79 return (x
<< 1) | (x
>> ((-1) & (__CHAR_BIT__
* sizeof (unsigned int) - 1)));
83 f12 (unsigned int x
, int y
__attribute__((unused
)))
85 return (x
<< ((-1) & (__CHAR_BIT__
* sizeof (unsigned int) - 1))) | (x
>> 1);
89 f13 (unsigned short int x
, unsigned int y
)
91 if (y
>= __CHAR_BIT__
* __SIZEOF_SHORT__
)
92 __builtin_unreachable ();
93 return (x
<< y
) | (x
>> ((-y
) & (__CHAR_BIT__
* sizeof (unsigned short) - 1)));
97 f14 (unsigned short int x
, unsigned long int y
)
99 if (y
>= __CHAR_BIT__
* __SIZEOF_SHORT__
)
100 __builtin_unreachable ();
101 return (x
<< y
) | (x
>> ((-y
) & (__CHAR_BIT__
* sizeof (unsigned short) - 1)));
105 f15 (unsigned char x
, unsigned int y
)
107 if (y
>= __CHAR_BIT__
)
108 __builtin_unreachable ();
109 return (x
<< y
) | (x
>> ((-y
) & (__CHAR_BIT__
* sizeof (unsigned char) - 1)));
113 f16 (unsigned char x
, unsigned long int y
)
115 if (y
>= __CHAR_BIT__
)
116 __builtin_unreachable ();
117 return (x
<< y
) | (x
>> ((-y
) & (__CHAR_BIT__
* sizeof (unsigned char) - 1)));
121 f17 (unsigned int x
, unsigned int y
)
123 return (x
>> ((-y
) & (__CHAR_BIT__
* __SIZEOF_INT__
- 1))) ^ (x
<< y
);
127 f18 (unsigned int x
, unsigned long int y
)
129 return (x
>> ((-y
) & (__CHAR_BIT__
* __SIZEOF_INT__
- 1))) ^ (x
<< y
);
133 f19 (unsigned int x
, int y
__attribute__((unused
)))
135 return (x
>> ((-1) & (__CHAR_BIT__
* __SIZEOF_INT__
- 1))) ^ (x
<< 1);
139 f20 (unsigned int x
, int y
__attribute__((unused
)))
141 return (x
>> 1) ^ (x
<< ((-1) & (__CHAR_BIT__
* __SIZEOF_INT__
- 1)));
145 f21 (unsigned short int x
, unsigned int y
)
147 return (x
>> ((-y
) & (__CHAR_BIT__
* __SIZEOF_SHORT__
- 1))) ^ (x
<< y
);
151 f22 (unsigned short int x
, unsigned long int y
)
153 return (x
>> ((-y
) & (__CHAR_BIT__
* __SIZEOF_SHORT__
- 1))) ^ (x
<< y
);
157 f23 (unsigned char x
, unsigned int y
)
159 return (x
>> ((-y
) & (__CHAR_BIT__
- 1))) ^ (x
<< y
);
163 f24 (unsigned char x
, unsigned long int y
)
165 return (x
>> ((-y
) & (__CHAR_BIT__
- 1))) ^ (x
<< y
);
169 f25 (unsigned int x
, unsigned int y
)
171 return (x
>> ((-y
) & (__CHAR_BIT__
* sizeof (unsigned int) - 1))) ^ (x
<< y
);
175 f26 (unsigned int x
, unsigned long int y
)
177 return (x
>> ((-y
) & (__CHAR_BIT__
* sizeof (unsigned int) - 1))) ^ (x
<< y
);
181 f27 (unsigned int x
, int y
__attribute__((unused
)))
183 return (x
>> ((-1) & (__CHAR_BIT__
* sizeof (unsigned int) - 1))) ^ (x
<< 1);
187 f28 (unsigned int x
, int y
__attribute__((unused
)))
189 return (x
>> 1) ^ (x
<< ((-1) & (__CHAR_BIT__
* sizeof (unsigned int) - 1)));
193 f29 (unsigned short int x
, unsigned int y
)
195 return (x
>> ((-y
) & (__CHAR_BIT__
* sizeof (unsigned short) - 1))) ^ (x
<< y
);
199 f30 (unsigned short int x
, unsigned long int y
)
201 return (x
>> ((-y
) & (__CHAR_BIT__
* sizeof (unsigned short) - 1))) ^ (x
<< y
);
205 f31 (unsigned char x
, unsigned int y
)
207 return (x
>> ((-y
) & (__CHAR_BIT__
* sizeof (unsigned char) - 1))) ^ (x
<< y
);
211 f32 (unsigned char x
, unsigned long int y
)
213 return (x
>> ((-y
) & (__CHAR_BIT__
* sizeof (unsigned char) - 1))) ^ (x
<< y
);
217 f33 (unsigned int x
, unsigned int y
)
219 return (x
>> y
) | (x
<< ((-y
) & (__CHAR_BIT__
* __SIZEOF_INT__
- 1)));
223 f34 (unsigned int x
, unsigned long int y
)
225 return (x
>> y
) | (x
<< ((-y
) & (__CHAR_BIT__
* __SIZEOF_INT__
- 1)));
229 f35 (unsigned int x
, int y
__attribute__((unused
)))
231 return (x
>> 1) | (x
<< ((-1) & (__CHAR_BIT__
* __SIZEOF_INT__
- 1)));
235 f36 (unsigned int x
, int y
__attribute__((unused
)))
237 return (x
>> ((-1) & (__CHAR_BIT__
* __SIZEOF_INT__
- 1))) | (x
<< 1);
241 f37 (unsigned short int x
, unsigned int y
)
243 if (y
>= __CHAR_BIT__
* __SIZEOF_SHORT__
)
244 __builtin_unreachable ();
245 return (x
>> y
) | (x
<< ((-y
) & (__CHAR_BIT__
* __SIZEOF_SHORT__
- 1)));
249 f38 (unsigned short int x
, unsigned long int y
)
251 if (y
>= __CHAR_BIT__
* __SIZEOF_SHORT__
)
252 __builtin_unreachable ();
253 return (x
>> y
) | (x
<< ((-y
) & (__CHAR_BIT__
* __SIZEOF_SHORT__
- 1)));
257 f39 (unsigned char x
, unsigned int y
)
259 if (y
>= __CHAR_BIT__
)
260 __builtin_unreachable ();
261 return (x
>> y
) | (x
<< ((-y
) & (__CHAR_BIT__
- 1)));
265 f40 (unsigned char x
, unsigned long int y
)
267 if (y
>= __CHAR_BIT__
)
268 __builtin_unreachable ();
269 return (x
>> y
) | (x
<< ((-y
) & (__CHAR_BIT__
- 1)));
273 f41 (unsigned int x
, unsigned int y
)
275 return (x
>> y
) | (x
<< ((-y
) & (__CHAR_BIT__
* sizeof (unsigned int) - 1)));
279 f42 (unsigned int x
, unsigned long int y
)
281 return (x
>> y
) | (x
<< ((-y
) & (__CHAR_BIT__
* sizeof (unsigned int) - 1)));
285 f43 (unsigned int x
, int y
__attribute__((unused
)))
287 return (x
>> 1) | (x
<< ((-1) & (__CHAR_BIT__
* sizeof (unsigned int) - 1)));
291 f44 (unsigned int x
, int y
__attribute__((unused
)))
293 return (x
>> ((-1) & (__CHAR_BIT__
* sizeof (unsigned int) - 1))) | (x
<< 1);
297 f45 (unsigned short int x
, unsigned int y
)
299 if (y
>= __CHAR_BIT__
* __SIZEOF_SHORT__
)
300 __builtin_unreachable ();
301 return (x
>> y
) | (x
<< ((-y
) & (__CHAR_BIT__
* sizeof (unsigned short) - 1)));
305 f46 (unsigned short int x
, unsigned long int y
)
307 if (y
>= __CHAR_BIT__
* __SIZEOF_SHORT__
)
308 __builtin_unreachable ();
309 return (x
>> y
) | (x
<< ((-y
) & (__CHAR_BIT__
* sizeof (unsigned short) - 1)));
313 f47 (unsigned char x
, unsigned int y
)
315 if (y
>= __CHAR_BIT__
)
316 __builtin_unreachable ();
317 return (x
>> y
) | (x
<< ((-y
) & (__CHAR_BIT__
* sizeof (unsigned char) - 1)));
321 f48 (unsigned char x
, unsigned long int y
)
323 if (y
>= __CHAR_BIT__
)
324 __builtin_unreachable ();
325 return (x
>> y
) | (x
<< ((-y
) & (__CHAR_BIT__
* sizeof (unsigned char) - 1)));
329 f49 (unsigned int x
, unsigned int y
)
331 return (x
<< ((-y
) & (__CHAR_BIT__
* __SIZEOF_INT__
- 1))) ^ (x
>> y
);
335 f50 (unsigned int x
, unsigned long int y
)
337 return (x
<< ((-y
) & (__CHAR_BIT__
* __SIZEOF_INT__
- 1))) ^ (x
>> y
);
341 f51 (unsigned int x
, int y
__attribute__((unused
)))
343 return (x
<< ((-1) & (__CHAR_BIT__
* __SIZEOF_INT__
- 1))) ^ (x
>> 1);
347 f52 (unsigned int x
, int y
__attribute__((unused
)))
349 return (x
<< 1) ^ (x
>> ((-1) & (__CHAR_BIT__
* __SIZEOF_INT__
- 1)));
353 f53 (unsigned short int x
, unsigned int y
)
355 return (x
<< ((-y
) & (__CHAR_BIT__
* __SIZEOF_SHORT__
- 1))) ^ (x
>> y
);
359 f54 (unsigned short int x
, unsigned long int y
)
361 return (x
<< ((-y
) & (__CHAR_BIT__
* __SIZEOF_SHORT__
- 1))) ^ (x
>> y
);
365 f55 (unsigned char x
, unsigned int y
)
367 return (x
<< ((-y
) & (__CHAR_BIT__
- 1))) ^ (x
>> y
);
371 f56 (unsigned char x
, unsigned long int y
)
373 return (x
<< ((-y
) & (__CHAR_BIT__
- 1))) ^ (x
>> y
);
377 f57 (unsigned int x
, unsigned int y
)
379 return (x
<< ((-y
) & (__CHAR_BIT__
* sizeof (unsigned int) - 1))) ^ (x
>> y
);
383 f58 (unsigned int x
, unsigned long int y
)
385 return (x
<< ((-y
) & (__CHAR_BIT__
* sizeof (unsigned int) - 1))) ^ (x
>> y
);
389 f59 (unsigned int x
, int y
__attribute__((unused
)))
391 return (x
<< ((-1) & (__CHAR_BIT__
* sizeof (unsigned int) - 1))) ^ (x
>> 1);
395 f60 (unsigned int x
, int y
__attribute__((unused
)))
397 return (x
<< 1) ^ (x
>> ((-1) & (__CHAR_BIT__
* sizeof (unsigned int) - 1)));
401 f61 (unsigned short int x
, unsigned int y
)
403 return (x
<< ((-y
) & (__CHAR_BIT__
* sizeof (unsigned short) - 1))) ^ (x
>> y
);
407 f62 (unsigned short int x
, unsigned long int y
)
409 return (x
<< ((-y
) & (__CHAR_BIT__
* sizeof (unsigned short) - 1))) ^ (x
>> y
);
413 f63 (unsigned char x
, unsigned int y
)
415 return (x
<< ((-y
) & (__CHAR_BIT__
* sizeof (unsigned char) - 1))) ^ (x
>> y
);
419 f64 (unsigned char x
, unsigned long int y
)
421 return (x
<< ((-y
) & (__CHAR_BIT__
* sizeof (unsigned char) - 1))) ^ (x
>> y
);
425 f65 (unsigned int x
, unsigned int y
)
427 return (x
<< y
) + (x
>> ((-y
) & (__CHAR_BIT__
* __SIZEOF_INT__
- 1)));
431 f66 (unsigned int x
, unsigned long int y
)
433 return (x
<< y
) + (x
>> ((-y
) & (__CHAR_BIT__
* __SIZEOF_INT__
- 1)));
437 f67 (unsigned int x
, int y
__attribute__((unused
)))
439 return (x
<< 1) + (x
>> ((-1) & (__CHAR_BIT__
* __SIZEOF_INT__
- 1)));
443 f68 (unsigned int x
, int y
__attribute__((unused
)))
445 return (x
<< ((-1) & (__CHAR_BIT__
* __SIZEOF_INT__
- 1))) + (x
>> 1);
449 f69 (unsigned short int x
, unsigned int y
)
451 return (x
<< y
) + (x
>> ((-y
) & (__CHAR_BIT__
* __SIZEOF_SHORT__
- 1)));
455 f70 (unsigned short int x
, unsigned long int y
)
457 return (x
<< y
) + (x
>> ((-y
) & (__CHAR_BIT__
* __SIZEOF_SHORT__
- 1)));
461 f71 (unsigned char x
, unsigned int y
)
463 return (x
<< y
) + (x
>> ((-y
) & (__CHAR_BIT__
- 1)));
467 f72 (unsigned char x
, unsigned long int y
)
469 return (x
<< y
) + (x
>> ((-y
) & (__CHAR_BIT__
- 1)));
473 f73 (unsigned int x
, unsigned int y
)
475 return (x
<< y
) + (x
>> ((-y
) & (__CHAR_BIT__
* sizeof (unsigned int) - 1)));
479 f74 (unsigned int x
, unsigned long int y
)
481 return (x
<< y
) + (x
>> ((-y
) & (__CHAR_BIT__
* sizeof (unsigned int) - 1)));
485 f75 (unsigned int x
, int y
__attribute__((unused
)))
487 return (x
<< 1) + (x
>> ((-1) & (__CHAR_BIT__
* sizeof (unsigned int) - 1)));
491 f76 (unsigned int x
, int y
__attribute__((unused
)))
493 return (x
<< ((-1) & (__CHAR_BIT__
* sizeof (unsigned int) - 1))) + (x
>> 1);
497 f77 (unsigned short int x
, unsigned int y
)
499 return (x
<< y
) + (x
>> ((-y
) & (__CHAR_BIT__
* sizeof (unsigned short) - 1)));
503 f78 (unsigned short int x
, unsigned long int y
)
505 return (x
<< y
) + (x
>> ((-y
) & (__CHAR_BIT__
* sizeof (unsigned short) - 1)));
509 f79 (unsigned char x
, unsigned int y
)
511 return (x
<< y
) + (x
>> ((-y
) & (__CHAR_BIT__
* sizeof (unsigned char) - 1)));
515 f80 (unsigned char x
, unsigned long int y
)
517 return (x
<< y
) + (x
>> ((-y
) & (__CHAR_BIT__
* sizeof (unsigned char) - 1)));
521 f81 (unsigned int x
, unsigned int y
)
523 return (x
<< ((-y
) & (__CHAR_BIT__
* __SIZEOF_INT__
- 1))) + (x
>> y
);
527 f82 (unsigned int x
, unsigned long int y
)
529 return (x
<< ((-y
) & (__CHAR_BIT__
* __SIZEOF_INT__
- 1))) + (x
>> y
);
533 f83 (unsigned int x
, int y
__attribute__((unused
)))
535 return (x
<< ((-1) & (__CHAR_BIT__
* __SIZEOF_INT__
- 1))) + (x
>> 1);
539 f84 (unsigned int x
, int y
__attribute__((unused
)))
541 return (x
<< 1) + (x
>> ((-1) & (__CHAR_BIT__
* __SIZEOF_INT__
- 1)));
545 f85 (unsigned short int x
, unsigned int y
)
547 return (x
<< ((-y
) & (__CHAR_BIT__
* __SIZEOF_SHORT__
- 1))) + (x
>> y
);
551 f86 (unsigned short int x
, unsigned long int y
)
553 return (x
<< ((-y
) & (__CHAR_BIT__
* __SIZEOF_SHORT__
- 1))) + (x
>> y
);
557 f87 (unsigned char x
, unsigned int y
)
559 return (x
<< ((-y
) & (__CHAR_BIT__
- 1))) + (x
>> y
);
563 f88 (unsigned char x
, unsigned long int y
)
565 return (x
<< ((-y
) & (__CHAR_BIT__
- 1))) + (x
>> y
);
569 f89 (unsigned int x
, unsigned int y
)
571 return (x
<< ((-y
) & (__CHAR_BIT__
* sizeof (unsigned int) - 1))) + (x
>> y
);
575 f90 (unsigned int x
, unsigned long int y
)
577 return (x
<< ((-y
) & (__CHAR_BIT__
* sizeof (unsigned int) - 1))) + (x
>> y
);
581 f91 (unsigned int x
, int y
__attribute__((unused
)))
583 return (x
<< ((-1) & (__CHAR_BIT__
* sizeof (unsigned int) - 1))) + (x
>> 1);
587 f92 (unsigned int x
, int y
__attribute__((unused
)))
589 return (x
<< 1) + (x
>> ((-1) & (__CHAR_BIT__
* sizeof (unsigned int) - 1)));
593 f93 (unsigned short int x
, unsigned int y
)
595 return (x
<< ((-y
) & (__CHAR_BIT__
* sizeof (unsigned short) - 1))) + (x
>> y
);
599 f94 (unsigned short int x
, unsigned long int y
)
601 return (x
<< ((-y
) & (__CHAR_BIT__
* sizeof (unsigned short) - 1))) + (x
>> y
);
605 f95 (unsigned char x
, unsigned int y
)
607 return (x
<< ((-y
) & (__CHAR_BIT__
* sizeof (unsigned char) - 1))) + (x
>> y
);
611 f96 (unsigned char x
, unsigned long int y
)
613 return (x
<< ((-y
) & (__CHAR_BIT__
* sizeof (unsigned char) - 1))) + (x
>> y
);