cselib.c (cselib_record_sets): Use IF_THEN_ELSE result in cselib_lookup.
authorJakub Jelinek <jakub@redhat.com>
Tue, 29 Jan 2002 23:15:24 +0000 (00:15 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 29 Jan 2002 23:15:24 +0000 (00:15 +0100)
* cselib.c (cselib_record_sets): Use IF_THEN_ELSE result
in cselib_lookup.

* gcc.c-torture/execute/20020129-1.c: New test.

From-SVN: r49333

gcc/ChangeLog
gcc/cselib.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/execute/20020129-1.c [new file with mode: 0644]

index 43d0413..629d1d8 100644 (file)
@@ -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.
index a3120d2..64eb8a5 100644 (file)
@@ -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
index f6f413f..b3217f1 100644 (file)
@@ -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 (file)
index 0000000..6430c4c
--- /dev/null
@@ -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);
+}