1 /* { dg-do compile } */
2 /* { dg-options "-O -fdump-tree-fre1" } */
3 
4 struct A { float x, y; };
5 struct B { struct A u; };
6 void bar (struct A *);
7 
8 float
f1(struct B * x,int y)9 f1 (struct B *x, int y)
10 {
11   struct A p;
12   p.x = 1.0f;
13   p.y = 2.0f;
14   struct A *q = &x[y].u;
15   *q = p;
16   float f = x[y].u.x + x[y].u.y;
17   bar (&p);
18   return f;
19 }
20 
21 float
f2(struct B * x,int y)22 f2 (struct B *x, int y)
23 {
24   struct A p;
25   p.x = 1.0f;
26   p.y = 2.0f;
27   x[y].u = p;
28   float f = x[y].u.x + x[y].u.y;
29   bar (&p);
30   return f;
31 }
32 
33 float
f3(struct B * x,int y)34 f3 (struct B *x, int y)
35 {
36   struct A p;
37   p.x = 1.0f;
38   p.y = 2.0f;
39   struct A *q = &x[y].u;
40   __builtin_memcpy (&q->x, &p.x, sizeof (float));
41   __builtin_memcpy (&q->y, &p.y, sizeof (float));
42   float f = x[y].u.x + x[y].u.y;
43   bar (&p);
44   return f;
45 }
46 
47 float
f4(struct B * x,int y)48 f4 (struct B *x, int y)
49 {
50   struct A p;
51   p.x = 1.0f;
52   p.y = 2.0f;
53   __builtin_memcpy (&x[y].u.x, &p.x, sizeof (float));
54   __builtin_memcpy (&x[y].u.y, &p.y, sizeof (float));
55   float f = x[y].u.x + x[y].u.y;
56   bar (&p);
57   return f;
58 }
59 
60 /* { dg-final { scan-tree-dump-times "return 3.0" 4 "fre1" } } */
61