/* { dg-do run } */ /* { dg-options "-O" } */ struct I { int i; }; struct A { struct I i1; struct I i2; struct I i3; }; struct B { struct I i0; struct A a; }; struct C { struct I i00; struct B b; }; volatile int v; void __attribute__((noipa)) consume_i (struct I i) { v = i.i; } void __attribute__((noipa)) consume_a (struct A a) { v = a.i1.i; } void __attribute__((noipa)) consume_b (struct B b) { v = b.a.i1.i; } void __attribute__((noipa)) consume_c (struct C c) { v = c.b.a.i1.i; } int __attribute__((noipa)) foo (struct I input) { struct I i1, i2, i3; struct A a1, a2, a3; struct B b1; struct C c; i1 = input; a1.i1 = i1; b1.a = a1; i2.i = 1; b1.i0 = i2; c.b = b1; a2 = c.b.a; a3 = a2; i3 = a3.i1; int t = c.b.i0.i; a2.i3.i = 4; consume_i (i1); consume_i (i2); consume_b (b1); consume_a (a1); consume_a (a2); consume_a (a3); consume_c (c); return i3.i + t; } int main (int argc, char *argv[]) { struct I s; s.i = 1234; int i = foo (s); if (i != 1235) __builtin_abort (); return 0; }