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