/* { dg-do compile } */ /* { dg-options "-O -fdump-tree-fre1" } */ 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)); 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; } /* { dg-final { scan-tree-dump-times "return 3.0" 4 "fre1" } } */