aboutsummaryrefslogtreecommitdiffstats
path: root/gcc-4.9/gcc/testsuite/gcc.c-torture/execute/20020129-1.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc-4.9/gcc/testsuite/gcc.c-torture/execute/20020129-1.c')
-rw-r--r--gcc-4.9/gcc/testsuite/gcc.c-torture/execute/20020129-1.c51
1 files changed, 51 insertions, 0 deletions
diff --git a/gcc-4.9/gcc/testsuite/gcc.c-torture/execute/20020129-1.c b/gcc-4.9/gcc/testsuite/gcc.c-torture/execute/20020129-1.c
new file mode 100644
index 000000000..6430c4c1c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/gcc.c-torture/execute/20020129-1.c
@@ -0,0 +1,51 @@
+/* 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);
+}