1/* This testcase failed at -O2 on IA-64, because scheduling did not take
2   into account conditional execution when using cselib for alias
3   analysis.  */
4
5struct D { int d1; struct D *d2; };
6struct C { struct D c1; long c2, c3, c4, c5, c6; };
7struct A { struct A *a1; struct C *a2; };
8struct B { struct C b1; struct A *b2; };
9
10extern void abort (void);
11extern void exit (int);
12
13void
14foo (struct B *x, struct B *y)
15{
16  if (x->b2 == 0)
17    {
18      struct A *a;
19
20      x->b2 = a = y->b2;
21      y->b2 = 0;
22      for (; a; a = a->a1)
23	a->a2 = &x->b1;
24    }
25
26  if (y->b2 != 0)
27    abort ();
28
29  if (x->b1.c3 == -1)
30    {
31      x->b1.c3 = y->b1.c3;
32      x->b1.c4 = y->b1.c4;
33      y->b1.c3 = -1;
34      y->b1.c4 = 0;
35    }
36
37  if (y->b1.c3 != -1)
38    abort ();
39}
40
41struct B x, y;
42
43int main ()
44{
45  y.b1.c1.d1 = 6;
46  y.b1.c3 = 145;
47  y.b1.c4 = 2448;
48  x.b1.c3 = -1;
49  foo (&x, &y);
50  exit (0);
51}
52