This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[C++ PATCH] Use RANGE_EXPRs in build_vec_init (PR c++/82294, PR c++/87436)
- From: Jakub Jelinek <jakub at redhat dot com>
- To: Jason Merrill <jason at redhat dot com>
- Cc: gcc-patches at gcc dot gnu dot org
- Date: Fri, 14 Dec 2018 00:03:12 +0100
- Subject: [C++ PATCH] Use RANGE_EXPRs in build_vec_init (PR c++/82294, PR c++/87436)
- Reply-to: Jakub Jelinek <jakub at redhat dot com>
Hi!
The following patch makes use of RANGE_EXPRs in build_vec_init, instead of
appending many ctor elements.
E.g. on the PR87436 testcase the memory usage goes down from more than 5GB
to a few megabytes and compile time decreases significantly too.
Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
Testcases not included, see follow-up patch.
2018-12-13 Jakub Jelinek <jakub@redhat.com>
PR c++/82294
PR c++/87436
* init.c (build_vec_init): Change num_initialized_elts type from int
to HOST_WIDE_INT. Build a RANGE_EXPR if e needs to be repeated more
than once.
--- gcc/cp/init.c.jj 2018-11-13 09:49:33.150035688 +0100
+++ gcc/cp/init.c 2018-12-13 15:08:08.446783069 +0100
@@ -4104,7 +4104,7 @@ build_vec_init (tree base, tree maxindex
tree compound_stmt;
int destroy_temps;
tree try_block = NULL_TREE;
- int num_initialized_elts = 0;
+ HOST_WIDE_INT num_initialized_elts = 0;
bool is_global;
tree obase = base;
bool xvalue = false;
@@ -4539,10 +4539,13 @@ build_vec_init (tree base, tree maxindex
if (e)
{
- int max = tree_to_shwi (maxindex)+1;
- for (; num_initialized_elts < max; ++num_initialized_elts)
+ HOST_WIDE_INT last = tree_to_shwi (maxindex);
+ if (num_initialized_elts <= last)
{
tree field = size_int (num_initialized_elts);
+ if (num_initialized_elts != last)
+ field = build2 (RANGE_EXPR, sizetype, field,
+ size_int (last));
CONSTRUCTOR_APPEND_ELT (const_vec, field, e);
}
}
Jakub