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)8lshifts (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)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 24 static inline int rshifts(int val,unsigned int cnt)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 32 int foo(unsigned int val)33foo (unsigned int val) 34 { 35 return rshifts (1 + val, lshifts (lshiftu (val, val), 1)); 36 } 37 38 int main(void)39main (void) 40 { 41 if (foo (1) != 0) 42 abort (); 43 return 0; 44 } 45