> -----Original Message-----
> From: Richard Biener <rguent...@suse.de>
> Sent: Tuesday, August 19, 2025 8:31 AM
> To: Tamar Christina <tamar.christ...@arm.com>
> Cc: gcc-patches@gcc.gnu.org; nd <n...@arm.com>
> Subject: Re: [PATCH 2/3]middle-end: Fix costing hooks of various
> vectorizable_*
> [PR121536]
>
> On Tue, 19 Aug 2025, Tamar Christina wrote:
>
> > commit g:1786be14e94bf1a7806b9dc09186f021737f0227 stops storing in
> > STMT_VINFO_VECTYPE the vectype of the current stmt being vectorized and
> instead
> > requires the use of SLP_TREE_VECTYPE for everything but data-refs.
> >
> > However contrary to what the commit says not all usages of
> STMT_VINFO_VECTYPE
> > have been purged from vectorizable_* as the costing hooks which don't pass
> > the
> > SLP tree as an agrument will extract vectype using STMT_VINFO_VECTYPE.
> >
> > This results in no vector type being passed to the backends and results in
> > a few
> > costing test failures in AArch64.
> >
> > This commit replaces the last few cases I could find, all except for in
> > vectorizable_reduction when single_defuse_cycle where the stmt being costed
> > is
> > not the representative of the PHI in the SLP tree but rather the out of tree
> > reduction statement. So I've left that alone, but it does mean vectype is
> > NULL.
>
> Damn, I looked very hard - thanks for catching those. I'll look into
> the above remaining one - what one is it? I see for the
> single-def-use-cycle case:
>
> vect_model_reduction_cost (loop_vinfo, slp_for_stmt_info, reduc_fn,
> reduction_type, ncopies, cost_vec);
> /* Cost the reduction op inside the loop if transformed via
> vect_transform_reduction for non-lane-reducing operation. Otherwise
> this is costed by the separate vectorizable_* routines. */
> if (single_defuse_cycle)
> record_stmt_cost (cost_vec, ncopies, vector_stmt,
> slp_for_stmt_info, 0, vect_body);
>
> so that should pass a SLp node already?
Hmm did you forget to push a patch? The code in trunk is this
https://github.com/gcc-mirror/gcc/blob/master/gcc/tree-vect-loop.cc#L7891
which passes stmt_info.
Thanks,
Tamar
>
> > Most likely this needs to use the overload where we pass an explicit
> > vectype but
> > I wasn't sure so left it for now.
> >
> > Bootstrapped Regtested on aarch64-none-linux-gnu,
> > arm-none-linux-gnueabihf, x86_64-pc-linux-gnu
> > -m32, -m64 and no issues and fixes some failing AArch64 cost-model tests.
> >
> > Ok for master?
>
> OK.
>
> Thanks,
> Richard.
>
> > Thanks,
> > Tamar
> >
> > gcc/ChangeLog:
> >
> > PR target/121536
> > * tree-vect-loop.cc (vectorizable_phi, vectorizable_recurr,
> > vectorizable_nonlinear_induction, vectorizable_induction): Pass slp_node
> > instead of stmt_info to record_stmt_cost.
> >
> > ---
> > diff --git a/gcc/tree-vect-loop.cc b/gcc/tree-vect-loop.cc
> > index
> 3b56f865ec7c3fdb8e9def37ec446a25086b4e28..006fe980172b5f89663e9d85e
> 0dc9cbba93753bb 100644
> > --- a/gcc/tree-vect-loop.cc
> > +++ b/gcc/tree-vect-loop.cc
> > @@ -8678,7 +8678,7 @@ vectorizable_phi (vec_info *,
> > favoring the vector path (but may pessimize it in some cases). */
> > if (gimple_phi_num_args (as_a <gphi *> (stmt_info->stmt)) > 1)
> > record_stmt_cost (cost_vec, SLP_TREE_NUMBER_OF_VEC_STMTS
> (slp_node),
> > - vector_stmt, stmt_info, vectype, 0, vect_body);
> > + vector_stmt, slp_node, vectype, 0, vect_body);
> > SLP_TREE_TYPE (slp_node) = phi_info_type;
> > return true;
> > }
> > @@ -8860,7 +8860,7 @@ vectorizable_recurr (loop_vec_info loop_vinfo,
> stmt_vec_info stmt_info,
> > represented and costed separately. */
> > unsigned prologue_cost = 0;
> > unsigned inside_cost = record_stmt_cost (cost_vec, ncopies,
> > vector_stmt,
> > - stmt_info, 0, vect_body);
> > + slp_node, 0, vect_body);
> > if (dump_enabled_p ())
> > dump_printf_loc (MSG_NOTE, vect_location,
> > "vectorizable_recurr: inside_cost = %d, "
> > @@ -9403,7 +9403,7 @@ vectorizable_nonlinear_induction (loop_vec_info
> loop_vinfo,
> > /* loop cost for vec_loop. Neg induction doesn't have any
> > inside_cost. */
> > inside_cost = record_stmt_cost (cost_vec, ncopies, vector_stmt,
> > - stmt_info, 0, vect_body);
> > + slp_node, 0, vect_body);
> >
> > /* loop cost for vec_loop. Neg induction doesn't have any
> > inside_cost. */
> > @@ -9412,7 +9412,7 @@ vectorizable_nonlinear_induction (loop_vec_info
> loop_vinfo,
> >
> > /* prologue cost for vec_init and vec_step. */
> > prologue_cost = record_stmt_cost (cost_vec, 2, scalar_to_vec,
> > - stmt_info, 0, vect_prologue);
> > + slp_node, 0, vect_prologue);
> >
> > if (dump_enabled_p ())
> > dump_printf_loc (MSG_NOTE, vect_location,
> > @@ -9710,11 +9710,11 @@ vectorizable_induction (loop_vec_info loop_vinfo,
> > /* loop cost for vec_loop. */
> > inside_cost = record_stmt_cost (cost_vec,
> > SLP_TREE_NUMBER_OF_VEC_STMTS
> (slp_node),
> > - vector_stmt, stmt_info, 0, vect_body);
> > + vector_stmt, slp_node, 0, vect_body);
> > /* prologue cost for vec_init (if not nested) and step. */
> > prologue_cost = record_stmt_cost (cost_vec, 1 + !nested_in_vect_loop,
> > scalar_to_vec,
> > - stmt_info, 0, vect_prologue);
> > + slp_node, 0, vect_prologue);
> > if (dump_enabled_p ())
> > dump_printf_loc (MSG_NOTE, vect_location,
> > "vect_model_induction_cost: inside_cost = %d, "
> >
> >
> >
>
> --
> Richard Biener <rguent...@suse.de>
> SUSE Software Solutions Germany GmbH,
> Frankenstrasse 146, 90461 Nuernberg, Germany;
> GF: Ivo Totev, Andrew McDonald, Werner Knoblich; (HRB 36809, AG Nuernberg)