tree-optimization/97732 - fix init of SLP induction vectorization

This PR exposes two issues - one that the vector builder treats
&x as eligible for VECTOR_CST elements and one that SLP induction
vectorization forgets to convert init elements to the vector
component type which makes a difference for pointer vs. integer.

2020-11-06  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/97732
	* tree-vect-loop.c (vectorizable_induction): Convert the
	init elements to the vector component type.
	* gimple-fold.c (gimple_build_vector): Use CONSTANT_CLASS_P
	rather than TREE_CONSTANT to determine if elements are
	eligible for VECTOR_CSTs.

	* gcc.dg/vect/bb-slp-pr97732.c: New testcase.
This commit is contained in:
Richard Biener 2020-11-06 09:35:27 +01:00
parent f11b1f9d15
commit 8ebedfcd86
3 changed files with 16 additions and 1 deletions

View File

@ -7855,7 +7855,7 @@ gimple_build_vector (gimple_seq *seq, location_t loc,
gcc_assert (builder->nelts_per_pattern () <= 2);
unsigned int encoded_nelts = builder->encoded_nelts ();
for (unsigned int i = 0; i < encoded_nelts; ++i)
if (!TREE_CONSTANT ((*builder)[i]))
if (!CONSTANT_CLASS_P ((*builder)[i]))
{
tree type = builder->type ();
unsigned int nelts = TYPE_VECTOR_SUBPARTS (type).to_constant ();

View File

@ -0,0 +1,11 @@
/* { dg-do compile } */
struct S { int a, b; } *e;
int d;
void
foo (struct S *x)
{
for (e = x; d; d++, e++)
e->a = e->b = (int) (__UINTPTR_TYPE__) e;
}

View File

@ -8001,6 +8001,10 @@ vectorizable_induction (loop_vec_info loop_vinfo,
{
/* The scalar inits of the IVs if not vectorized. */
elt = inits[(ivn*const_nunits + eltn) % group_size];
if (!useless_type_conversion_p (TREE_TYPE (vectype),
TREE_TYPE (elt)))
elt = gimple_build (&init_stmts, VIEW_CONVERT_EXPR,
TREE_TYPE (vectype), elt);
init_elts.quick_push (elt);
}
/* The number of steps to add to the initial values. */