aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@gcc.gnu.org>2003-12-03 23:40:58 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2003-12-03 23:40:58 +0100
commit8ecc63eb275e8f67a25c1606abb6ae7231ae724f (patch)
tree8ce0b0e15aa050323e8012a0063c5c522e24d2b1
parent26d86d940ebeffe2e360292bbba54a7d6eb33ef5 (diff)
downloadgcc-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/ChangeLog5
-rw-r--r--gcc/expr.c5
-rw-r--r--gcc/testsuite/ChangeLog8
-rw-r--r--gcc/testsuite/gcc.dg/20031202-1.c44
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.
diff --git a/gcc/expr.c b/gcc/expr.c
index c013785..2f58cd2 100644
--- a/gcc/expr.c
+++ b/gcc/expr.c
@@ -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);
+}