diff options
author | Jakub Jelinek <jakub@gcc.gnu.org> | 2003-12-03 23:40:58 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2003-12-03 23:40:58 +0100 |
commit | 8ecc63eb275e8f67a25c1606abb6ae7231ae724f (patch) | |
tree | 8ce0b0e15aa050323e8012a0063c5c522e24d2b1 | |
parent | 26d86d940ebeffe2e360292bbba54a7d6eb33ef5 (diff) | |
download | gcc-8ecc63eb275e8f67a25c1606abb6ae7231ae724f.zip gcc-8ecc63eb275e8f67a25c1606abb6ae7231ae724f.tar.gz gcc-8ecc63eb275e8f67a25c1606abb6ae7231ae724f.tar.bz2 |
expr.c (store_constructor): Only set RTX_UNCHANGING_P for read-only field if cleared is 0.
* expr.c (store_constructor): Only set RTX_UNCHANGING_P for
read-only field if cleared is 0.
* gcc.dg/20031202-1.c: New test.
From-SVN: r74251
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/expr.c | 5 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/20031202-1.c | 44 |
4 files changed, 59 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 444e903..fde381b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2003-12-03 Jakub Jelinek <jakub@redhat.com> + + * expr.c (store_constructor): Only set RTX_UNCHANGING_P for + read-only field if cleared is 0. + 2003-12-03 Nathanael Nerode <neroden@gcc.gnu.org> * config.gcc: Mark obsolete targets for GCC 3.4. @@ -4643,7 +4643,10 @@ store_constructor (tree exp, rtx target, int cleared, HOST_WIDE_INT size) highest_pow2_factor (offset)); } - if (TREE_READONLY (field)) + /* If the constructor has been cleared, setting RTX_UNCHANGING_P + on the MEM might lead to scheduling the clearing after the + store. */ + if (TREE_READONLY (field) && !cleared) { if (GET_CODE (to_rtx) == MEM) to_rtx = copy_rtx (to_rtx); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b6883f5..2a30f30 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2003-12-03 Jakub Jelinek <jakub@redhat.com> + + * gcc.dg/20031202-1.c: New test. + 2003-12-03 Mark Mitchell <mark@codesourcery.com> PR c++/10771 @@ -10,12 +14,12 @@ 2003-12-02 Giovanni Bajo <giovannibajo@gcc.gnu.org> - PR c++/10126
+ PR c++/10126 * g++.dg/template/ptrmem8.C: New test. 2003-12-02 Giovanni Bajo <giovannibajo@gcc.gnu.org> - PR c++/12573
+ PR c++/12573 * g++.dg/template/dependent-expr3.C: New test. 2003-12-01 James Lemke <jim@wasabisystems.com> diff --git a/gcc/testsuite/gcc.dg/20031202-1.c b/gcc/testsuite/gcc.dg/20031202-1.c new file mode 100644 index 0000000..424e01b --- /dev/null +++ b/gcc/testsuite/gcc.dg/20031202-1.c @@ -0,0 +1,44 @@ +/* { dg-do run } */ +/* { dg-options "-O2" } */ +/* { dg-options "-O2 -mtune=i686" { target i?86-*-* } } */ + +extern void abort (void); +extern void exit (int); + +struct A { char p[6]; } __attribute__((packed)); +struct B { + struct A a; + void * const b; + struct A const * const c; + struct A const *d; +}; + +char v; + +int __attribute__((noinline)) +foo (struct B *b) +{ + int i; + for (i = 0; i < 6; ++i) + if (b->a.p[i]) + abort (); + if (b->b != &v || b->c || b->d) + abort (); + return 12; +} + +int __attribute__((noinline)) +bar (void *x) +{ + __asm __volatile ("" : "=r" (x) : "0" (x)); + struct B y = { .b = x, .c = (void *) 0 }; + return foo (&y) + 1; +} + +int +main (void) +{ + if (bar (&v) != 13) + abort (); + exit (0); +} |