tree-optimization/112793 - SLP of constant/external code-generated twice

The following makes the attempt at code-generating a constant/external
SLP node twice well-formed as that can happen when partitioning BB
vectorization attempts where we keep constants/externals unpartitioned.

	PR tree-optimization/112793
	* tree-vect-slp.cc (vect_schedule_slp_node): Already
	code-generated constant/external nodes are OK.

	* g++.dg/vect/pr112793.cc: New testcase.
This commit is contained in:
Richard Biener 2023-12-13 14:23:31 +01:00
parent 8cf5afba5d
commit d782ec8362
2 changed files with 41 additions and 8 deletions

View file

@ -0,0 +1,32 @@
// { dg-do compile }
// { dg-require-effective-target c++11 }
// { dg-additional-options "-march=znver2" { target x86_64-*-* i?86-*-* } }
typedef double T;
T c, s;
T a[16];
struct Matrix4 {
Matrix4(){}
Matrix4(T e, T f, T i, T j) {
r[1] = r[4] = e;
r[5] = f;
r[8] = i;
r[9] = j;
}
Matrix4 operator*(Matrix4 a) {
return Matrix4(
r[0] * a.r[4] + r[4] + r[15] + r[6],
r[1] * a.r[4] + 1 + 2 + 3, r[0] * r[8] + 1 + 2 + 3,
r[1] * r[8] + r[1] + r[14] + r[2] * r[3]);
}
T r[16] = {};
};
Matrix4 t1, t2;
Matrix4 tt;
Matrix4 getRotAltAzToEquatorial()
{
t2.r[4] = 0;
t1.r[1] = -s;
t1.r[8] = 0;
return t1 * t2;
}

View file

@ -9054,13 +9054,6 @@ vect_schedule_slp_node (vec_info *vinfo,
int i;
slp_tree child;
/* For existing vectors there's nothing to do. */
if (SLP_TREE_DEF_TYPE (node) == vect_external_def
&& SLP_TREE_VEC_DEFS (node).exists ())
return;
gcc_assert (SLP_TREE_VEC_DEFS (node).is_empty ());
/* Vectorize externals and constants. */
if (SLP_TREE_DEF_TYPE (node) == vect_constant_def
|| SLP_TREE_DEF_TYPE (node) == vect_external_def)
@ -9071,10 +9064,18 @@ vect_schedule_slp_node (vec_info *vinfo,
if (!SLP_TREE_VECTYPE (node))
return;
vect_create_constant_vectors (vinfo, node);
/* There are two reasons vector defs might already exist. The first
is that we are vectorizing an existing vector def. The second is
when performing BB vectorization shared constant/external nodes
are not split apart during partitioning so during the code-gen
DFS walk we can end up visiting them twice. */
if (! SLP_TREE_VEC_DEFS (node).exists ())
vect_create_constant_vectors (vinfo, node);
return;
}
gcc_assert (SLP_TREE_VEC_DEFS (node).is_empty ());
stmt_vec_info stmt_info = SLP_TREE_REPRESENTATIVE (node);
gcc_assert (SLP_TREE_NUMBER_OF_VEC_STMTS (node) != 0);