[PATCH RFC] c-family: don't cache large vecs

Jason Merrill jason@redhat.com
Tue Nov 16 16:53:14 GMT 2021


Patrick observed recently that an element of the vector cache could be
arbitrarily large.  Let's only cache relatively small vecs.

This has no effect on compiling the libstdc++ stdc++.h, presumably because
nothing in the library requires a vec that large.  I figure that this makes it
more likely that a subsequent long list will reuse the same memory when the
later vec gets expanded.

Does this make sense to others?

gcc/c-family/ChangeLog:

	* c-common.c (release_tree_vector): Only cache vecs smaller than
	16 elements.
---
 gcc/c-family/c-common.c | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c
index 436df45df68..90e8ec87b6b 100644
--- a/gcc/c-family/c-common.c
+++ b/gcc/c-family/c-common.c
@@ -8213,8 +8213,16 @@ release_tree_vector (vec<tree, va_gc> *vec)
 {
   if (vec != NULL)
     {
-      vec->truncate (0);
-      vec_safe_push (tree_vector_cache, vec);
+      if (vec->allocated () >= 16)
+	/* Don't cache vecs that have expanded more than once.  On a p64
+	   target, vecs double in alloc size with each power of 2 elements, e.g
+	   at 16 elements the alloc increases from 128 to 256 bytes.  */
+	vec_free (vec);
+      else
+	{
+	  vec->truncate (0);
+	  vec_safe_push (tree_vector_cache, vec);
+	}
     }
 }
 

base-commit: 132f1c27770fa6dafdf14591878d301aedd5ae16
-- 
2.27.0



More information about the Gcc-patches mailing list