> Am 13.12.2024 um 20:49 schrieb Robin Dapp <rdapp....@gmail.com>:
>
> Hi,
>
> in VMAT_STRIDED_SLP we're likely to select a different vectype with
> fewer elements for vector construction. After loading it is
> re-interpreted as the proper vectype.
> When checking costs we use the original vectype with more elements
> leading to wrong costing in case vector construction is dependent
> on the number of elements.
>
> This patch makes a temporary copy of stmt_info and slp_node, changes
> their vectype and passes them to record_stmt_cost in case we chose
> a different load/construction vectype.
>
> Bootstrapped and regtested on x86, aarch64 and power10.
> Regtested on rv64gcv.
Either this makes just a copy of the Pointer or it will end up with Stack vars
that got out of scope when recording costs later.
Iff you want to fix this now before re-architecting how we do costing then IMO
the only sensible way is by adding extra member to slp_tree indicating the
Element Type used.
Richard
> Regards
> Robin
>
> PR target/118019
>
> gcc/ChangeLog:
>
> * tree-vect-stmts.cc (vectorizable_load): Use construction/load
> vectype for costing.
> ---
> gcc/tree-vect-stmts.cc | 23 ++++++++++++++++++++---
> 1 file changed, 20 insertions(+), 3 deletions(-)
>
> diff --git a/gcc/tree-vect-stmts.cc b/gcc/tree-vect-stmts.cc
> index be1139a423c..6ac1e97c4c1 100644
> --- a/gcc/tree-vect-stmts.cc
> +++ b/gcc/tree-vect-stmts.cc
> @@ -10810,9 +10810,26 @@ vectorizable_load (vec_info *vinfo,
> if (nloads > 1)
> {
> if (costing_p)
> - inside_cost += record_stmt_cost (cost_vec, 1, vec_construct,
> - stmt_info, slp_node, 0,
> - vect_body);
> + {
> + if (lvectype != vectype)
> + {
> + /* If we chose a different vectype for vector
> + construction make sure to use it for costing. */
> + stmt_vec_info stmt_info_copy = stmt_info;
> + stmt_info_copy->vectype = lvectype;
> + slp_tree slp_node_copy = slp_node;
> + slp_node_copy->vectype = lvectype;
> + inside_cost
> + += record_stmt_cost (cost_vec, 1, vec_construct,
> + stmt_info_copy, slp_node_copy,
> + 0, vect_body);
> + }
> +
> + else
> + inside_cost += record_stmt_cost (cost_vec, 1, vec_construct,
> + stmt_info, slp_node, 0,
> + vect_body);
> + }
> else
> {
> tree vec_inv = build_constructor (lvectype, v);
> --
> 2.47.1
>