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