1 /* PR tree-optimization/51877 */
2 
3 extern void abort (void);
4 struct A { int a; char b[32]; } a, b;
5 
6 __attribute__((noinline, noclone))
7 struct A
bar(int x)8 bar (int x)
9 {
10   struct A r;
11   static int n;
12   r.a = ++n;
13   __builtin_memset (r.b, 0, sizeof (r.b));
14   r.b[0] = x;
15   return r;
16 }
17 
18 __attribute__((noinline, noclone))
19 void
baz(void)20 baz (void)
21 {
22   asm volatile ("" : : : "memory");
23 }
24 
25 __attribute__((noinline, noclone))
26 void
foo(struct A * x,int y)27 foo (struct A *x, int y)
28 {
29   if (y == 6)
30     a = bar (7);
31   else
32     *x = bar (7);
33   baz ();
34 }
35 
36 int
main()37 main ()
38 {
39   a = bar (3);
40   b = bar (4);
41   if (a.a != 1 || a.b[0] != 3 || b.a != 2 || b.b[0] != 4)
42     abort ();
43   foo (&b, 0);
44   if (a.a != 1 || a.b[0] != 3 || b.a != 3 || b.b[0] != 7)
45     abort ();
46   foo (&b, 6);
47   if (a.a != 4 || a.b[0] != 7 || b.a != 3 || b.b[0] != 7)
48     abort ();
49   return 0;
50 }
51