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))
      31  consume_i (struct I i)
      32  {
      33    v = i.i;
      34  }
      35  
      36  void __attribute__((noipa))
      37  consume_a (struct A a)
      38  {
      39    v = a.i1.i;
      40  }
      41  
      42  void __attribute__((noipa))
      43  consume_b (struct B b)
      44  {
      45    v = b.a.i1.i;
      46  }
      47  
      48  void __attribute__((noipa))
      49  consume_c (struct C c)
      50  {
      51    v = c.b.a.i1.i;
      52  }
      53  
      54  
      55  
      56  
      57  int __attribute__((noipa))
      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
      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  }