1 /* { dg-do run } */ 2 /* { dg-options "-O" } */ 3 4 struct I 5 { 6 int i; 7 }; 8 9 struct A 10 { 11 struct I i1; 12 struct I i2; 13 struct I i3; 14 }; 15 16 struct B 17 { 18 struct I i0; 19 struct A a; 20 }; 21 22 struct C 23 { 24 struct I i00; 25 struct B b; 26 }; 27 28 volatile int v; 29 30 void __attribute__((noipa)) consume_i(struct I i)31consume_i (struct I i) 32 { 33 v = i.i; 34 } 35 36 void __attribute__((noipa)) consume_a(struct A a)37consume_a (struct A a) 38 { 39 v = a.i1.i; 40 } 41 42 void __attribute__((noipa)) consume_b(struct B b)43consume_b (struct B b) 44 { 45 v = b.a.i1.i; 46 } 47 48 void __attribute__((noipa)) consume_c(struct C c)49consume_c (struct C c) 50 { 51 v = c.b.a.i1.i; 52 } 53 54 55 56 57 int __attribute__((noipa)) foo(struct I input)58foo (struct I input) 59 { 60 struct I i1, i2, i3; 61 struct A a1, a2, a3; 62 struct B b1; 63 struct C c; 64 65 i1 = input; 66 a1.i1 = i1; 67 b1.a = a1; 68 69 i2.i = 1; 70 b1.i0 = i2; 71 72 c.b = b1; 73 74 a2 = c.b.a; 75 a3 = a2; 76 i3 = a3.i1; 77 78 int t = c.b.i0.i; 79 a2.i3.i = 4; 80 consume_i (i1); 81 consume_i (i2); 82 consume_b (b1); 83 consume_a (a1); 84 consume_a (a2); 85 consume_a (a3); 86 consume_c (c); 87 88 return i3.i + t; 89 } 90 91 int main(int argc,char * argv[])92main (int argc, char *argv[]) 93 { 94 struct I s; 95 s.i = 1234; 96 int i = foo (s); 97 if (i != 1235) 98 __builtin_abort (); 99 return 0; 100 } 101