| /* { dg-options "-O2" } */ |
| /* { dg-do run { target { { *-*-linux* } && { ! ia32 } } } } */ |
| |
| struct S { unsigned a:1, b:1, c:1, d:1, e:14, f:14; }; |
| |
| __attribute__((noipa)) int |
| foo (struct S x) |
| { |
| if (x.a != 0 || x.b != 1 || x.c != 0 || x.d != 1 |
| || x.e != 7239 || x.f != 6474) |
| __builtin_abort (); |
| } |
| |
| __attribute__((noipa)) void |
| bar (struct S x, struct S y) |
| { |
| if (x.a != 0 || x.b != 1 || x.c != 0 || x.d != 1 |
| || x.e != 7239 || x.f != 6474) |
| __builtin_abort (); |
| if (y.a != 0 || y.b != 1 || y.c != 1 || y.d != 1 |
| || y.e != 16320 || y.f != 7315) |
| __builtin_abort (); |
| } |
| |
| __attribute__((noipa)) void |
| baz (struct S x) |
| { |
| if (x.a != 1 || x.b != 1 || x.c != 1 || x.d != 1 |
| || x.e != 16320 || x.f != 7315) |
| __builtin_abort (); |
| } |
| |
| __attribute__((noipa)) void |
| qux (struct S x, struct S y, unsigned z) |
| { |
| struct S a = x, b; |
| for (unsigned i = 0; i < z; ++i) |
| foo (x); |
| if (x.a && x.e == 16) |
| a.e = 32; |
| b = a; |
| b.c = y.c; |
| b.e = y.e; |
| b.f = y.f; |
| bar (a, b); |
| a = b; |
| __asm volatile ("" : : : "ax", "bx", "cx", "dx", "si", "di", |
| #ifdef __OPTIMIZE__ |
| "bp", |
| #endif |
| "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"); |
| a.a = 1; |
| a.c = 1; |
| baz (a); |
| } |
| |
| int |
| main () |
| { |
| struct S x = { 0, 1, 0, 1, 7239, 6474 }; |
| struct S y = { 1, 0, 1, 0, 16320, 7315 }; |
| qux (x, y, 1); |
| return 0; |
| } |