[PATCH][C++] Fix PR84281
Richard Biener
rguenther@suse.de
Fri Feb 9 12:45:00 GMT 2018
The following patch optimizes the equal element case of
cxx_eval_vec_init_1 to use a RANGE_EXPR in the built CONSTRUCTOR
instead of repeating the same element over and over. This
cuts down memory use of the invalid testcase in the PR from
tens of GB to nothing and makes us rejct it instantanously
instead of by going OOM.
Bootstrapped and tested on x86_64-unknown-linux-gnu.
Ok for trunk?
Thanks,
Richard.
2018-02-09 Richard Biener <rguenther@suse.de>
PR c++/84281
* constexpr.c (cxx_eval_vec_init_1): Use a RANGE_EXPR to compact
uniform constructors and delay allocating them fully.
Index: gcc/cp/constexpr.c
===================================================================
--- gcc/cp/constexpr.c (revision 257491)
+++ gcc/cp/constexpr.c (working copy)
@@ -2885,7 +2885,6 @@ cxx_eval_vec_init_1 (const constexpr_ctx
unsigned HOST_WIDE_INT max = tree_to_uhwi (array_type_nelts_top (atype));
verify_ctor_sanity (ctx, atype);
vec<constructor_elt, va_gc> **p = &CONSTRUCTOR_ELTS (ctx->ctor);
- vec_alloc (*p, max + 1);
bool pre_init = false;
unsigned HOST_WIDE_INT i;
@@ -2978,13 +2977,14 @@ cxx_eval_vec_init_1 (const constexpr_ctx
{
if (new_ctx.ctor != ctx->ctor)
eltinit = new_ctx.ctor;
- for (i = 1; i < max; ++i)
- {
- idx = build_int_cst (size_type_node, i);
- CONSTRUCTOR_APPEND_ELT (*p, idx, unshare_constructor (eltinit));
- }
+ tree range = build2 (RANGE_EXPR, size_type_node,
+ build_int_cst (size_type_node, 1),
+ build_int_cst (size_type_node, max - 1));
+ CONSTRUCTOR_APPEND_ELT (*p, range, unshare_constructor (eltinit));
break;
}
+ else
+ vec_safe_reserve (*p, max + 1);
}
if (!*non_constant_p)
More information about the Gcc-patches
mailing list