https://gcc.gnu.org/g:4ce9e35396205ee1674658a9b844ccdf80044378
commit r15-7168-g4ce9e35396205ee1674658a9b844ccdf80044378 Author: Jakub Jelinek <ja...@redhat.com> Date: Thu Jan 23 23:06:07 2025 +0100 c++: Small make_tree_vector_from_ctor improvement After committing the append_ctor_to_tree_vector patch, I've realized that for the larger constructors make_tree_vector_from_ctor unnecessarily wastes one GC vector; make_tree_vector () / release_tree_vector () only caches GC vectors from 4 to 16 allocated tree elements, so in the likely case of a rather small ctor using make_tree_vector () can be beneficial, we can pick something from the cache and if we don't need it later, pt.cc calls release_tree_vector on it to return it back to the cache. But for the larger ctors, we just eat one vector from the cache, never use it (because the vec_safe_reserve will immediately allocate a different vector) and never return it back to the cache. So, the following patch passes NULL for the larger vectors, which append_ctor_to_tree_vector handles just fine now (vec_safe_reserve will just allocate appropriately sized vector). 2025-01-23 Jakub Jelinek <ja...@redhat.com> * c-common.cc (make_tree_vector_from_ctor): Only use make_tree_vector for ctors with <= 16 elements. Diff: --- gcc/c-family/c-common.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gcc/c-family/c-common.cc b/gcc/c-family/c-common.cc index c193eb2c463a..49508fe9ee60 100644 --- a/gcc/c-family/c-common.cc +++ b/gcc/c-family/c-common.cc @@ -9044,7 +9044,8 @@ append_ctor_to_tree_vector (vec<tree, va_gc> *v, tree ctor) vec<tree, va_gc> * make_tree_vector_from_ctor (tree ctor) { - vec<tree,va_gc> *ret = make_tree_vector (); + vec<tree,va_gc> *ret + = CONSTRUCTOR_NELTS (ctor) <= 16 ? make_tree_vector () : NULL; return append_ctor_to_tree_vector (ret, ctor); }