I've realized that on x86 we get vector types as vector composition
element types, so just recording the ls_type isn't enough to
realize we're constructing a V4SI from V2SI elements. The following
adds such a field.
Bootstrap and regtest running on x86_64-unknown-linux-gnu.
* tree-vectorizer.h (vect_load_store_data::ls_eltype): New field.
* tree-vect-stmts.cc (vectorizable_load): Record ltype
as ls_eltype for VMAT_STRIDED_SLP.
(vectorizable_store): Likewise.
---
gcc/tree-vect-stmts.cc | 18 ++++++++++++------
gcc/tree-vectorizer.h | 5 ++++-
2 files changed, 16 insertions(+), 7 deletions(-)
diff --git a/gcc/tree-vect-stmts.cc b/gcc/tree-vect-stmts.cc
index da87b329715..31d5286d20a 100644
--- a/gcc/tree-vect-stmts.cc
+++ b/gcc/tree-vect-stmts.cc
@@ -8535,10 +8535,13 @@ vectorizable_store (vec_info *vinfo,
}
if (costing_p)
- /* Record the decomposition type for target access during costing. */
- ls.ls_type = lvectype;
+ {
+ /* Record the decomposition type for target access during costing. */
+ ls.ls_type = lvectype;
+ ls.ls_eltype = ltype;
+ }
else
- gcc_assert (ls.ls_type == lvectype);
+ gcc_assert (ls.ls_type == lvectype && ls.ls_eltype == ltype);
unsigned align;
if (alignment_support_scheme == dr_aligned)
@@ -10332,10 +10335,13 @@ vectorizable_load (vec_info *vinfo,
}
if (costing_p)
- /* Record the composition type for target access during costing. */
- ls.ls_type = lvectype;
+ {
+ /* Record the composition type for target access during costing. */
+ ls.ls_type = lvectype;
+ ls.ls_eltype = ltype;
+ }
else
- gcc_assert (ls.ls_type == lvectype);
+ gcc_assert (ls.ls_type == lvectype && ls.ls_eltype == ltype);
/* For SLP permutation support we need to load the whole group,
not only the number of vector stmts the permutation result
diff --git a/gcc/tree-vectorizer.h b/gcc/tree-vectorizer.h
index 3a01e1be0f1..bbc409a5b07 100644
--- a/gcc/tree-vectorizer.h
+++ b/gcc/tree-vectorizer.h
@@ -293,7 +293,10 @@ struct vect_load_store_data : vect_data {
} gs;
tree strided_offset_vectype; // VMAT_GATHER_SCATTER_IFN, originally strided
/* Load/store type with larger element mode used for punning the vectype. */
- tree ls_type; // VMAT_GATHER_SCATTER_IFN
+ tree ls_type; // VMAT_GATHER_SCATTER_IFN, VMAT_STRIDED_SLP
+ /* Load/store element type used for punning the vectype. Relevant when
+ that is a vector type. */
+ tree ls_eltype; // VMAT_STRIDED_SLP
/* This is set to a supported offset vector type if we don't support the
originally requested offset type, otherwise NULL.
If nonzero there will be an additional offset conversion before
--
2.51.0