diff options
author | Jakub Jelinek <jakub@gcc.gnu.org> | 2002-03-11 11:12:03 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2002-03-11 11:12:03 +0100 |
commit | 5ddec02e71243ad4f96d11c58a280b42e7bc8b2e (patch) | |
tree | 3fadc6048890035b93cccf8a4ca247110f1f2e3f /gcc | |
parent | eb58b2086c89d50923bb5f921edaff964a6d0037 (diff) | |
download | gcc-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/ChangeLog | 1 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/20020310-1.c | 54 |
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); +} |