1 /* { dg-do run { target { { *-*-linux* *-*-gnu* } && ilp32 } } } */
2 /* { dg-options "-Os" } */
3 /* PR target/36613 */
4 
5 extern void abort (void);
6 
7 static inline int
lshifts(int val,int cnt)8 lshifts (int val, int cnt)
9 {
10   if (val < 0)
11     return val;
12   return val << cnt;
13 }
14 
15 static inline unsigned int
lshiftu(unsigned int val,unsigned int cnt)16 lshiftu (unsigned int val, unsigned int cnt)
17 {
18   if (cnt >= sizeof (unsigned int) * __CHAR_BIT__
19       || val > ((__INT_MAX__ * 2U) >> cnt))
20     return val;
21   return val << cnt;
22 }
23 
24 static inline int
rshifts(int val,unsigned int cnt)25 rshifts (int val, unsigned int cnt)
26 {
27   if (val < 0 || cnt >= sizeof (int) * __CHAR_BIT__)
28     return val;
29   return val >> cnt;
30 }
31 
32 int
foo(unsigned int val)33 foo (unsigned int val)
34 {
35   return rshifts (1 + val, lshifts (lshiftu (val, val), 1));
36 }
37 
38 int
main(void)39 main (void)
40 {
41   if (foo (1) != 0)
42     abort ();
43   return 0;
44 }
45