1 /* PR tree-optimization/108440 */
2 /* { dg-do compile { target { { ilp32 || lp64 } || llp64 } } } */
3 /* { dg-options "-O2 -fdump-tree-optimized" } */
4 /* { dg-final { scan-tree-dump-times " r<< " 5 "optimized" } } */
5 /* { dg-final { scan-tree-dump-times " \\\& 7;" 4 "optimized" } } */
6
7 unsigned char
8 foo (unsigned char x, unsigned int y)
9 {
10 if (y > __CHAR_BIT__)
11 return 42;
12 return (x << y) | (x >> ((-y) & (__CHAR_BIT__ - 1)));
13 }
14
15 unsigned char
16 bar (unsigned char x, unsigned int y)
17 {
18 if (y >= __CHAR_BIT__)
19 return 42;
20 return (x << y) | (x >> ((-y) & (__CHAR_BIT__ - 1)));
21 }
22
23 unsigned char
24 baz (unsigned char x, unsigned int y)
25 {
26 if (y > __CHAR_BIT__ && y != 2 * __CHAR_BIT__)
27 return 42;
28 return (x << y) | (x >> ((-y) & (__CHAR_BIT__ - 1)));
29 }
30
31 unsigned char
32 qux (unsigned char x, unsigned int y)
33 {
34 if (y > __CHAR_BIT__ && y != 2 * __CHAR_BIT__ && y != __CHAR_BIT__ + 2)
35 return 42;
36 return (x << y) | (x >> ((-y) & (__CHAR_BIT__ - 1)));
37 }
38
39 unsigned char
40 quux (unsigned char x, unsigned int y)
41 {
42 if (y > __CHAR_BIT__)
43 return 42;
44 return (x << y) | (x >> (__CHAR_BIT__ - y));
45 }
46
47 unsigned char
48 corge (unsigned char x, unsigned int y)
49 {
50 if (y >= __CHAR_BIT__)
51 return 42;
52 return (x << y) | (x >> (__CHAR_BIT__ - y));
53 }