aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@gcc.gnu.org>2002-03-11 11:12:03 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2002-03-11 11:12:03 +0100
commit5ddec02e71243ad4f96d11c58a280b42e7bc8b2e (patch)
tree3fadc6048890035b93cccf8a4ca247110f1f2e3f /gcc
parenteb58b2086c89d50923bb5f921edaff964a6d0037 (diff)
downloadgcc-5ddec02e71243ad4f96d11c58a280b42e7bc8b2e.zip
gcc-5ddec02e71243ad4f96d11c58a280b42e7bc8b2e.tar.gz
gcc-5ddec02e71243ad4f96d11c58a280b42e7bc8b2e.tar.bz2
re PR rtl-optimization/5844 (Bad code generated for -O2 -mcpu=i586)
PR optimization/5844 * gcc.dg/20020310-1.c: New test. From-SVN: r50566
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog1
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/20020310-1.c54
3 files changed, 60 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index fb929572..6f6d9f2 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -283,6 +283,7 @@ Thu Mar 7 16:33:54 CET 2002 Jan Hubicka <jh@suse.cz>
2002-03-06 Richard Henderson <rth@redhat.com>
+ PR optimization/5844
* genemit.c (gen_exp): New argument used. Invoke copy_rtx
if used indicates we've already emitted one copy of an operand.
(gen_insn, gen_expand, output_add_clobbers): Supply a null used.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 0ea067c..2b54188 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2002-03-11 Jakub Jelinek <jakub@redhat.com>
+
+ PR optimization/5844
+ * gcc.dg/20020310-1.c: New test.
+
2002-03-09 Michael Meissner <meissner@redhat.com>
* gcc.c-torture/execute/memcpy-2.c: New test.
diff --git a/gcc/testsuite/gcc.dg/20020310-1.c b/gcc/testsuite/gcc.dg/20020310-1.c
new file mode 100644
index 0000000..ec722ec
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/20020310-1.c
@@ -0,0 +1,54 @@
+/* PR optimization/5844
+ This testcase was miscompiled because of an rtx sharing bug. */
+/* { dg-do run } */
+/* { dg-options "-O2" } */
+/* { dg-options "-O2 -mcpu=i586" { target i?86-*-* } } */
+
+struct A
+{
+ struct A *a;
+ int b;
+};
+
+struct B
+{
+ struct A *c;
+ unsigned int d;
+};
+
+struct A p = { &p, -1 };
+struct B q = { &p, 0 };
+
+extern void abort (void);
+extern void exit (int);
+
+struct B *
+foo (void)
+{
+ return &q;
+}
+
+void
+bar (void)
+{
+ struct B *e = foo ();
+ struct A *f = e->c;
+ int g = f->b;
+
+ if (++g == 0)
+ {
+ e->d++;
+ e->c = f->a;
+ }
+
+ f->b = g;
+}
+
+int
+main ()
+{
+ bar ();
+ if (p.b != 0 || q.d != 1 || q.c != &p)
+ abort ();
+ exit (0);
+}