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)31 consume_i (struct I i)
32 {
33   v = i.i;
34 }
35 
36 void __attribute__((noipa))
consume_a(struct A a)37 consume_a (struct A a)
38 {
39   v = a.i1.i;
40 }
41 
42 void __attribute__((noipa))
consume_b(struct B b)43 consume_b (struct B b)
44 {
45   v = b.a.i1.i;
46 }
47 
48 void __attribute__((noipa))
consume_c(struct C c)49 consume_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)58 foo (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[])92 main (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