> -----Original Message-----
> From: Richard Biener <[email protected]>
> Sent: Tuesday, June 16, 2026 10:00 PM
> To: [email protected]
> Cc: Liu, Hongtao <[email protected]>
> Subject: [PATCH 3/3] [x86] use recorded vector composition type for costing
> 
> We're making vector construction extra costly but too much because we up to
> now do not know the actual vector composition type used.  This makes use of
> this now available information.
> 
> Bootstrapped and tested on x86_64-unknown-linux-gnu.
> 
> OK?
> 
> Thanks,
> Richard.
> 
>       * config/i386/i386.cc (ix86_vector_costs::add_stmt_cost):
>       Use vector construction scaling also for mult-lane
>       VMAT_STRIDED_SLP but use vector composition type recorded
>       to avoid excessive over-costing.
> ---
>  gcc/config/i386/i386.cc | 13 +++++++++----
>  1 file changed, 9 insertions(+), 4 deletions(-)
> 
> diff --git a/gcc/config/i386/i386.cc b/gcc/config/i386/i386.cc index
> bd0ecfddbbc..4aa57f08dce 100644
> --- a/gcc/config/i386/i386.cc
> +++ b/gcc/config/i386/i386.cc
> @@ -26730,15 +26730,20 @@ ix86_vector_costs::add_stmt_cost (int count,
> vect_cost_for_stmt kind,
>    if ((kind == vec_construct || kind == vec_to_scalar)
>        && ((node
>          && (((SLP_TREE_MEMORY_ACCESS_TYPE (node) ==
> VMAT_ELEMENTWISE
> -              || (SLP_TREE_MEMORY_ACCESS_TYPE (node) ==
> VMAT_STRIDED_SLP
> -                  && SLP_TREE_LANES (node) == 1))
> +              || SLP_TREE_MEMORY_ACCESS_TYPE (node) ==
> VMAT_STRIDED_SLP)
>               && (TREE_CODE (DR_STEP (STMT_VINFO_DATA_REF
>                                       (SLP_TREE_REPRESENTATIVE
> (node))))
>                   != INTEGER_CST))
>              || mat_gather_scatter_p (SLP_TREE_MEMORY_ACCESS_TYPE
> (node))))))
>      {
> -      stmt_cost = ix86_default_vector_cost (kind, mode);
> -      stmt_cost *= (TYPE_VECTOR_SUBPARTS (vectype) + 1);
> +      auto lsdata = static_cast<vect_load_store_data *> (node->data);
> +      tree ls_type = lsdata->ls_type ? lsdata->ls_type : vectype;
> +      tree ls_eltype
> +     = lsdata->ls_eltype ? lsdata->ls_eltype : TREE_TYPE (ls_type);
> +      stmt_cost = ix86_vector_cd_cost (TYPE_MODE (ls_type),
> +                                    TYPE_MODE (ls_eltype));

It will mistakenly use vector construction cost for kind == 
vec_to_scalar(scalarized stores for elementwise/strided memory accesses with 
non-constant DR_STEP)

> +      stmt_cost *= (GET_MODE_BITSIZE (TYPE_MODE (ls_type))
> +                 / GET_MODE_BITSIZE (TYPE_MODE (ls_eltype)) + 1);
>      }
>    else if ((kind == vec_construct || kind == scalar_to_vec)
>          && node
> --
> 2.51.0

Reply via email to