On Wed, Jun 19, 2024 at 7:44 AM Vaseeharan Vinayagamoorthy
<vaseeharan.vinayagamoor...@arm.com> wrote:
>
> Hi,
>
> I have found that this patch has introduced a regression in the arm-none-eabi 
> toolchain for a testcase, which was previously passing:
>
> PASS->FAIL: gcc.dg/tree-ssa/andnot-2.c scan-tree-dump-not forwprop3 "_expr"
>
> The toolchain was built with:
> Build = x86_64-none-linux-gnu
> Host = x86_64-none-linux-gnu
> Target = arm-none-eabi
>
> This is also affecting the gcc-13 and gcc-14 branches.
> Could you please let me know the impact of this regression, and whether you 
> plan to fix the regression?

See the thread starting at
https://gcc.gnu.org/pipermail/gcc-patches/2024-February/646587.html
for information on the testcase regression and what needs to be done.
I suspect this only now effects targets which don't have a vector
modes enabled.

Note it is a (minor) missed optimization regression so the impact
looks to be small.
I am not sure if people have written code with this pattern, it
requires vectors and it fails only on targets where there is no vector
support enabled.
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95906

Thanks,
Andrew Pinski

>
>
> Kind regards,
> Vasee
>
> ________________________________________
> From: Richard Biener <rguent...@suse.de>
> Sent: 26 February 2024 07:42
> To: gcc-patches@gcc.gnu.org
> Subject: [PATCH] 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.
>
> Bootstrapped and tested on x86_64-unknown-linux-gnu, pushed.
>
>         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.
> ---
>  gcc/genmatch.cc                         |  6 ++----
>  gcc/match.pd                            | 15 ++++++++++++---
>  gcc/testsuite/gcc.dg/torture/pr114070.c | 12 ++++++++++++
>  3 files changed, 26 insertions(+), 7 deletions(-)
>  create mode 100644 gcc/testsuite/gcc.dg/torture/pr114070.c
>
> diff --git a/gcc/genmatch.cc b/gcc/genmatch.cc
> index 375ae90ae6c..d9ae436ce5c 100644
> --- a/gcc/genmatch.cc
> +++ b/gcc/genmatch.cc
> @@ -4760,10 +4760,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<user_id *> (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 c5b6540f939..67007fc2017 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 00000000000..cf46ec45a04
> --- /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);
> +}
> --
> 2.35.3

Reply via email to