aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-vect-slp.c
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2017-08-02 06:38:36 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2017-08-02 06:38:36 +0000
commit77eefb7122d544b9e22a7f40a92320742c23e74b (patch)
tree3fe8896c28c473fc15dff71f0a24611cf411b4a4 /gcc/tree-vect-slp.c
parentcade047f198bac6ef399a7b4dae95722b6b7b869 (diff)
downloadgcc-77eefb7122d544b9e22a7f40a92320742c23e74b.zip
gcc-77eefb7122d544b9e22a7f40a92320742c23e74b.tar.gz
gcc-77eefb7122d544b9e22a7f40a92320742c23e74b.tar.bz2
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
Diffstat (limited to 'gcc/tree-vect-slp.c')
-rw-r--r--gcc/tree-vect-slp.c57
1 files changed, 26 insertions, 31 deletions
diff --git a/gcc/tree-vect-slp.c b/gcc/tree-vect-slp.c
index 15d589d..032a944 100644
--- a/gcc/tree-vect-slp.c
+++ b/gcc/tree-vect-slp.c
@@ -3325,32 +3325,24 @@ 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 first_iteration = true;
+ bool vectorized_defs;
first_stmt = SLP_TREE_SCALAR_STMTS (slp_node)[0];
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
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];
@@ -3375,25 +3367,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 (i == 0)
+ {
+ 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. */
@@ -3411,8 +3408,6 @@ vect_get_slp_defs (vec<tree> ops, slp_tree slp_node,
number_of_vects);
vec_oprnds->quick_push (vec_defs);
-
- first_iteration = false;
}
}