Commit 2cb73623 by Richard Sandiford Committed by Richard Sandiford

Fix folding of vector EQ/NE

For vector1 != vector2, we returned false if any elements were equal,
rather than if all elements were equal.

2019-07-10  Richard Sandiford  <richard.sandiford@arm.com>

gcc/
	* fold-const.c (fold_relational_const): Fix folding of
	vector-to-scalar NE_EXPRs.
	(test_vector_folding): Add more tests.

From-SVN: r273366
parent 8ba8ebff
2019-07-10 Richard Sandiford <richard.sandiford@arm.com> 2019-07-10 Richard Sandiford <richard.sandiford@arm.com>
* fold-const.c (fold_relational_const): Fix folding of
vector-to-scalar NE_EXPRs.
(test_vector_folding): Add more tests.
2019-07-10 Richard Sandiford <richard.sandiford@arm.com>
PR target/91060 PR target/91060
* config/arm/iterators.md (V2DI_ONLY): New mode iterator. * config/arm/iterators.md (V2DI_ONLY): New mode iterator.
* config/arm/neon.md (vec_set<mode>_internal): Add a '@' prefix. * config/arm/neon.md (vec_set<mode>_internal): Add a '@' prefix.
......
...@@ -14026,13 +14026,13 @@ fold_relational_const (enum tree_code code, tree type, tree op0, tree op1) ...@@ -14026,13 +14026,13 @@ fold_relational_const (enum tree_code code, tree type, tree op0, tree op1)
{ {
tree elem0 = VECTOR_CST_ELT (op0, i); tree elem0 = VECTOR_CST_ELT (op0, i);
tree elem1 = VECTOR_CST_ELT (op1, i); tree elem1 = VECTOR_CST_ELT (op1, i);
tree tmp = fold_relational_const (code, type, elem0, elem1); tree tmp = fold_relational_const (EQ_EXPR, type, elem0, elem1);
if (tmp == NULL_TREE) if (tmp == NULL_TREE)
return NULL_TREE; return NULL_TREE;
if (integer_zerop (tmp)) if (integer_zerop (tmp))
return constant_boolean_node (false, type); return constant_boolean_node (code == NE_EXPR, type);
} }
return constant_boolean_node (true, type); return constant_boolean_node (code == EQ_EXPR, type);
} }
tree_vector_builder elts; tree_vector_builder elts;
if (!elts.new_binary_operation (type, op0, op1, false)) if (!elts.new_binary_operation (type, op0, op1, false))
...@@ -14803,6 +14803,7 @@ test_vector_folding () ...@@ -14803,6 +14803,7 @@ test_vector_folding ()
tree type = build_vector_type (inner_type, 4); tree type = build_vector_type (inner_type, 4);
tree zero = build_zero_cst (type); tree zero = build_zero_cst (type);
tree one = build_one_cst (type); tree one = build_one_cst (type);
tree index = build_index_vector (type, 0, 1);
/* Verify equality tests that return a scalar boolean result. */ /* Verify equality tests that return a scalar boolean result. */
tree res_type = boolean_type_node; tree res_type = boolean_type_node;
...@@ -14810,6 +14811,13 @@ test_vector_folding () ...@@ -14810,6 +14811,13 @@ test_vector_folding ()
ASSERT_TRUE (integer_nonzerop (fold_build2 (EQ_EXPR, res_type, zero, zero))); ASSERT_TRUE (integer_nonzerop (fold_build2 (EQ_EXPR, res_type, zero, zero)));
ASSERT_TRUE (integer_nonzerop (fold_build2 (NE_EXPR, res_type, zero, one))); ASSERT_TRUE (integer_nonzerop (fold_build2 (NE_EXPR, res_type, zero, one)));
ASSERT_FALSE (integer_nonzerop (fold_build2 (NE_EXPR, res_type, one, one))); ASSERT_FALSE (integer_nonzerop (fold_build2 (NE_EXPR, res_type, one, one)));
ASSERT_TRUE (integer_nonzerop (fold_build2 (NE_EXPR, res_type, index, one)));
ASSERT_FALSE (integer_nonzerop (fold_build2 (EQ_EXPR, res_type,
index, one)));
ASSERT_FALSE (integer_nonzerop (fold_build2 (NE_EXPR, res_type,
index, index)));
ASSERT_TRUE (integer_nonzerop (fold_build2 (EQ_EXPR, res_type,
index, index)));
} }
/* Verify folding of VEC_DUPLICATE_EXPRs. */ /* Verify folding of VEC_DUPLICATE_EXPRs. */
......
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