Commit 77eefb71 by Richard Biener Committed by Richard Biener

re PR tree-optimization/81633 (Incorrect floating point result with tree vectoriser)

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

	PR tree-optimization/81633
	Revert
	2015-08-17  Alan Hayward  <alan.hayward@arm.com>

	PR tree-optimization/71752
	* tree-vect-slp.c (vect_get_slp_defs): Handle null operands.

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

From-SVN: r250811
parent cade047f
2017-08-02 Richard Biener <rguenther@suse.de>
PR tree-optimization/81633
Revert
2015-08-17 Alan Hayward <alan.hayward@arm.com>
PR tree-optimization/71752
* tree-vect-slp.c (vect_get_slp_defs): Handle null operands.
2017-08-01 Daniel Santos <daniel.santos@pobox.com> 2017-08-01 Daniel Santos <daniel.santos@pobox.com>
* config/i386/i386.h (ix86_frame::outlined_save_offset): Remove field. * config/i386/i386.h (ix86_frame::outlined_save_offset): Remove field.
......
2017-08-02 Richard Biener <rguenther@suse.de>
PR tree-optimization/81633
* gcc.dg/vect/pr81633.c: New testcase.
2017-08-01 H.J. Lu <hongjiu.lu@intel.com> 2017-08-01 H.J. Lu <hongjiu.lu@intel.com>
* gcc.dg/guality/pr25967-3.c: New test. * gcc.dg/guality/pr25967-3.c: New test.
......
/* { 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;
}
...@@ -3325,32 +3325,24 @@ vect_get_slp_defs (vec<tree> ops, slp_tree slp_node, ...@@ -3325,32 +3325,24 @@ vect_get_slp_defs (vec<tree> ops, slp_tree slp_node,
{ {
gimple *first_stmt; gimple *first_stmt;
int number_of_vects = 0, i; int number_of_vects = 0, i;
unsigned int child_index = 0;
HOST_WIDE_INT lhs_size_unit, rhs_size_unit; HOST_WIDE_INT lhs_size_unit, rhs_size_unit;
slp_tree child = NULL; slp_tree child = NULL;
vec<tree> vec_defs; vec<tree> vec_defs;
tree oprnd; tree oprnd;
bool first_iteration = true; bool vectorized_defs;
first_stmt = SLP_TREE_SCALAR_STMTS (slp_node)[0]; first_stmt = SLP_TREE_SCALAR_STMTS (slp_node)[0];
FOR_EACH_VEC_ELT (ops, i, oprnd) FOR_EACH_VEC_ELT (ops, i, oprnd)
{ {
bool vectorized_defs = false;
if (oprnd == NULL)
{
vec_defs = vNULL;
vec_defs.create (0);
vec_oprnds->quick_push (vec_defs);
continue;
}
/* For each operand we check if it has vectorized definitions in a child /* For each operand we check if it has vectorized definitions in a child
node or we need to create them (for invariants and constants). We 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. 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 If it does, we found the correct child. Otherwise, we call
vect_get_constant_vectors (). */ vect_get_constant_vectors (), and not advance CHILD_INDEX in order
for (unsigned int child_index = 0; to check this child node for the next operand. */
child_index < SLP_TREE_CHILDREN (slp_node).length (); child_index++) vectorized_defs = false;
if (SLP_TREE_CHILDREN (slp_node).length () > child_index)
{ {
child = SLP_TREE_CHILDREN (slp_node)[child_index]; child = SLP_TREE_CHILDREN (slp_node)[child_index];
...@@ -3375,25 +3367,30 @@ vect_get_slp_defs (vec<tree> ops, slp_tree slp_node, ...@@ -3375,25 +3367,30 @@ vect_get_slp_defs (vec<tree> ops, slp_tree slp_node,
statements. */ statements. */
number_of_vects = SLP_TREE_NUMBER_OF_VEC_STMTS (child); number_of_vects = SLP_TREE_NUMBER_OF_VEC_STMTS (child);
vectorized_defs = true; vectorized_defs = true;
break; child_index++;
} }
} }
else
child_index++;
} }
if (!vectorized_defs && first_iteration) if (!vectorized_defs)
{ {
number_of_vects = SLP_TREE_NUMBER_OF_VEC_STMTS (slp_node); if (i == 0)
/* Number of vector stmts was calculated according to LHS in {
vect_schedule_slp_instance (), fix it by replacing LHS with number_of_vects = SLP_TREE_NUMBER_OF_VEC_STMTS (slp_node);
RHS, if necessary. See vect_get_smallest_scalar_type () for /* Number of vector stmts was calculated according to LHS in
details. */ vect_schedule_slp_instance (), fix it by replacing LHS with
vect_get_smallest_scalar_type (first_stmt, &lhs_size_unit, RHS, if necessary. See vect_get_smallest_scalar_type () for
&rhs_size_unit); details. */
if (rhs_size_unit != lhs_size_unit) vect_get_smallest_scalar_type (first_stmt, &lhs_size_unit,
{ &rhs_size_unit);
number_of_vects *= rhs_size_unit; if (rhs_size_unit != lhs_size_unit)
number_of_vects /= lhs_size_unit; {
} number_of_vects *= rhs_size_unit;
number_of_vects /= lhs_size_unit;
}
}
} }
/* Allocate memory for vectorized defs. */ /* Allocate memory for vectorized defs. */
...@@ -3411,8 +3408,6 @@ vect_get_slp_defs (vec<tree> ops, slp_tree slp_node, ...@@ -3411,8 +3408,6 @@ vect_get_slp_defs (vec<tree> ops, slp_tree slp_node,
number_of_vects); number_of_vects);
vec_oprnds->quick_push (vec_defs); vec_oprnds->quick_push (vec_defs);
first_iteration = false;
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment