This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[C++ PATCH] Use RANGE_EXPRs in build_vec_init (PR c++/82294, PR c++/87436)


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]