> -----Original Message-----
> From: Richard Biener <rguent...@suse.de>
> Sent: Friday, July 18, 2025 1:09 PM
> To: gcc-patches@gcc.gnu.org
> Cc: seg...@kernel.crashing.org; Jan Hubicka <hubi...@ucw.cz>; Richard
> Sandiford
> <richard.sandif...@arm.com>; Tamar Christina <tamar.christ...@arm.com>;
> rdapp....@gmail.com; j...@ventanamicro.com
> Subject: [PATCH] [RFC] Move STMT_VINFO_TYPE to SLP_TREE_TYPE
>
> I am at a point where I want to store additional information from
> analysis (from loads and stores) to re-use them at transform stage
> without repeating the analysis. I do not want to add to
> stmt_vec_info at this point, so this starts adding kind specific
> sub-structures by moving the STMT_VINFO_TYPE field to the SLP
> tree and adding a (dummy for now) union tagged by it to receive
> such data.
I assume the plan is that every type becomes part of the union and
some accessors are provided?
>
> The change is largely mechanical, but I didn't think of target
> cost models here, much less of that of Risc-V. I have fixed
> all but Risc-V given all memory access add_stmt_cost calls should
> now receive a SLP node. Risc-V will fail to build after this.
>
> In this RFC I have settled for a union (supposed to get pointers
> to data), if somebody has a strong opinion on doing it in other
> ways please speak up. I did once have the idea that analysis
> should create a copy of the SLP graph on-the-fly, split up
> according to the number of vector stmts required so we could
> run post-codegen optimizations on it. That would allow for
> using a class inheritance hierarchy.
>
> As followup this enables getting rid of SLP_TREE_CODE and making
> VEC_PERM therein a separate type, unifying its handling.
>
> Bootstrap and regtest running on x86_64-unknown-linux-gnu.
> I've build-tested aarch64 and ppc64le.
>
> I'm not sure whom to ask for ppc approval, thus CCed Segher.
> Are the x86/aarch64 changes OK eventually?
AArch64 parts are OK, I assume for now we still get stmt_info
but should start reworking the cost model to use slp_tree as
much as possible?
Thanks,
Tamar
>
> Can the risc-v people try to sort out this up to a point
> where I can just s/STMT_VINFO_TYPE/SLP_TREE_TYPE there?
>
> Thanks,
> Richard.
>
> * tree-vectorizer.h (_slp_tree::type): Add.
> (_slp_tree::u): Likewise.
> (_stmt_vec_info::type): Remove.
> (STMT_VINFO_TYPE): Likewise.
> (SLP_TREE_TYPE): New.
> * tree-vectorizer.cc (vec_info::new_stmt_vec_info): Do not
> initialize type.
> * tree-vect-slp.cc (_slp_tree::_slp_tree): Initialize type.
> (vect_slp_analyze_node_operations): Adjust.
> (vect_schedule_slp_node): Likewise.
> * tree-vect-patterns.cc (vect_init_pattern_stmt): Do not
> copy STMT_VINFO_TYPE.
> * tree-vect-loop.cc: Set SLP_TREE_TYPE instead of
> STMT_VINFO_TYPE everywhere.
> (vect_create_loop_vinfo): Do not set STMT_VINFO_TYPE on
> loop conditions.
> * tree-vect-stmts.cc: Set SLP_TREE_TYPE instead of
> STMT_VINFO_TYPE everywhere.
> (vect_analyze_stmt): Adjust.
> (vect_transform_stmt): Likewise.
> * config/aarch64/aarch64.cc (aarch64_vector_costs::count_ops):
> Access SLP_TREE_TYPE instead of STMT_VINFO_TYPE.
> * config/i386/i386.cc (ix86_vector_costs::add_stmt_cost):
> Remove non-SLP element-wise load/store matching.
> * config/rs6000/rs6000.cc
> (rs6000_cost_data::update_target_cost_per_stmt): Pass in
> the SLP node. Use that to get at the memory access
> kind and type.
> (rs6000_cost_data::add_stmt_cost): Pass down SLP node.
> ---
> gcc/config/aarch64/aarch64.cc | 2 +-
> gcc/config/i386/i386.cc | 24 +++++--------
> gcc/config/rs6000/rs6000.cc | 16 +++++----
> gcc/tree-vect-loop.cc | 25 ++++++--------
> gcc/tree-vect-patterns.cc | 1 -
> gcc/tree-vect-slp.cc | 19 +++++------
> gcc/tree-vect-stmts.cc | 34 +++++++++----------
> gcc/tree-vectorizer.cc | 1 -
> gcc/tree-vectorizer.h | 63 +++++++++++++++++++----------------
> 9 files changed, 88 insertions(+), 97 deletions(-)
>
> diff --git a/gcc/config/aarch64/aarch64.cc b/gcc/config/aarch64/aarch64.cc
> index 0485f695941..dea94c95ff1 100644
> --- a/gcc/config/aarch64/aarch64.cc
> +++ b/gcc/config/aarch64/aarch64.cc
> @@ -17712,7 +17712,7 @@ aarch64_vector_costs::count_ops (unsigned int
> count, vect_cost_for_stmt kind,
> {
> if (gimple_vuse (SSA_NAME_DEF_STMT (offset)))
> {
> - if (STMT_VINFO_TYPE (stmt_info) == load_vec_info_type)
> + if (SLP_TREE_TYPE (node) == load_vec_info_type)
> ops->loads += count - 1;
> else
> /* Stores want to count both the index to array and
> data
> to
> diff --git a/gcc/config/i386/i386.cc b/gcc/config/i386/i386.cc
> index 49bd3939eb4..8c26c67072c 100644
> --- a/gcc/config/i386/i386.cc
> +++ b/gcc/config/i386/i386.cc
> @@ -26122,23 +26122,15 @@ ix86_vector_costs::add_stmt_cost (int count,
> vect_cost_for_stmt kind,
> (AGU and load ports). Try to account for this by scaling the
> construction cost by the number of elements involved. */
> if ((kind == vec_construct || kind == vec_to_scalar)
> - && ((stmt_info
> - && (STMT_VINFO_TYPE (stmt_info) == load_vec_info_type
> - || STMT_VINFO_TYPE (stmt_info) == store_vec_info_type)
> - && ((STMT_VINFO_MEMORY_ACCESS_TYPE (stmt_info) ==
> VMAT_ELEMENTWISE
> - && (TREE_CODE (DR_STEP (STMT_VINFO_DATA_REF (stmt_info)))
> + && ((node
> + && (((SLP_TREE_MEMORY_ACCESS_TYPE (node) ==
> VMAT_ELEMENTWISE
> + || (SLP_TREE_MEMORY_ACCESS_TYPE (node) ==
> VMAT_STRIDED_SLP
> + && SLP_TREE_LANES (node) == 1))
> + && (TREE_CODE (DR_STEP (STMT_VINFO_DATA_REF
> + (SLP_TREE_REPRESENTATIVE (node))))
> != INTEGER_CST))
> - || (STMT_VINFO_MEMORY_ACCESS_TYPE (stmt_info)
> - == VMAT_GATHER_SCATTER)))
> - || (node
> - && (((SLP_TREE_MEMORY_ACCESS_TYPE (node) ==
> VMAT_ELEMENTWISE
> - || (SLP_TREE_MEMORY_ACCESS_TYPE (node) ==
> VMAT_STRIDED_SLP
> - && SLP_TREE_LANES (node) == 1))
> - && (TREE_CODE (DR_STEP (STMT_VINFO_DATA_REF
> - (SLP_TREE_REPRESENTATIVE (node))))
> - != INTEGER_CST))
> - || (SLP_TREE_MEMORY_ACCESS_TYPE (node)
> - == VMAT_GATHER_SCATTER)))))
> + || (SLP_TREE_MEMORY_ACCESS_TYPE (node)
> + == VMAT_GATHER_SCATTER)))))
> {
> stmt_cost = ix86_builtin_vectorization_cost (kind, vectype, misalign);
> stmt_cost *= (TYPE_VECTOR_SUBPARTS (vectype) + 1);
> diff --git a/gcc/config/rs6000/rs6000.cc b/gcc/config/rs6000/rs6000.cc
> index 7ee26e52b13..1b2a4730ccb 100644
> --- a/gcc/config/rs6000/rs6000.cc
> +++ b/gcc/config/rs6000/rs6000.cc
> @@ -5165,6 +5165,7 @@ public:
>
> protected:
> void update_target_cost_per_stmt (vect_cost_for_stmt, stmt_vec_info,
> + slp_tree node,
> vect_cost_model_location, unsigned int);
> void density_test (loop_vec_info);
> void adjust_vect_cost_per_loop (loop_vec_info);
> @@ -5312,6 +5313,7 @@ rs6000_adjust_vect_cost_per_stmt (enum
> vect_cost_for_stmt kind,
> void
> rs6000_cost_data::update_target_cost_per_stmt (vect_cost_for_stmt kind,
> stmt_vec_info stmt_info,
> + slp_tree node,
> vect_cost_model_location where,
> unsigned int orig_count)
> {
> @@ -5372,12 +5374,12 @@ rs6000_cost_data::update_target_cost_per_stmt
> (vect_cost_for_stmt kind,
> or may not need to apply. When finalizing the cost of the loop,
> the extra penalty is applied when the load density heuristics
> are satisfied. */
> - if (kind == vec_construct && stmt_info
> - && STMT_VINFO_TYPE (stmt_info) == load_vec_info_type
> - && (STMT_VINFO_MEMORY_ACCESS_TYPE (stmt_info) ==
> VMAT_ELEMENTWISE
> - || STMT_VINFO_MEMORY_ACCESS_TYPE (stmt_info) ==
> VMAT_STRIDED_SLP))
> + if (kind == vec_construct && node
> + && SLP_TREE_TYPE (node) == load_vec_info_type
> + && (SLP_TREE_MEMORY_ACCESS_TYPE (node) == VMAT_ELEMENTWISE
> + || SLP_TREE_MEMORY_ACCESS_TYPE (node) == VMAT_STRIDED_SLP))
> {
> - tree vectype = STMT_VINFO_VECTYPE (stmt_info);
> + tree vectype = SLP_TREE_VECTYPE (node);
> unsigned int nunits = vect_nunits_for_cost (vectype);
> /* As PR103702 shows, it's possible that vectorizer wants to do
> costings for only one unit here, it's no need to do any
> @@ -5406,7 +5408,7 @@ rs6000_cost_data::update_target_cost_per_stmt
> (vect_cost_for_stmt kind,
>
> unsigned
> rs6000_cost_data::add_stmt_cost (int count, vect_cost_for_stmt kind,
> - stmt_vec_info stmt_info, slp_tree,
> + stmt_vec_info stmt_info, slp_tree node,
> tree vectype, int misalign,
> vect_cost_model_location where)
> {
> @@ -5424,7 +5426,7 @@ rs6000_cost_data::add_stmt_cost (int count,
> vect_cost_for_stmt kind,
> retval = adjust_cost_for_freq (stmt_info, where, count * stmt_cost);
> m_costs[where] += retval;
>
> - update_target_cost_per_stmt (kind, stmt_info, where, orig_count);
> + update_target_cost_per_stmt (kind, stmt_info, node, where, orig_count);
> }
>
> return retval;
> diff --git a/gcc/tree-vect-loop.cc b/gcc/tree-vect-loop.cc
> index 712e6f368ad..82681081476 100644
> --- a/gcc/tree-vect-loop.cc
> +++ b/gcc/tree-vect-loop.cc
> @@ -1919,7 +1919,6 @@ vect_create_loop_vinfo (class loop *loop,
> vec_info_shared *shared,
> for (gcond *cond : info->conds)
> {
> stmt_vec_info loop_cond_info = loop_vinfo->lookup_stmt (cond);
> - STMT_VINFO_TYPE (loop_cond_info) = loop_exit_ctrl_vec_info_type;
> /* Mark the statement as a condition. */
> STMT_VINFO_DEF_TYPE (loop_cond_info) = vect_condition_def;
> }
> @@ -1936,9 +1935,6 @@ vect_create_loop_vinfo (class loop *loop,
> vec_info_shared *shared,
>
> if (info->inner_loop_cond)
> {
> - stmt_vec_info inner_loop_cond_info
> - = loop_vinfo->lookup_stmt (info->inner_loop_cond);
> - STMT_VINFO_TYPE (inner_loop_cond_info) = loop_exit_ctrl_vec_info_type;
> /* If we have an estimate on the number of iterations of the inner
> loop use that to limit the scale for costing, otherwise use
> --param vect-inner-loop-cost-factor literally. */
> @@ -7158,7 +7154,7 @@ vectorizable_lane_reducing (loop_vec_info loop_vinfo,
> stmt_vec_info stmt_info,
> }
>
> /* Transform via vect_transform_reduction. */
> - STMT_VINFO_TYPE (stmt_info) = reduc_vec_info_type;
> + SLP_TREE_TYPE (slp_node) = reduc_vec_info_type;
> return true;
> }
>
> @@ -7260,18 +7256,17 @@ vectorizable_reduction (loop_vec_info loop_vinfo,
> }
> /* Analysis for double-reduction is done on the outer
> loop PHI, nested cycles have no further restrictions. */
> - STMT_VINFO_TYPE (stmt_info) = cycle_phi_info_type;
> + SLP_TREE_TYPE (slp_node) = cycle_phi_info_type;
> }
> else
> - STMT_VINFO_TYPE (stmt_info) = reduc_vec_info_type;
> + SLP_TREE_TYPE (slp_node) = reduc_vec_info_type;
> return true;
> }
>
> - stmt_vec_info orig_stmt_of_analysis = stmt_info;
> stmt_vec_info phi_info = stmt_info;
> if (!is_a <gphi *> (stmt_info->stmt))
> {
> - STMT_VINFO_TYPE (stmt_info) = reduc_vec_info_type;
> + SLP_TREE_TYPE (slp_node) = reduc_vec_info_type;
> return true;
> }
> if (STMT_VINFO_DEF_TYPE (stmt_info) == vect_double_reduction_def)
> @@ -8081,7 +8076,7 @@ vectorizable_reduction (loop_vec_info loop_vinfo,
> && reduction_type == FOLD_LEFT_REDUCTION)
> dump_printf_loc (MSG_NOTE, vect_location,
> "using an in-order (fold-left) reduction.\n");
> - STMT_VINFO_TYPE (orig_stmt_of_analysis) = cycle_phi_info_type;
> + SLP_TREE_TYPE (slp_node) = cycle_phi_info_type;
>
> /* All but single defuse-cycle optimized and fold-left reductions go
> through their own vectorizable_* routines. */
> @@ -8765,7 +8760,7 @@ vectorizable_lc_phi (loop_vec_info loop_vinfo,
> "incompatible vector types for invariants\n");
> return false;
> }
> - STMT_VINFO_TYPE (stmt_info) = lc_phi_info_type;
> + SLP_TREE_TYPE (slp_node) = lc_phi_info_type;
> return true;
> }
>
> @@ -8850,7 +8845,7 @@ vectorizable_phi (vec_info *,
> 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);
> - STMT_VINFO_TYPE (stmt_info) = phi_info_type;
> + SLP_TREE_TYPE (slp_node) = phi_info_type;
> return true;
> }
>
> @@ -9037,7 +9032,7 @@ vectorizable_recurr (loop_vec_info loop_vinfo,
> stmt_vec_info stmt_info,
> "prologue_cost = %d .\n", inside_cost,
> prologue_cost);
>
> - STMT_VINFO_TYPE (stmt_info) = recurr_info_type;
> + SLP_TREE_TYPE (slp_node) = recurr_info_type;
> return true;
> }
>
> @@ -9578,7 +9573,7 @@ vectorizable_nonlinear_induction (loop_vec_info
> loop_vinfo,
> "prologue_cost = %d. \n", inside_cost,
> prologue_cost);
>
> - STMT_VINFO_TYPE (stmt_info) = induc_vec_info_type;
> + SLP_TREE_TYPE (slp_node) = induc_vec_info_type;
> DUMP_VECT_SCOPE ("vectorizable_nonlinear_induction");
> return true;
> }
> @@ -9880,7 +9875,7 @@ vectorizable_induction (loop_vec_info loop_vinfo,
> "prologue_cost = %d .\n", inside_cost,
> prologue_cost);
>
> - STMT_VINFO_TYPE (stmt_info) = induc_vec_info_type;
> + SLP_TREE_TYPE (slp_node) = induc_vec_info_type;
> DUMP_VECT_SCOPE ("vectorizable_induction");
> return true;
> }
> diff --git a/gcc/tree-vect-patterns.cc b/gcc/tree-vect-patterns.cc
> index 0f6d6b77ea1..888aaa75fe2 100644
> --- a/gcc/tree-vect-patterns.cc
> +++ b/gcc/tree-vect-patterns.cc
> @@ -130,7 +130,6 @@ vect_init_pattern_stmt (vec_info *vinfo, gimple
> *pattern_stmt,
> STMT_VINFO_RELATED_STMT (pattern_stmt_info) = orig_stmt_info;
> STMT_VINFO_DEF_TYPE (pattern_stmt_info)
> = STMT_VINFO_DEF_TYPE (orig_stmt_info);
> - STMT_VINFO_TYPE (pattern_stmt_info) = STMT_VINFO_TYPE (orig_stmt_info);
> if (!STMT_VINFO_VECTYPE (pattern_stmt_info))
> {
> gcc_assert (!vectype
> diff --git a/gcc/tree-vect-slp.cc b/gcc/tree-vect-slp.cc
> index 7c23496b5e0..8de9bca8743 100644
> --- a/gcc/tree-vect-slp.cc
> +++ b/gcc/tree-vect-slp.cc
> @@ -130,6 +130,8 @@ _slp_tree::_slp_tree ()
> this->failed = NULL;
> this->max_nunits = 1;
> this->lanes = 0;
> + SLP_TREE_TYPE (this) = undef_vec_info_type;
> + this->u.undef = NULL;
> }
>
> /* Tear down a SLP node. */
> @@ -8257,8 +8259,7 @@ vect_slp_analyze_node_operations (vec_info *vinfo,
> slp_tree node,
> /* Masked loads can have an undefined (default SSA definition)
> else operand. We do not need to cost it. */
> vec<tree> ops = SLP_TREE_SCALAR_OPS (child);
> - if ((STMT_VINFO_TYPE (SLP_TREE_REPRESENTATIVE (node))
> - == load_vec_info_type)
> + if (SLP_TREE_TYPE (node) == load_vec_info_type
> && ((ops.length ()
> && TREE_CODE (ops[0]) == SSA_NAME
> && SSA_NAME_IS_DEFAULT_DEF (ops[0])
> @@ -8269,8 +8270,7 @@ vect_slp_analyze_node_operations (vec_info *vinfo,
> slp_tree node,
> /* For shifts with a scalar argument we don't need
> to cost or code-generate anything.
> ??? Represent this more explicitely. */
> - gcc_assert ((STMT_VINFO_TYPE (SLP_TREE_REPRESENTATIVE (node))
> - == shift_vec_info_type)
> + gcc_assert (SLP_TREE_TYPE (node) == shift_vec_info_type
> && j == 1);
> continue;
> }
> @@ -11307,9 +11307,9 @@ vect_schedule_slp_node (vec_info *vinfo,
> si = gsi_for_stmt (last_stmt_info->stmt);
> }
> else if (SLP_TREE_CODE (node) != VEC_PERM_EXPR
> - && (STMT_VINFO_TYPE (stmt_info) == cycle_phi_info_type
> - || STMT_VINFO_TYPE (stmt_info) == induc_vec_info_type
> - || STMT_VINFO_TYPE (stmt_info) == phi_info_type))
> + && (SLP_TREE_TYPE (node) == cycle_phi_info_type
> + || SLP_TREE_TYPE (node) == induc_vec_info_type
> + || SLP_TREE_TYPE (node) == phi_info_type))
> {
> /* For PHI node vectorization we do not use the insertion iterator. */
> si = gsi_none ();
> @@ -11329,8 +11329,7 @@ vect_schedule_slp_node (vec_info *vinfo,
> last scalar def here. */
> if (SLP_TREE_VEC_DEFS (child).is_empty ())
> {
> - gcc_assert (STMT_VINFO_TYPE (SLP_TREE_REPRESENTATIVE
> (child))
> - == cycle_phi_info_type);
> + gcc_assert (SLP_TREE_TYPE (child) == cycle_phi_info_type);
> gphi *phi = as_a <gphi *>
> (vect_find_last_scalar_stmt_in_slp (child)->stmt);
> if (!last_stmt)
> @@ -11477,7 +11476,7 @@ vect_schedule_slp_node (vec_info *vinfo,
> if (dump_enabled_p ())
> dump_printf_loc (MSG_NOTE, vect_location,
> "------>vectorizing SLP permutation node\n");
> - /* ??? the transform kind is stored to STMT_VINFO_TYPE which might
> + /* ??? the transform kind was stored to STMT_VINFO_TYPE which might
> be shared with different SLP nodes (but usually it's the same
> operation apart from the case the stmt is only there for denoting
> the actual scalar lane defs ...). So do not call vect_transform_stmt
> diff --git a/gcc/tree-vect-stmts.cc b/gcc/tree-vect-stmts.cc
> index 2e9b3d2e686..86b6904facf 100644
> --- a/gcc/tree-vect-stmts.cc
> +++ b/gcc/tree-vect-stmts.cc
> @@ -3299,7 +3299,7 @@ vectorizable_bswap (vec_info *vinfo,
> return false;
> }
>
> - STMT_VINFO_TYPE (stmt_info) = call_vec_info_type;
> + SLP_TREE_TYPE (slp_node) = call_vec_info_type;
> DUMP_VECT_SCOPE ("vectorizable_bswap");
> record_stmt_cost (cost_vec,
> 1, vector_stmt, stmt_info, 0, vect_prologue);
> @@ -3650,7 +3650,7 @@ vectorizable_call (vec_info *vinfo,
> "incompatible vector types for invariants\n");
> return false;
> }
> - STMT_VINFO_TYPE (stmt_info) = call_vec_info_type;
> + SLP_TREE_TYPE (slp_node) = call_vec_info_type;
> DUMP_VECT_SCOPE ("vectorizable_call");
> vect_model_simple_cost (vinfo, ncopies, dt, ndts, slp_node, cost_vec);
> if (ifn != IFN_LAST && modifier == NARROW && !slp_node)
> @@ -4617,7 +4617,7 @@ vectorizable_simd_clone_call (vec_info *vinfo,
> stmt_vec_info stmt_info,
> LOOP_VINFO_CAN_USE_PARTIAL_VECTORS_P (loop_vinfo) = false;
> }
>
> - STMT_VINFO_TYPE (stmt_info) = call_simd_clone_vec_info_type;
> + SLP_TREE_TYPE (slp_node) = call_simd_clone_vec_info_type;
> DUMP_VECT_SCOPE ("vectorizable_simd_clone_call");
> /* vect_model_simple_cost (vinfo, ncopies, dt, slp_node, cost_vec); */
> return true;
> @@ -5830,13 +5830,13 @@ vectorizable_conversion (vec_info *vinfo,
> DUMP_VECT_SCOPE ("vectorizable_conversion");
> if (modifier == NONE)
> {
> - STMT_VINFO_TYPE (stmt_info) = type_conversion_vec_info_type;
> + SLP_TREE_TYPE (slp_node) = type_conversion_vec_info_type;
> vect_model_simple_cost (vinfo, (1 + multi_step_cvt),
> dt, ndts, slp_node, cost_vec);
> }
> else if (modifier == NARROW_SRC || modifier == NARROW_DST)
> {
> - STMT_VINFO_TYPE (stmt_info) = type_demotion_vec_info_type;
> + SLP_TREE_TYPE (slp_node) = type_demotion_vec_info_type;
> /* The final packing step produces one vector result per copy. */
> unsigned int nvectors = SLP_TREE_NUMBER_OF_VEC_STMTS (slp_node);
> vect_model_promotion_demotion_cost (stmt_info, dt, nvectors,
> @@ -5845,7 +5845,7 @@ vectorizable_conversion (vec_info *vinfo,
> }
> else
> {
> - STMT_VINFO_TYPE (stmt_info) = type_promotion_vec_info_type;
> + SLP_TREE_TYPE (slp_node) = type_promotion_vec_info_type;
> /* The initial unpacking step produces two vector results
> per copy. MULTI_STEP_CVT is 0 for a single conversion,
> so >> MULTI_STEP_CVT divides by 2^(number of steps - 1). */
> @@ -6197,7 +6197,7 @@ vectorizable_assignment (vec_info *vinfo,
> "incompatible vector types for invariants\n");
> return false;
> }
> - STMT_VINFO_TYPE (stmt_info) = assignment_vec_info_type;
> + SLP_TREE_TYPE (slp_node) = assignment_vec_info_type;
> DUMP_VECT_SCOPE ("vectorizable_assignment");
> if (!vect_nop_conversion_p (stmt_info))
> vect_model_simple_cost (vinfo, ncopies, dt, ndts, slp_node, cost_vec);
> @@ -6568,7 +6568,7 @@ vectorizable_shift (vec_info *vinfo,
> == INTEGER_CST));
> }
> }
> - STMT_VINFO_TYPE (stmt_info) = shift_vec_info_type;
> + SLP_TREE_TYPE (slp_node) = shift_vec_info_type;
> DUMP_VECT_SCOPE ("vectorizable_shift");
> vect_model_simple_cost (vinfo, ncopies, dt,
> scalar_shift_arg ? 1 : ndts, slp_node, cost_vec);
> @@ -7004,7 +7004,7 @@ vectorizable_operation (vec_info *vinfo,
> return false;
> }
>
> - STMT_VINFO_TYPE (stmt_info) = op_vec_info_type;
> + SLP_TREE_TYPE (slp_node) = op_vec_info_type;
> DUMP_VECT_SCOPE ("vectorizable_operation");
> vect_model_simple_cost (vinfo, 1, dt, ndts, slp_node, cost_vec);
> if (using_emulated_vectors_p)
> @@ -8463,7 +8463,7 @@ vectorizable_store (vec_info *vinfo,
> dump_printf_loc (MSG_NOTE, vect_location,
> "Vectorizing an unaligned access.\n");
>
> - STMT_VINFO_TYPE (stmt_info) = store_vec_info_type;
> + SLP_TREE_TYPE (slp_node) = store_vec_info_type;
> }
> gcc_assert (memory_access_type == SLP_TREE_MEMORY_ACCESS_TYPE
> (stmt_info));
>
> @@ -10144,7 +10144,7 @@ vectorizable_load (vec_info *vinfo,
> if (memory_access_type == VMAT_LOAD_STORE_LANES)
> vinfo->any_known_not_updated_vssa = true;
>
> - STMT_VINFO_TYPE (stmt_info) = load_vec_info_type;
> + SLP_TREE_TYPE (slp_node) = load_vec_info_type;
> }
> else
> {
> @@ -12377,7 +12377,7 @@ vectorizable_condition (vec_info *vinfo,
> }
> }
>
> - STMT_VINFO_TYPE (stmt_info) = condition_vec_info_type;
> + SLP_TREE_TYPE (slp_node) = condition_vec_info_type;
> vect_model_simple_cost (vinfo, ncopies, dts, ndts, slp_node,
> cost_vec, kind);
> return true;
> @@ -12911,7 +12911,7 @@ vectorizable_comparison (vec_info *vinfo,
> return false;
>
> if (!vec_stmt)
> - STMT_VINFO_TYPE (stmt_info) = comparison_vec_info_type;
> + SLP_TREE_TYPE (slp_node) = comparison_vec_info_type;
>
> return true;
> }
> @@ -13377,8 +13377,8 @@ vect_analyze_stmt (vec_info *vinfo,
> /* Stmts that are (also) "live" (i.e. - that are used out of the loop)
> need extra handling, except for vectorizable reductions. */
> if (!bb_vinfo
> - && STMT_VINFO_TYPE (stmt_info) != reduc_vec_info_type
> - && (STMT_VINFO_TYPE (stmt_info) != lc_phi_info_type
> + && SLP_TREE_TYPE (node) != reduc_vec_info_type
> + && (SLP_TREE_TYPE (node) != lc_phi_info_type
> || STMT_VINFO_DEF_TYPE (stmt_info) == vect_internal_def)
> && (!node->ldst_lanes || SLP_TREE_CODE (node) == VEC_PERM_EXPR)
> && !can_vectorize_live_stmts (as_a <loop_vec_info> (vinfo),
> @@ -13416,7 +13416,7 @@ vect_transform_stmt (vec_info *vinfo,
> if (slp_node)
> STMT_VINFO_VECTYPE (stmt_info) = SLP_TREE_VECTYPE (slp_node);
>
> - switch (STMT_VINFO_TYPE (stmt_info))
> + switch (SLP_TREE_TYPE (slp_node))
> {
> case type_demotion_vec_info_type:
> case type_promotion_vec_info_type:
> @@ -13547,7 +13547,7 @@ vect_transform_stmt (vec_info *vinfo,
> if (!slp_node && vec_stmt)
> gcc_assert (STMT_VINFO_VEC_STMTS (stmt_info).exists ());
>
> - if (STMT_VINFO_TYPE (stmt_info) != store_vec_info_type
> + if (SLP_TREE_TYPE (slp_node) != store_vec_info_type
> && (!slp_node
> || !slp_node->ldst_lanes
> || SLP_TREE_CODE (slp_node) == VEC_PERM_EXPR))
> diff --git a/gcc/tree-vectorizer.cc b/gcc/tree-vectorizer.cc
> index 89fecd78088..03e5dcd576d 100644
> --- a/gcc/tree-vectorizer.cc
> +++ b/gcc/tree-vectorizer.cc
> @@ -715,7 +715,6 @@ vec_info::new_stmt_vec_info (gimple *stmt)
> stmt_vec_info res = XCNEW (class _stmt_vec_info);
> res->stmt = stmt;
>
> - STMT_VINFO_TYPE (res) = undef_vec_info_type;
> STMT_VINFO_RELEVANT (res) = vect_unused_in_scope;
> STMT_VINFO_VECTORIZABLE (res) = true;
> STMT_VINFO_REDUC_TYPE (res) = TREE_CODE_REDUCTION;
> diff --git a/gcc/tree-vectorizer.h b/gcc/tree-vectorizer.h
> index a811e009835..c0be7dc7944 100644
> --- a/gcc/tree-vectorizer.h
> +++ b/gcc/tree-vectorizer.h
> @@ -210,6 +210,32 @@ enum vect_memory_access_type {
> VMAT_GATHER_SCATTER
> };
>
> +/*-----------------------------------------------------------------*/
> +/* Info on vectorized defs. */
> +/*-----------------------------------------------------------------*/
> +enum stmt_vec_info_type {
> + undef_vec_info_type = 0,
> + load_vec_info_type,
> + store_vec_info_type,
> + shift_vec_info_type,
> + op_vec_info_type,
> + call_vec_info_type,
> + call_simd_clone_vec_info_type,
> + assignment_vec_info_type,
> + condition_vec_info_type,
> + comparison_vec_info_type,
> + reduc_vec_info_type,
> + induc_vec_info_type,
> + type_promotion_vec_info_type,
> + type_demotion_vec_info_type,
> + type_conversion_vec_info_type,
> + cycle_phi_info_type,
> + lc_phi_info_type,
> + phi_info_type,
> + recurr_info_type,
> + loop_exit_ctrl_vec_info_type
> +};
> +
>
> /**********************************************************************
> **
> SLP
>
> **********************************************************************
> **/
> @@ -284,6 +310,13 @@ struct _slp_tree {
> for loop vectorization. */
> vect_memory_access_type memory_access_type;
>
> + /* The kind of operation as determined by analysis and a tagged
> + union with kind specific data. */
> + enum stmt_vec_info_type type;
> + union {
> + void *undef;
> + } u;
> +
> /* If not NULL this is a cached failed SLP discovery attempt with
> the lanes that failed during SLP discovery as 'false'. This is
> a copy of the matches array. */
> @@ -369,6 +402,7 @@ public:
> #define SLP_TREE_LANES(S) (S)->lanes
> #define SLP_TREE_CODE(S) (S)->code
> #define SLP_TREE_MEMORY_ACCESS_TYPE(S) (S)-
> >memory_access_type
> +#define SLP_TREE_TYPE(S) (S)->type
>
> enum vect_partial_vector_style {
> vect_partial_vectors_none,
> @@ -1216,32 +1250,6 @@ public:
> #define BB_VINFO_DATAREFS(B) (B)->shared->datarefs
> #define BB_VINFO_DDRS(B) (B)->shared->ddrs
>
> -/*-----------------------------------------------------------------*/
> -/* Info on vectorized defs. */
> -/*-----------------------------------------------------------------*/
> -enum stmt_vec_info_type {
> - undef_vec_info_type = 0,
> - load_vec_info_type,
> - store_vec_info_type,
> - shift_vec_info_type,
> - op_vec_info_type,
> - call_vec_info_type,
> - call_simd_clone_vec_info_type,
> - assignment_vec_info_type,
> - condition_vec_info_type,
> - comparison_vec_info_type,
> - reduc_vec_info_type,
> - induc_vec_info_type,
> - type_promotion_vec_info_type,
> - type_demotion_vec_info_type,
> - type_conversion_vec_info_type,
> - cycle_phi_info_type,
> - lc_phi_info_type,
> - phi_info_type,
> - recurr_info_type,
> - loop_exit_ctrl_vec_info_type
> -};
> -
> /* Indicates whether/how a variable is used in the scope of loop/basic
> block. */
> enum vect_relevant {
> @@ -1334,8 +1342,6 @@ typedef struct data_reference *dr_p;
> class _stmt_vec_info {
> public:
>
> - enum stmt_vec_info_type type;
> -
> /* Indicates whether this stmts is part of a computation whose result is
> used outside the loop. */
> bool live;
> @@ -1581,7 +1587,6 @@ struct gather_scatter_info {
> };
>
> /* Access Functions. */
> -#define STMT_VINFO_TYPE(S) (S)->type
> #define STMT_VINFO_STMT(S) (S)->stmt
> #define STMT_VINFO_RELEVANT(S) (S)->relevant
> #define STMT_VINFO_LIVE_P(S) (S)->live
> --
> 2.43.0