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
This commit is contained in:
parent
8ba8ebffc4
commit
2cb7362310
@ -1,3 +1,9 @@
|
||||
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
|
||||
|
@ -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 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)
|
||||
return NULL_TREE;
|
||||
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;
|
||||
if (!elts.new_binary_operation (type, op0, op1, false))
|
||||
@ -14803,6 +14803,7 @@ test_vector_folding ()
|
||||
tree type = build_vector_type (inner_type, 4);
|
||||
tree zero = build_zero_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. */
|
||||
tree res_type = boolean_type_node;
|
||||
@ -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 (NE_EXPR, res_type, zero, 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. */
|
||||
|
Loading…
Reference in New Issue
Block a user