From: Richard Sandiford Date: Sat, 20 Jul 2019 18:49:59 +0000 (+0000) Subject: Fix folding of vector EQ/NE X-Git-Tag: releases/gcc-9.2.0~129 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=76eeeaa4bb9122eb42e32d605cbb6d6e101217ff;p=thirdparty%2Fgcc.git 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-20 Richard Sandiford gcc/ Backport from mainline 2019-07-10 Richard Sandiford * fold-const.c (fold_relational_const): Fix folding of vector-to-scalar NE_EXPRs. (test_vector_folding): Add more tests. From-SVN: r273634 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index af38e8be96a3..30b2ea0255ab 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2019-07-20 Richard Sandiford + + Backport from mainline + 2019-07-10 Richard Sandiford + + * fold-const.c (fold_relational_const): Fix folding of + vector-to-scalar NE_EXPRs. + (test_vector_folding): Add more tests. + 2019-07-19 Jason Merrill PR c++/82081 - tail call optimization breaks noexcept diff --git a/gcc/fold-const.c b/gcc/fold-const.c index a6b0b53be398..f0e43b5fda23 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -14050,13 +14050,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)) @@ -14827,6 +14827,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; @@ -14834,6 +14835,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. */