vect: Add a unified vect_get_num_copies for slp and non-slp

Extend original vect_get_num_copies (pure loop-based) to calculate number of
vector stmts for slp node regarding a generic vect region.

2024-07-12 Feng Xue <fxue@os.amperecomputing.com>

gcc/
	* tree-vectorizer.h (vect_get_num_copies): New overload function.
	* tree-vect-slp.cc (vect_slp_analyze_node_operations_1): Calculate
	number of vector stmts for slp node with vect_get_num_copies.
	(vect_slp_analyze_node_operations): Calculate number of vector elements
	for constant/external slp node with vect_get_num_copies.
This commit is contained in:
Feng Xue
2024-07-12 16:38:28 +08:00
parent 24689b84b8
commit e7fbae834f
2 changed files with 30 additions and 17 deletions

View File

@@ -6573,17 +6573,7 @@ vect_slp_analyze_node_operations_1 (vec_info *vinfo, slp_tree node,
}
}
else
{
poly_uint64 vf;
if (loop_vec_info loop_vinfo = dyn_cast <loop_vec_info> (vinfo))
vf = loop_vinfo->vectorization_factor;
else
vf = 1;
unsigned int group_size = SLP_TREE_LANES (node);
tree vectype = SLP_TREE_VECTYPE (node);
SLP_TREE_NUMBER_OF_VEC_STMTS (node)
= vect_get_num_vectors (vf * group_size, vectype);
}
SLP_TREE_NUMBER_OF_VEC_STMTS (node) = vect_get_num_copies (vinfo, node);
/* Handle purely internal nodes. */
if (SLP_TREE_CODE (node) == VEC_PERM_EXPR)
@@ -6851,12 +6841,9 @@ vect_slp_analyze_node_operations (vec_info *vinfo, slp_tree node,
&& j == 1);
continue;
}
unsigned group_size = SLP_TREE_LANES (child);
poly_uint64 vf = 1;
if (loop_vec_info loop_vinfo = dyn_cast <loop_vec_info> (vinfo))
vf = loop_vinfo->vectorization_factor;
SLP_TREE_NUMBER_OF_VEC_STMTS (child)
= vect_get_num_vectors (vf * group_size, vector_type);
= vect_get_num_copies (vinfo, child);
/* And cost them. */
vect_prologue_cost_for_slp (child, cost_vec);
}

View File

@@ -2080,6 +2080,32 @@ vect_get_num_vectors (poly_uint64 nunits, tree vectype)
return exact_div (nunits, TYPE_VECTOR_SUBPARTS (vectype)).to_constant ();
}
/* Return the number of vectors in the context of vectorization region VINFO,
needed for a group of statements, whose size is specified by lanes of NODE,
if NULL, it is 1. The statements are supposed to be interleaved together
with no gap, and all operate on vectors of type VECTYPE, if NULL, the
vectype of NODE is used. */
inline unsigned int
vect_get_num_copies (vec_info *vinfo, slp_tree node, tree vectype = NULL)
{
poly_uint64 vf;
if (loop_vec_info loop_vinfo = dyn_cast <loop_vec_info> (vinfo))
vf = LOOP_VINFO_VECT_FACTOR (loop_vinfo);
else
vf = 1;
if (node)
{
vf *= SLP_TREE_LANES (node);
if (!vectype)
vectype = SLP_TREE_VECTYPE (node);
}
return vect_get_num_vectors (vf, vectype);
}
/* Return the number of copies needed for loop vectorization when
a statement operates on vectors of type VECTYPE. This is the
vectorization factor divided by the number of elements in
@@ -2088,7 +2114,7 @@ vect_get_num_vectors (poly_uint64 nunits, tree vectype)
inline unsigned int
vect_get_num_copies (loop_vec_info loop_vinfo, tree vectype)
{
return vect_get_num_vectors (LOOP_VINFO_VECT_FACTOR (loop_vinfo), vectype);
return vect_get_num_copies (loop_vinfo, NULL, vectype);
}
/* Update maximum unit count *MAX_NUNITS so that it accounts for