From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1666) id 333083858C41; Mon, 26 Feb 2024 07:43:09 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 333083858C41 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1708933389; bh=pJ01qMOUmUmH5yQ2w7ln4XlxYKXLXYC7Q2DstLjLUr0=; h=From:To:Subject:Date:From; b=rxUG40HJNNmSfDoHpl0dvCAzj8E5YXxYUcFa/sP8TzULZ4bVTxmw+R/b1pwrZsKW/ 27LIy0S/x2TSjwOWogY5NwyRJBd7e8ffgstb4wZaRT2cmluPVXjXPWRorWeKCgFQ/1 gbhn2Tz2NuRS+TM8DRu6x0uOuCH5/ld2ZlR5LIL0= MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Richard Biener To: gcc-cvs@gcc.gnu.org Subject: [gcc r14-9173] middle-end/114070 - folding breaking VEC_COND expansion X-Act-Checkin: gcc X-Git-Author: Richard Biener X-Git-Refname: refs/heads/master X-Git-Oldrev: 6987f16742bd4fc6bb8118b9efde52fb9169b327 X-Git-Newrev: af66ad89e8169f44db723813662917cf4cbb78fc Message-Id: <20240226074309.333083858C41@sourceware.org> Date: Mon, 26 Feb 2024 07:43:09 +0000 (GMT) List-Id: https://gcc.gnu.org/g:af66ad89e8169f44db723813662917cf4cbb78fc commit r14-9173-gaf66ad89e8169f44db723813662917cf4cbb78fc Author: Richard Biener Date: Fri Feb 23 16:06:05 2024 +0100 middle-end/114070 - folding breaking VEC_COND expansion The following properly guards the simplifications that move operations into VEC_CONDs, in particular when that changes the type constraints on this operation. This needed a genmatch fix which was recording spurious implicit fors when tcc_comparison is used in a C expression. PR middle-end/114070 * genmatch.cc (parser::parse_c_expr): Do not record operand lists but only mark operators used. * match.pd ((c ? a : b) op (c ? d : e) --> c ? (a op d) : (b op e)): Properly guard the case of tcc_comparison changing the VEC_COND value operand type. * gcc.dg/torture/pr114070.c: New testcase. Diff: --- gcc/genmatch.cc | 6 ++---- gcc/match.pd | 15 ++++++++++++--- gcc/testsuite/gcc.dg/torture/pr114070.c | 12 ++++++++++++ 3 files changed, 26 insertions(+), 7 deletions(-) diff --git a/gcc/genmatch.cc b/gcc/genmatch.cc index 5e92d0b4af2e..61c4c8c02949 100644 --- a/gcc/genmatch.cc +++ b/gcc/genmatch.cc @@ -4749,10 +4749,8 @@ parser::parse_c_expr (cpp_ttype start) = (const char *)CPP_HASHNODE (token->val.node.node)->ident.str; if (strcmp (str, "return") == 0) fatal_at (token, "return statement not allowed in C expression"); - id_base *idb = get_operator (str); - user_id *p; - if (idb && (p = dyn_cast (idb)) && p->is_oper_list) - record_operlist (token->src_loc, p); + /* Mark user operators corresponding to 'str' as used. */ + get_operator (str); } /* Record the token. */ diff --git a/gcc/match.pd b/gcc/match.pd index c5b6540f939a..67007fc2017f 100644 --- a/gcc/match.pd +++ b/gcc/match.pd @@ -5149,15 +5149,24 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) /* (c ? a : b) op (c ? d : e) --> c ? (a op d) : (b op e) */ (simplify (op (vec_cond:s @0 @1 @2) (vec_cond:s @0 @3 @4)) - (vec_cond @0 (op! @1 @3) (op! @2 @4))) + (if (TREE_CODE_CLASS (op) != tcc_comparison + || types_match (type, TREE_TYPE (@1)) + || expand_vec_cond_expr_p (type, TREE_TYPE (@0), ERROR_MARK)) + (vec_cond @0 (op! @1 @3) (op! @2 @4)))) /* (c ? a : b) op d --> c ? (a op d) : (b op d) */ (simplify (op (vec_cond:s @0 @1 @2) @3) - (vec_cond @0 (op! @1 @3) (op! @2 @3))) + (if (TREE_CODE_CLASS (op) != tcc_comparison + || types_match (type, TREE_TYPE (@1)) + || expand_vec_cond_expr_p (type, TREE_TYPE (@0), ERROR_MARK)) + (vec_cond @0 (op! @1 @3) (op! @2 @3)))) (simplify (op @3 (vec_cond:s @0 @1 @2)) - (vec_cond @0 (op! @3 @1) (op! @3 @2)))) + (if (TREE_CODE_CLASS (op) != tcc_comparison + || types_match (type, TREE_TYPE (@1)) + || expand_vec_cond_expr_p (type, TREE_TYPE (@0), ERROR_MARK)) + (vec_cond @0 (op! @3 @1) (op! @3 @2))))) #if GIMPLE (match (nop_atomic_bit_test_and_p @0 @1 @4) diff --git a/gcc/testsuite/gcc.dg/torture/pr114070.c b/gcc/testsuite/gcc.dg/torture/pr114070.c new file mode 100644 index 000000000000..cf46ec45a042 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr114070.c @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-additional-options "-fno-vect-cost-model" } */ + +int unresolved(unsigned dirmask, unsigned mask, int *unresolved_n) +{ + for (int i = 0; i < 1024; i++) { + mask |= 1; + if (!unresolved_n[i] || unresolved_n[i] & 70000) + dirmask |= 1; + } + return (dirmask == mask); +}