https://gcc.gnu.org/g:1c402757ca18d91b8979b5ba634fc945dbb8b94b
commit r15-7119-g1c402757ca18d91b8979b5ba634fc945dbb8b94b
Author: Jakub Jelinek <ja...@redhat.com>
Date:   Wed Jan 22 09:22:56 2025 +0100

    c++: Introduce append_ctor_to_tree_vector
    
    On Mon, Jan 20, 2025 at 05:14:33PM -0500, Jason Merrill wrote:
    > > --- gcc/cp/call.cc.jj       2025-01-15 18:24:36.135503866 +0100
    > > +++ gcc/cp/call.cc  2025-01-17 14:42:38.201643385 +0100
    > > @@ -4258,11 +4258,30 @@ add_list_candidates (tree fns, tree firs
    > >     /* Expand the CONSTRUCTOR into a new argument vec.  */
    >
    > Maybe we could factor out a function called something like
    > append_ctor_to_tree_vector from the common code between this and
    > make_tree_vector_from_ctor?
    >
    > But this is OK as is if you don't want to pursue that.
    
    I had the previous patch already tested and wanted to avoid delaying
    the large initializer speedup re-reversion any further, so I've committed
    the patch as is.
    
    Here is an incremental patch to factor that out.
    
    2025-01-22  Jakub Jelinek  <ja...@redhat.com>
    
    gcc/c-family/
            * c-common.h (append_ctor_to_tree_vector): Declare.
            * c-common.cc (append_ctor_to_tree_vector): New function.
            (make_tree_vector_from_ctor): Use it.
    gcc/cp/
            * call.cc (add_list_candidates): Use append_ctor_to_tree_vector.

Diff:
---
 gcc/c-family/c-common.cc | 33 +++++++++++++++++++++------------
 gcc/c-family/c-common.h  |  2 ++
 gcc/cp/call.cc           | 24 ++----------------------
 3 files changed, 25 insertions(+), 34 deletions(-)

diff --git a/gcc/c-family/c-common.cc b/gcc/c-family/c-common.cc
index 91d90725152a..c193eb2c463a 100644
--- a/gcc/c-family/c-common.cc
+++ b/gcc/c-family/c-common.cc
@@ -9010,33 +9010,42 @@ make_tree_vector_from_list (tree list)
   return ret;
 }
 
-/* Get a new tree vector of the values of a CONSTRUCTOR.  */
+/* Append to a tree vector V the values of a CONSTRUCTOR CTOR
+   and return the new possibly reallocated vector.  */
 
 vec<tree, va_gc> *
-make_tree_vector_from_ctor (tree ctor)
+append_ctor_to_tree_vector (vec<tree, va_gc> *v, tree ctor)
 {
-  vec<tree,va_gc> *ret = make_tree_vector ();
-  unsigned nelts = CONSTRUCTOR_NELTS (ctor);
-  vec_safe_reserve (ret, CONSTRUCTOR_NELTS (ctor));
+  unsigned nelts = vec_safe_length (v) + CONSTRUCTOR_NELTS (ctor);
+  vec_safe_reserve (v, CONSTRUCTOR_NELTS (ctor));
   for (unsigned i = 0; i < CONSTRUCTOR_NELTS (ctor); ++i)
     if (TREE_CODE (CONSTRUCTOR_ELT (ctor, i)->value) == RAW_DATA_CST)
       {
        tree raw_data = CONSTRUCTOR_ELT (ctor, i)->value;
        nelts += RAW_DATA_LENGTH (raw_data) - 1;
-       vec_safe_reserve (ret, nelts - ret->length ());
+       vec_safe_reserve (v, nelts - v->length ());
        if (TYPE_PRECISION (TREE_TYPE (raw_data)) > CHAR_BIT
            || TYPE_UNSIGNED (TREE_TYPE (raw_data)))
          for (unsigned j = 0; j < (unsigned) RAW_DATA_LENGTH (raw_data); ++j)
-           ret->quick_push (build_int_cst (TREE_TYPE (raw_data),
-                                           RAW_DATA_UCHAR_ELT (raw_data, j)));
+           v->quick_push (build_int_cst (TREE_TYPE (raw_data),
+                                         RAW_DATA_UCHAR_ELT (raw_data, j)));
        else
          for (unsigned j = 0; j < (unsigned) RAW_DATA_LENGTH (raw_data); ++j)
-           ret->quick_push (build_int_cst (TREE_TYPE (raw_data),
-                                           RAW_DATA_SCHAR_ELT (raw_data, j)));
+           v->quick_push (build_int_cst (TREE_TYPE (raw_data),
+                                         RAW_DATA_SCHAR_ELT (raw_data, j)));
       }
     else
-      ret->quick_push (CONSTRUCTOR_ELT (ctor, i)->value);
-  return ret;
+      v->quick_push (CONSTRUCTOR_ELT (ctor, i)->value);
+  return v;
+}
+
+/* Get a new tree vector of the values of a CONSTRUCTOR.  */
+
+vec<tree, va_gc> *
+make_tree_vector_from_ctor (tree ctor)
+{
+  vec<tree,va_gc> *ret = make_tree_vector ();
+  return append_ctor_to_tree_vector (ret, ctor);
 }
 
 /* Get a new tree vector which is a copy of an existing one.  */
diff --git a/gcc/c-family/c-common.h b/gcc/c-family/c-common.h
index 94b1d2d2b496..c5eb11d85fd5 100644
--- a/gcc/c-family/c-common.h
+++ b/gcc/c-family/c-common.h
@@ -1190,6 +1190,8 @@ extern vec<tree, va_gc> *make_tree_vector (void);
 extern void release_tree_vector (vec<tree, va_gc> *);
 extern vec<tree, va_gc> *make_tree_vector_single (tree);
 extern vec<tree, va_gc> *make_tree_vector_from_list (tree);
+extern vec<tree, va_gc> *append_ctor_to_tree_vector (vec<tree, va_gc> *,
+                                                    tree);
 extern vec<tree, va_gc> *make_tree_vector_from_ctor (tree);
 extern vec<tree, va_gc> *make_tree_vector_copy (const vec<tree, va_gc> *);
 
diff --git a/gcc/cp/call.cc b/gcc/cp/call.cc
index 80015dfe9da6..469af83ccbfd 100644
--- a/gcc/cp/call.cc
+++ b/gcc/cp/call.cc
@@ -4258,30 +4258,10 @@ add_list_candidates (tree fns, tree first_arg,
 
   /* Expand the CONSTRUCTOR into a new argument vec.  */
   vec<tree, va_gc> *new_args;
-  unsigned nelts = nart + CONSTRUCTOR_NELTS (init_list);
-  vec_alloc (new_args, nelts);
+  vec_alloc (new_args, nart + CONSTRUCTOR_NELTS (init_list));
   for (unsigned i = 0; i < nart; ++i)
     new_args->quick_push ((*args)[i]);
-  for (unsigned i = 0; i < CONSTRUCTOR_NELTS (init_list); ++i)
-    if (TREE_CODE (CONSTRUCTOR_ELT (init_list, i)->value) == RAW_DATA_CST)
-      {
-       tree raw_data = CONSTRUCTOR_ELT (init_list, i)->value;
-       nelts += RAW_DATA_LENGTH (raw_data) - 1;
-       vec_safe_reserve (new_args, nelts - new_args->length ());
-       if (TYPE_PRECISION (TREE_TYPE (raw_data)) > CHAR_BIT
-           || TYPE_UNSIGNED (TREE_TYPE (raw_data)))
-         for (unsigned j = 0; j < (unsigned) RAW_DATA_LENGTH (raw_data); ++j)
-           new_args->quick_push (build_int_cst (TREE_TYPE (raw_data),
-                                                RAW_DATA_UCHAR_ELT (raw_data,
-                                                                    j)));
-       else
-         for (unsigned j = 0; j < (unsigned) RAW_DATA_LENGTH (raw_data); ++j)
-           new_args->quick_push (build_int_cst (TREE_TYPE (raw_data),
-                                                RAW_DATA_SCHAR_ELT (raw_data,
-                                                                    j)));
-      }
-    else
-      new_args->quick_push (CONSTRUCTOR_ELT (init_list, i)->value);
+  new_args = append_ctor_to_tree_vector (new_args, init_list);
 
   /* We aren't looking for list-ctors anymore.  */
   flags &= ~LOOKUP_LIST_ONLY;

Reply via email to