| /* PR middle-end/22141 */ |
| |
| extern void abort (void); |
| |
| struct S |
| { |
| struct T |
| { |
| char a; |
| char b; |
| char c; |
| char d; |
| } t; |
| } u __attribute__((aligned)); |
| |
| struct U |
| { |
| struct S s[4]; |
| }; |
| |
| void __attribute__((noinline)) |
| c1 (struct T *p) |
| { |
| if (p->a != 1 || p->b != 2 || p->c != 3 || p->d != 4) |
| abort (); |
| __builtin_memset (p, 0xaa, sizeof (*p)); |
| } |
| |
| void __attribute__((noinline)) |
| c2 (struct S *p) |
| { |
| c1 (&p->t); |
| } |
| |
| void __attribute__((noinline)) |
| c3 (struct U *p) |
| { |
| c2 (&p->s[2]); |
| } |
| |
| void __attribute__((noinline)) |
| f1 (void) |
| { |
| u = (struct S) { { 1, 2, 3, 4 } }; |
| } |
| |
| void __attribute__((noinline)) |
| f2 (void) |
| { |
| u.t.a = 1; |
| u.t.b = 2; |
| u.t.c = 3; |
| u.t.d = 4; |
| } |
| |
| void __attribute__((noinline)) |
| f3 (void) |
| { |
| u.t.d = 4; |
| u.t.b = 2; |
| u.t.a = 1; |
| u.t.c = 3; |
| } |
| |
| void __attribute__((noinline)) |
| f4 (void) |
| { |
| struct S v __attribute__((aligned)); |
| v.t.a = 1; |
| v.t.b = 2; |
| v.t.c = 3; |
| v.t.d = 4; |
| c2 (&v); |
| } |
| |
| void __attribute__((noinline)) |
| f5 (struct S *p) |
| { |
| p->t.a = 1; |
| p->t.c = 3; |
| p->t.d = 4; |
| p->t.b = 2; |
| } |
| |
| void __attribute__((noinline)) |
| f6 (void) |
| { |
| struct U v __attribute__((aligned)); |
| v.s[2].t.a = 1; |
| v.s[2].t.b = 2; |
| v.s[2].t.c = 3; |
| v.s[2].t.d = 4; |
| c3 (&v); |
| } |
| |
| void __attribute__((noinline)) |
| f7 (struct U *p) |
| { |
| p->s[2].t.a = 1; |
| p->s[2].t.c = 3; |
| p->s[2].t.d = 4; |
| p->s[2].t.b = 2; |
| } |
| |
| int |
| main (void) |
| { |
| struct U w __attribute__((aligned)); |
| f1 (); |
| c2 (&u); |
| f2 (); |
| c1 (&u.t); |
| f3 (); |
| c2 (&u); |
| f4 (); |
| f5 (&u); |
| c2 (&u); |
| f6 (); |
| f7 (&w); |
| c3 (&w); |
| return 0; |
| } |