aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/cselib.c2
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/20020129-1.c51
4 files changed, 61 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 43d0413..629d1d8 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2002-01-29 Jakub Jelinek <jakub@redhat.com>
+
+ * cselib.c (cselib_record_sets): Use IF_THEN_ELSE result
+ in cselib_lookup.
+
2002-01-29 Aldy Hernandez <aldyh@redhat.com>
* rs6000.md ("*call_value_local32"): Remove constraints.
diff --git a/gcc/cselib.c b/gcc/cselib.c
index a3120d2..64eb8a5 100644
--- a/gcc/cselib.c
+++ b/gcc/cselib.c
@@ -1238,7 +1238,7 @@ cselib_record_sets (insn)
rtx src = sets[i].src;
if (cond)
src = gen_rtx_IF_THEN_ELSE (GET_MODE (src), cond, src, dest);
- sets[i].src_elt = cselib_lookup (sets[i].src, GET_MODE (dest), 1);
+ sets[i].src_elt = cselib_lookup (src, GET_MODE (dest), 1);
if (GET_CODE (dest) == MEM)
sets[i].dest_addr_elt = cselib_lookup (XEXP (dest, 0), Pmode, 1);
else
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index f6f413f..b3217f1 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2002-01-29 Jakub Jelinek <jakub@redhat.com>
+
+ * gcc.c-torture/execute/20020129-1.c: New test.
+
2002-01-29 Neil Booth <neil@daikokuya.demon.co.uk>
* gcc.c-torture/compile/20000224-1.c: Update.
diff --git a/gcc/testsuite/gcc.c-torture/execute/20020129-1.c b/gcc/testsuite/gcc.c-torture/execute/20020129-1.c
new file mode 100644
index 0000000..6430c4c
--- /dev/null
+++ b/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);
+}