1 /* PR target/65956 */
2 
3 struct A { char *a; int b; long long c; };
4 char v[3];
5 
6 __attribute__((noinline, noclone)) void
fn1(char * x,char * y)7 fn1 (char *x, char *y)
8 {
9   if (x != &v[1] || y != &v[2])
10     __builtin_abort ();
11   v[1]++;
12 }
13 
14 __attribute__((noinline, noclone)) int
fn2(char * x)15 fn2 (char *x)
16 {
17   asm volatile ("" : "+g" (x) : : "memory");
18   return x == &v[0];
19 }
20 
21 __attribute__((noinline, noclone)) void
fn3(const char * x)22 fn3 (const char *x)
23 {
24   if (x[0] != 0)
25     __builtin_abort ();
26 }
27 
28 static struct A
foo(const char * x,struct A y,struct A z)29 foo (const char *x, struct A y, struct A z)
30 {
31   struct A r = { 0, 0, 0 };
32   if (y.b && z.b)
33     {
34       if (fn2 (y.a) && fn2 (z.a))
35 	switch (x[0])
36 	  {
37 	  case '|':
38 	    break;
39 	  default:
40 	    fn3 (x);
41 	  }
42       fn1 (y.a, z.a);
43     }
44   return r;
45 }
46 
47 __attribute__((noinline, noclone)) int
bar(int x,struct A * y)48 bar (int x, struct A *y)
49 {
50   switch (x)
51     {
52     case 219:
53       foo ("+", y[-2], y[0]);
54     case 220:
55       foo ("-", y[-2], y[0]);
56     }
57 }
58 
59 int
main()60 main ()
61 {
62   struct A a[3] = { { &v[1], 1, 1LL }, { &v[0], 0, 0LL }, { &v[2], 2, 2LL } };
63   bar (220, a + 2);
64   if (v[1] != 1)
65     __builtin_abort ();
66   return 0;
67 }
68