diff options
author | Josh Conner <jconner@apple.com> | 2005-06-01 21:34:27 +0000 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 2005-06-01 14:34:27 -0700 |
commit | cce7074710fc4712506c58a183034e53b87262fa (patch) | |
tree | 4cd171969e80360cd12c1c99748d1ceb8a5c5763 | |
parent | 03569a404774d982edf655c0bc8a3616ed3d1f3c (diff) | |
download | gcc-cce7074710fc4712506c58a183034e53b87262fa.zip gcc-cce7074710fc4712506c58a183034e53b87262fa.tar.gz gcc-cce7074710fc4712506c58a183034e53b87262fa.tar.bz2 |
re PR middle-end/21478 (Improve initialization of sparse local arrays)
PR 21478
* gimplify.c (gimplify_init_constructor): Don't spill initializer
to read-only memory if it's sparse.
From-SVN: r100465
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/gimplify.c | 51 |
2 files changed, 33 insertions, 24 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9696305..1531a27 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2005-06-01 Josh Conner <jconner@apple.com> + + PR 21478 + * gimplify.c (gimplify_init_constructor): Don't spill initializer + to read-only memory if it's sparse. + 2005-06-01 Ramana Radhakrishnan <ramana@codito.com> * doc/rtl.texi: Remove references to NOTE_INSN_SETJMP. diff --git a/gcc/gimplify.c b/gcc/gimplify.c index 853ff9d..a659e77 100644 --- a/gcc/gimplify.c +++ b/gcc/gimplify.c @@ -2649,10 +2649,35 @@ gimplify_init_constructor (tree *expr_p, tree *pre_p, break; } + /* If there are "lots" of initialized elements, even discounting + those that are not address constants (and thus *must* be + computed at runtime), then partition the constructor into + constant and non-constant parts. Block copy the constant + parts in, then generate code for the non-constant parts. */ + /* TODO. There's code in cp/typeck.c to do this. */ + + num_type_elements = count_type_elements (TREE_TYPE (ctor)); + + /* If there are "lots" of zeros, then block clear the object first. */ + if (num_type_elements - num_nonzero_elements > CLEAR_RATIO + && num_nonzero_elements < num_type_elements/4) + cleared = true; + + /* ??? This bit ought not be needed. For any element not present + in the initializer, we should simply set them to zero. Except + we'd need to *find* the elements that are not present, and that + requires trickery to avoid quadratic compile-time behavior in + large cases or excessive memory use in small cases. */ + else if (num_ctor_elements < num_type_elements) + cleared = true; + /* If there are "lots" of initialized elements, and all of them are valid address constants, then the entire initializer can - be dropped to memory, and then memcpy'd out. */ - if (num_nonconstant_elements == 0) + 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 (num_nonconstant_elements == 0 && !cleared) { HOST_WIDE_INT size = int_size_in_bytes (type); unsigned int align; @@ -2698,28 +2723,6 @@ gimplify_init_constructor (tree *expr_p, tree *pre_p, } } - /* If there are "lots" of initialized elements, even discounting - those that are not address constants (and thus *must* be - computed at runtime), then partition the constructor into - constant and non-constant parts. Block copy the constant - parts in, then generate code for the non-constant parts. */ - /* TODO. There's code in cp/typeck.c to do this. */ - - num_type_elements = count_type_elements (TREE_TYPE (ctor)); - - /* If there are "lots" of zeros, then block clear the object first. */ - if (num_type_elements - num_nonzero_elements > CLEAR_RATIO - && num_nonzero_elements < num_type_elements/4) - cleared = true; - - /* ??? This bit ought not be needed. For any element not present - in the initializer, we should simply set them to zero. Except - we'd need to *find* the elements that are not present, and that - requires trickery to avoid quadratic compile-time behavior in - large cases or excessive memory use in small cases. */ - else if (num_ctor_elements < num_type_elements) - cleared = true; - if (cleared) { /* Zap the CONSTRUCTOR element list, which simplifies this case. |