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. Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? 2025-01-21 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. --- gcc/c-family/c-common.h.jj 2025-01-17 11:29:33.139696380 +0100 +++ gcc/c-family/c-common.h 2025-01-21 09:30:09.520947570 +0100 @@ -1190,6 +1190,8 @@ extern vec<tree, va_gc> *make_tree_vecto 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, unsigned); 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> *); --- gcc/c-family/c-common.cc.jj 2025-01-20 18:00:35.667875671 +0100 +++ gcc/c-family/c-common.cc 2025-01-21 09:29:23.955582581 +0100 @@ -9010,33 +9010,46 @@ 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 the values of a CONSTRUCTOR. + nelts should be at least CONSTRUCTOR_NELTS (ctor) and v + should be initialized with make_tree_vector (); followed by + vec_safe_reserve (v, nelts); or equivalently vec_alloc (v, nelts); + optionally followed by pushes of other elements (up to + nelts - CONSTRUCTOR_NELTS (ctor)). */ vec<tree, va_gc> * -make_tree_vector_from_ctor (tree ctor) +append_ctor_to_tree_vector (vec<tree, va_gc> *v, tree ctor, unsigned nelts) { - vec<tree,va_gc> *ret = make_tree_vector (); - unsigned nelts = CONSTRUCTOR_NELTS (ctor); - vec_safe_reserve (ret, 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 (); + unsigned nelts = CONSTRUCTOR_NELTS (ctor); + vec_safe_reserve (ret, nelts); + return append_ctor_to_tree_vector (ret, ctor, nelts); } /* Get a new tree vector which is a copy of an existing one. */ --- gcc/cp/call.cc.jj 2025-01-21 09:11:58.214113697 +0100 +++ gcc/cp/call.cc 2025-01-21 09:32:29.382005137 +0100 @@ -4262,26 +4262,7 @@ add_list_candidates (tree fns, tree firs vec_alloc (new_args, nelts); 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, nelts); /* We aren't looking for list-ctors anymore. */ flags &= ~LOOKUP_LIST_ONLY; Jakub