aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2008-12-09 01:04:50 -0500
committerJason Merrill <jason@gcc.gnu.org>2008-12-09 01:04:50 -0500
commitc69c7be10b82d76d6b3d8daf88d9e7a05278bdda (patch)
tree3f57073523259bbf324791a19922b2e0b03088dd /gcc
parentc6c2b18db9626c66d5b86e9aeb315be3d81774bb (diff)
downloadgcc-c69c7be10b82d76d6b3d8daf88d9e7a05278bdda.zip
gcc-c69c7be10b82d76d6b3d8daf88d9e7a05278bdda.tar.gz
gcc-c69c7be10b82d76d6b3d8daf88d9e7a05278bdda.tar.bz2
re PR c++/38410 (g++.dg/eh/crossjump1.C (internal compiler error))
PR c++/38410 * gimplify.c (gimplify_init_constructor): Don't write out a static copy of the CONSTRUCTOR for TREE_ADDRESSABLE types or small sparse initializers. From-SVN: r142580
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/gimplify.c13
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/ctor1.c10
4 files changed, 31 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index c43bbde..a8b338f 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2008-12-09 Jason Merrill <jason@redhat.com>
+
+ PR c++/38410
+ * gimplify.c (gimplify_init_constructor): Don't write out a static
+ copy of the CONSTRUCTOR for TREE_ADDRESSABLE types or small sparse
+ initializers.
+
2008-12-09 Tobias Grosser <grosser@fim.uni-passau.de>
PR middle-end/38084
diff --git a/gcc/gimplify.c b/gcc/gimplify.c
index 2fea882..01b2fbe 100644
--- a/gcc/gimplify.c
+++ b/gcc/gimplify.c
@@ -3502,7 +3502,7 @@ gimplify_init_constructor (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
struct gimplify_init_ctor_preeval_data preeval_data;
HOST_WIDE_INT num_type_elements, num_ctor_elements;
HOST_WIDE_INT num_nonzero_elements;
- bool cleared, valid_const_initializer;
+ bool cleared, valid_const_initializer, sparse;
/* Aggregate types must lower constructors to initialization of
individual elements. The exception is that a CONSTRUCTOR node
@@ -3558,6 +3558,9 @@ gimplify_init_constructor (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
num_type_elements = count_type_elements (type, true);
+ /* Are there significantly more zeros than non-zeros? */
+ sparse = (num_nonzero_elements <= num_type_elements/4);
+
/* If count_type_elements could not determine number of type elements
for a constant-sized object, assume clearing is needed.
Don't do this for variable-sized objects, as store_constructor
@@ -3567,7 +3570,7 @@ gimplify_init_constructor (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
/* If there are "lots" of zeros, then block clear the object first. */
else if (num_type_elements - num_nonzero_elements
> CLEAR_RATIO (optimize_function_for_speed_p (cfun))
- && num_nonzero_elements < num_type_elements/4)
+ && sparse)
cleared = true;
/* ??? This bit ought not be needed. For any element not present
in the initializer, we should simply set them to zero. Except
@@ -3582,8 +3585,10 @@ gimplify_init_constructor (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
be dropped to memory, and then memcpy'd out. Don't do this
for sparse arrays, though, as it's more efficient to follow
the standard CONSTRUCTOR behavior of memset followed by
- individual element initialization. */
- if (valid_const_initializer && !cleared)
+ individual element initialization. Also don't try to do
+ bitwise copies of TREE_ADDRESSABLE types. */
+ if (valid_const_initializer && !(cleared || sparse)
+ && !TREE_ADDRESSABLE (type))
{
HOST_WIDE_INT size = int_size_in_bytes (type);
unsigned int align;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 57a14fc..07c5eb0 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2008-12-08 Jason Merrill <jason@redhat.com>
+
+ PR c++/38410
+ * gcc.dg/ctor1.c: New test.
+
2008-12-08 Uros Bizjak <ubizjak@gmail.com>
* gcc.target/mips/fix-r10000-6.c: Add dg-message to look for
diff --git a/gcc/testsuite/gcc.dg/ctor1.c b/gcc/testsuite/gcc.dg/ctor1.c
new file mode 100644
index 0000000..6c1cd72
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/ctor1.c
@@ -0,0 +1,10 @@
+/* Related to PR c++/38410.
+ We shouldn't write out a static variable for an all-zero aggregate
+ initializer. The variable named C.0 was created by
+ gimplify_init_constructor. */
+/* { dg-final { scan-assembler-not "C\\.0" } } */
+
+int main()
+{
+ int a[] = { 0,0 };
+}