re PR tree-optimization/71752 (ICE in compute_live_loop_exits, at tree-ssa-loop-manip.c:229 w/ -O1 -ftree-vectorize)

2017-08-01  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/71752
	PR tree-optimization/81633
	* tree-vect-slp.c (vect_get_slp_defs): Handle null operands
	in the original suggested way.

	* gcc.dg/vect/pr81633.c: New testcase.

From-SVN: r250779
This commit is contained in:
Richard Biener 2017-08-01 13:58:13 +00:00 committed by Richard Biener
parent 2d55c24f77
commit d90e0fb9ae
4 changed files with 75 additions and 20 deletions

View File

@ -1,3 +1,10 @@
2017-08-01 Richard Biener <rguenther@suse.de>
PR tree-optimization/71752
PR tree-optimization/81633
* tree-vect-slp.c (vect_get_slp_defs): Handle null operands
in the original suggested way.
2017-08-01 Richard Sandiford <richard.sandiford@linaro.org>
PR tree-optimization/80769

View File

@ -1,3 +1,9 @@
2017-08-01 Richard Biener <rguenther@suse.de>
PR tree-optimization/71752
PR tree-optimization/81633
* gcc.dg/vect/pr81633.c: New testcase.
2017-08-01 Richard Sandiford <richard.sandiford@linaro.org>
PR tree-optimization/80769

View File

@ -0,0 +1,33 @@
/* { dg-do run } */
static double identity[4][4] = {{1, 0, 0, 0},
{0, 1, 0, 0},
{0, 0, 1, 0},
{0, 0, 0, 1}};
static double expected[4][4] = {{1, 0, 0, 0},
{0, 0, 0, 0},
{0, 0, 0, 0},
{0, 0, 0, 0}};
static void __attribute__((noinline,noclone))
kernel(double A[4][4])
{
double tmp[4][4];
for (int j = 0; j < 4; j++)
for (int k = 0; k < 4; k++)
tmp[j][k] = identity[j][0] * identity[j][k];
for (int j = 0; j < 4; j++ )
for (int k = 0; k < 4; k++)
A[j][k] = tmp[j][k];
}
int main(void)
{
double A[4][4] = {{0.0}};
kernel(A);
for ( int i = 0; i < 4; i++ )
for ( int j = 0; j < 4; j++ )
if (A[i][j] != expected[i][j])
__builtin_abort ();
return 0;
}

View File

@ -3289,19 +3289,22 @@ vect_get_slp_defs (vec<tree> ops, slp_tree slp_node,
{
gimple *first_stmt;
int number_of_vects = 0, i;
unsigned int child_index = 0;
HOST_WIDE_INT lhs_size_unit, rhs_size_unit;
slp_tree child = NULL;
vec<tree> vec_defs;
tree oprnd;
bool vectorized_defs;
bool first_iteration = true;
first_stmt = SLP_TREE_SCALAR_STMTS (slp_node)[0];
FOR_EACH_VEC_ELT (ops, i, oprnd)
{
bool vectorized_defs = false;
if (oprnd == NULL)
{
/* Only vectorizable_reduction will call us with a NULL op which
will always match the reduction operand for which we have no
SLP child. */
vec_defs = vNULL;
vec_defs.create (0);
vec_oprnds->quick_push (vec_defs);
@ -3312,9 +3315,10 @@ vect_get_slp_defs (vec<tree> ops, slp_tree slp_node,
node or we need to create them (for invariants and constants). We
check if the LHS of the first stmt of the next child matches OPRND.
If it does, we found the correct child. Otherwise, we call
vect_get_constant_vectors (). */
for (unsigned int child_index = 0;
child_index < SLP_TREE_CHILDREN (slp_node).length (); child_index++)
vect_get_constant_vectors (), and not advance CHILD_INDEX in order
to check this child node for the next operand. */
vectorized_defs = false;
if (SLP_TREE_CHILDREN (slp_node).length () > child_index)
{
child = SLP_TREE_CHILDREN (slp_node)[child_index];
@ -3334,25 +3338,30 @@ vect_get_slp_defs (vec<tree> ops, slp_tree slp_node,
statements. */
number_of_vects = SLP_TREE_NUMBER_OF_VEC_STMTS (child);
vectorized_defs = true;
break;
child_index++;
}
}
else
child_index++;
}
if (!vectorized_defs && first_iteration)
{
number_of_vects = SLP_TREE_NUMBER_OF_VEC_STMTS (slp_node);
/* Number of vector stmts was calculated according to LHS in
vect_schedule_slp_instance (), fix it by replacing LHS with
RHS, if necessary. See vect_get_smallest_scalar_type () for
details. */
vect_get_smallest_scalar_type (first_stmt, &lhs_size_unit,
&rhs_size_unit);
if (rhs_size_unit != lhs_size_unit)
{
number_of_vects *= rhs_size_unit;
number_of_vects /= lhs_size_unit;
}
if (!vectorized_defs)
{
if (first_iteration)
{
number_of_vects = SLP_TREE_NUMBER_OF_VEC_STMTS (slp_node);
/* Number of vector stmts was calculated according to LHS in
vect_schedule_slp_instance (), fix it by replacing LHS with
RHS, if necessary. See vect_get_smallest_scalar_type () for
details. */
vect_get_smallest_scalar_type (first_stmt, &lhs_size_unit,
&rhs_size_unit);
if (rhs_size_unit != lhs_size_unit)
{
number_of_vects *= rhs_size_unit;
number_of_vects /= lhs_size_unit;
}
}
}
/* Allocate memory for vectorized defs. */