OSDN Git Service

PR optimization/12926
authorebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 13 Nov 2003 09:48:36 +0000 (09:48 +0000)
committerebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 13 Nov 2003 09:48:36 +0000 (09:48 +0000)
* expr.c (expand_assignment) [COMPONENT_REF]: Don't put
the UNCHANGING_RTX_P flag on memory references to read-only
components that are not addressable.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@73542 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/expr.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/opt/const3.C [new file with mode: 0644]

index 0844df5..8fcf0a1 100644 (file)
@@ -1,3 +1,10 @@
+2003-11-13  Eric Botcazou  <ebotcazou@libertysurf.fr>
+
+       PR optimization/12926
+       * expr.c (expand_assignment) [COMPONENT_REF]: Don't put
+       the UNCHANGING_RTX_P flag on memory references to read-only
+       components that are not addressable.
+
 2003-11-12  Kazu Hirata  <kazu@cs.umass.edu>
 
        * config/h8300/lib1funcs.asm (divmodsi4): Clear S0P in
index 347edb3..0dc9c9c 100644 (file)
@@ -3826,7 +3826,11 @@ expand_assignment (tree to, tree from, int want_value)
        }
 
       if (TREE_CODE (to) == COMPONENT_REF
-         && TREE_READONLY (TREE_OPERAND (to, 1)))
+         && TREE_READONLY (TREE_OPERAND (to, 1))
+         /* We can't assert that a MEM won't be set more than once
+            if the component is not addressable because another
+            non-addressable component may be referenced by the same MEM.  */
+         && ! (GET_CODE (to_rtx) == MEM && ! can_address_p (to)))
        {
          if (to_rtx == orig_to_rtx)
            to_rtx = copy_rtx (to_rtx);
index 51095cb..ba653cb 100644 (file)
@@ -1,3 +1,7 @@
+2003-11-13  Eric Botcazou  <ebotcazou@libertysurf.fr>
+
+       * g++.dg/opt/const3.C: New test.
+
 2003-11-13  Jan Hubicka  <jh@suse.cz>
 
        * gcc.c-torture/compile/20031112-1.c: New test.
diff --git a/gcc/testsuite/g++.dg/opt/const3.C b/gcc/testsuite/g++.dg/opt/const3.C
new file mode 100644 (file)
index 0000000..a3539ab
--- /dev/null
@@ -0,0 +1,44 @@
+// PR optimization/12926
+// This failed on SPARC64 because the assignments to the bit-fields
+// were wrongly swapped in the constructor.
+
+// { dg-do run }
+// { dg-options "-O2" }
+
+extern void abort(void);
+
+typedef __SIZE_TYPE__ size_t;
+
+void *my_out;
+
+struct A
+{
+  enum Type {P, U, S};
+
+  int foo1(void *, const char *);
+  int foo2(int, const Type);
+
+  A (const size_t size, const Type type): mSize(size), mType(type)
+  {
+      foo2(foo1(my_out, "type = "), type);
+      foo2(foo1(my_out, "mType = "), mType);
+  }
+
+  const size_t mSize : 8*sizeof(size_t) - 3;
+  Type mType : 2;
+};
+
+int i;
+
+int A::foo1(void *ios, const char *str) { }
+int A::foo2(int v, const Type t) { i=0; }
+
+int main()
+{
+  A testa(2, A::S);
+
+  if (testa.mType != A::S)
+     abort();
+
+  return 0;
+}