https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66142
--- Comment #7 from Jakub Jelinek <jakub at gcc dot gnu.org> --- Slightly improved variant of #c6 testcase: struct A { float x, y; }; struct B { struct A u; }; void bar (struct A *); float f1 (struct B *x, int y) { struct A p; p.x = 1.0f; p.y = 2.0f; struct A *q = &x[y].u; *q = p; float f = x[y].u.x + x[y].u.y; bar (&p); return f; } float f2 (struct B *x, int y) { struct A p; p.x = 1.0f; p.y = 2.0f; x[y].u = p; float f = x[y].u.x + x[y].u.y; bar (&p); return f; } float f3 (struct B *x, int y) { struct A p; p.x = 1.0f; p.y = 2.0f; struct A *q = &x[y].u; __builtin_memcpy (&q->x, &p.x, sizeof (float)); __builtin_memcpy (&q->y, &p.y, sizeof (float)); *q = p; float f = x[y].u.x + x[y].u.y; bar (&p); return f; } float f4 (struct B *x, int y) { struct A p; p.x = 1.0f; p.y = 2.0f; __builtin_memcpy (&x[y].u.x, &p.x, sizeof (float)); __builtin_memcpy (&x[y].u.y, &p.y, sizeof (float)); float f = x[y].u.x + x[y].u.y; bar (&p); return f; }