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);
 }

Reply via email to