aboutsummaryrefslogtreecommitdiff
path: root/gcc/expr.c
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2005-08-31 11:20:38 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2005-08-31 11:20:38 +0000
commitc52501398534057dfdd1bf212d43f351f62b69ab (patch)
treeb73794efd7f16530fac36ea823cb95636bbe0b36 /gcc/expr.c
parentef07d61bcbbfd3947beb3f66b2c2468a5a701722 (diff)
downloadgcc-c52501398534057dfdd1bf212d43f351f62b69ab.zip
gcc-c52501398534057dfdd1bf212d43f351f62b69ab.tar.gz
gcc-c52501398534057dfdd1bf212d43f351f62b69ab.tar.bz2
re PR middle-end/23477 (default-initializing array new expression uses makes stack usage go way up)
2005-08-31 Richard Guenther <rguenther@suse.de> PR middle-end/23477 * expr.c (all_zeros_p): New function. (expand_expr_real_1): Handle the case of an all-zero non-addressable constructor separately. From-SVN: r103670
Diffstat (limited to 'gcc/expr.c')
-rw-r--r--gcc/expr.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/gcc/expr.c b/gcc/expr.c
index e619808..e75d335 100644
--- a/gcc/expr.c
+++ b/gcc/expr.c
@@ -4645,6 +4645,24 @@ mostly_zeros_p (tree exp)
return initializer_zerop (exp);
}
+
+/* Return 1 if EXP contains all zeros. */
+
+static int
+all_zeros_p (tree exp)
+{
+ if (TREE_CODE (exp) == CONSTRUCTOR)
+
+ {
+ HOST_WIDE_INT nz_elts, nc_elts, count;
+ bool must_clear;
+
+ categorize_ctor_elements (exp, &nz_elts, &nc_elts, &count, &must_clear);
+ return nz_elts == 0;
+ }
+
+ return initializer_zerop (exp);
+}
/* Helper function for store_constructor.
TARGET, BITSIZE, BITPOS, MODE, EXP are as for store_field.
@@ -6843,6 +6861,19 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
return const0_rtx;
}
+ /* Try to avoid creating a temporary at all. This is possible
+ if all of the initializer is zero.
+ FIXME: try to handle all [0..255] initializers we can handle
+ with memset. */
+ else if (TREE_STATIC (exp)
+ && !TREE_ADDRESSABLE (exp)
+ && target != 0 && mode == BLKmode
+ && all_zeros_p (exp))
+ {
+ clear_storage (target, expr_size (exp), BLOCK_OP_NORMAL);
+ return target;
+ }
+
/* All elts simple constants => refer to a constant in memory. But
if this is a non-BLKmode mode, let it store a field at a time
since that should make a CONST_INT or CONST_DOUBLE when we