| /* PR tree-optimization/88739 */ |
| #if __SIZEOF_SHORT__ == 2 && __SIZEOF_INT__ == 4 && __CHAR_BIT__ == 8 |
| struct A |
| { |
| unsigned int a, b, c; |
| unsigned int d : 30; |
| unsigned int e : 2; |
| }; |
| |
| union U |
| { |
| struct A f; |
| unsigned int g[4]; |
| unsigned short h[8]; |
| unsigned char i[16]; |
| }; |
| volatile union U v = { .f.d = 0x4089 }; |
| |
| __attribute__((noipa)) void |
| bar (int x) |
| { |
| static int i; |
| switch (i++) |
| { |
| case 0: if (x != v.f.d) __builtin_abort (); break; |
| case 1: if (x != v.f.e) __builtin_abort (); break; |
| case 2: if (x != v.g[3]) __builtin_abort (); break; |
| case 3: if (x != v.h[6]) __builtin_abort (); break; |
| case 4: if (x != v.h[7]) __builtin_abort (); break; |
| default: __builtin_abort (); break; |
| } |
| } |
| |
| void |
| foo (unsigned int x) |
| { |
| union U u; |
| u.f.d = x >> 2; |
| u.f.e = 0; |
| bar (u.f.d); |
| bar (u.f.e); |
| bar (u.g[3]); |
| bar (u.h[6]); |
| bar (u.h[7]); |
| } |
| |
| int |
| main () |
| { |
| foo (0x10224); |
| return 0; |
| } |
| #else |
| int |
| main () |
| { |
| return 0; |
| } |
| #endif |