/* This testcase failed at -O2 on IA-64, because scheduling did not take
   into account conditional execution when using cselib for alias
   analysis.  */

struct D {
    int d1;
    struct D *d2;
};
struct C {
    struct D c1;
    long c2, c3, c4, c5, c6;
};
struct A {
    struct A *a1;
    struct C *a2;
};
struct B {
    struct C b1;
    struct A *b2;
};

extern void abort(void);
extern void exit(int);

void foo(struct B *x, struct B *y) {
    if (x->b2 == 0) {
        struct A *a;

        x->b2 = a = y->b2;
        y->b2 = 0;
        for (; a; a = a->a1)
            a->a2 = &x->b1;
    }

    if (y->b2 != 0)
        abort();

    if (x->b1.c3 == -1) {
        x->b1.c3 = y->b1.c3;
        x->b1.c4 = y->b1.c4;
        y->b1.c3 = -1;
        y->b1.c4 = 0;
    }

    if (y->b1.c3 != -1)
        abort();
}

struct B x, y;

int main() {
    y.b1.c1.d1 = 6;
    y.b1.c3 = 145;
    y.b1.c4 = 2448;
    x.b1.c3 = -1;
    foo(&x, &y);
    exit(0);
}
