| /* { dg-do run } */ |
| /* { dg-options "-O" } */ |
| |
| extern void link_error (void); |
| unsigned int __attribute__((noinline,noclone)) |
| test0 (unsigned int a) |
| { |
| a = a & 1; |
| a = a << 1 | a >> (sizeof (unsigned int) * 8 - 1); |
| if (a & 1) |
| { |
| a = a | 4; |
| link_error (); |
| } |
| if (a & 4) |
| link_error (); |
| return a; |
| } |
| int __attribute__((noinline,noclone)) |
| test1 (int a) |
| { |
| a |= 1; |
| a = a << (sizeof (int) * 8 - 1); |
| if (a >= 0) |
| link_error (); |
| a = a * 4; |
| if (a & ~3) |
| link_error (); |
| if (a == -1) |
| link_error (); |
| return a; |
| } |
| int __attribute__((noinline,noclone)) |
| test2 (int a) |
| { |
| a = a | 0xff; |
| a = a + 1; |
| if (a & 0xff) |
| link_error (); |
| a = -a; |
| if (a & 0xff) |
| link_error (); |
| a = a - 1; |
| if ((a & 0xff) != 0xff) |
| link_error (); |
| return a; |
| } |
| extern void abort (void); |
| int main() |
| { |
| if (test0 (1) != 2) |
| abort (); |
| if (test1 (0) != 0) |
| abort (); |
| if (test2 (-1) != -1) |
| abort (); |
| return 0; |
| } |