re PR tree-optimization/40081 (verify_stmts failed with -O2)
authorRichard Guenther <rguenther@suse.de>
Sun, 10 May 2009 10:16:01 +0000 (10:16 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Sun, 10 May 2009 10:16:01 +0000 (10:16 +0000)
2009-05-10  Richard Guenther  <rguenther@suse.de>

PR tree-optimization/40081
* tree-sra.c (instantiate_element): Instantiate scalar replacements
using the main variant of the element type.  Do not fiddle with
TREE_THIS_VOLATILE or TREE_SIDE_EFFECTS.

* g++.dg/torture/pr40081.C: New testcase.

From-SVN: r147330

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/torture/pr40081.C [new file with mode: 0644]
gcc/tree-sra.c

index 73de4f377f0e54b80d8315042723ba511b7691af..0752599ece0ef794b34d0d2f897ff9e3def36eca 100644 (file)
@@ -1,3 +1,10 @@
+2009-05-10  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/40081
+       * tree-sra.c (instantiate_element): Instantiate scalar replacements
+       using the main variant of the element type.  Do not fiddle with
+       TREE_THIS_VOLATILE or TREE_SIDE_EFFECTS.
+
 2009-05-09  Jan Hubicka  <jh@suse.cz>
 
        PR middle-end/40080
index f8d5d3af1196291603d03f85c1bc0af38c2ca94d..e875a6682d4d5472d221dc2d4237ebfaf6a932c8 100644 (file)
@@ -1,3 +1,8 @@
+2009-05-10  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/40081
+       * g++.dg/torture/pr40081.C: New testcase.
+
 2009-05-10  Paul Thomas  <pault@gcc.gnu.org>
 
        PR fortran/38863
diff --git a/gcc/testsuite/g++.dg/torture/pr40081.C b/gcc/testsuite/g++.dg/torture/pr40081.C
new file mode 100644 (file)
index 0000000..e65c5a8
--- /dev/null
@@ -0,0 +1,16 @@
+struct Atomic_t {
+    Atomic_t(int i) : val(i) { }
+    volatile int val;
+};
+class RefCount {
+public:
+    RefCount(Atomic_t c) : m_count(c)  { }
+    Atomic_t m_count;
+};
+class IntrusiveCountableBase {
+    RefCount m_useCount;
+protected:
+    IntrusiveCountableBase();
+};
+IntrusiveCountableBase::IntrusiveCountableBase() : m_useCount(0)  { }
+
index ff8a7399459be11580918ffc60a05f95b43f09d9..037052053197e855be015ec623ef4d8219a7d7fb 100644 (file)
@@ -1277,7 +1277,8 @@ instantiate_element (struct sra_elt *elt)
       nowarn = TREE_NO_WARNING (base_elt->parent->element);
   base = base_elt->element;
 
-  elt->replacement = var = make_rename_temp (elt->type, "SR");
+  elt->replacement = var = make_rename_temp (TYPE_MAIN_VARIANT (elt->type),
+                                            "SR");
 
   if (DECL_P (elt->element)
       && !tree_int_cst_equal (DECL_SIZE (var), DECL_SIZE (elt->element)))
@@ -1286,7 +1287,8 @@ instantiate_element (struct sra_elt *elt)
       DECL_SIZE_UNIT (var) = DECL_SIZE_UNIT (elt->element);
 
       elt->in_bitfld_block = 1;
-      elt->replacement = fold_build3 (BIT_FIELD_REF, elt->type, var,
+      elt->replacement = fold_build3 (BIT_FIELD_REF,
+                                     TYPE_MAIN_VARIANT (elt->type), var,
                                      DECL_SIZE (var),
                                      BYTES_BIG_ENDIAN
                                      ? size_binop (MINUS_EXPR,
@@ -1303,12 +1305,6 @@ instantiate_element (struct sra_elt *elt)
   DECL_SOURCE_LOCATION (var) = DECL_SOURCE_LOCATION (base);
   DECL_ARTIFICIAL (var) = 1;
 
-  if (TREE_THIS_VOLATILE (elt->type))
-    {
-      TREE_THIS_VOLATILE (var) = 1;
-      TREE_SIDE_EFFECTS (var) = 1;
-    }
-
   if (DECL_NAME (base) && !DECL_IGNORED_P (base))
     {
       char *pretty_name = build_element_name (elt);