On Wed, 19 Jun 2024, Andrew Pinski wrote:

> 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.

I think it should be OK for those.  The problematical ones are those
with no or partial vcond_mask support, but since we try to get
rid of vcond{,u,eq} that case should fix itself as well.

So no, I don't plan to fix anything besides pushing for the latter
to happen for GCC 15.

Richard.

> 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
> 

-- 
Richard Biener <rguent...@suse.de>
SUSE Software Solutions Germany GmbH,
Frankenstrasse 146, 90461 Nuernberg, Germany;
GF: Ivo Totev, Andrew McDonald, Werner Knoblich; (HRB 36809, AG Nuernberg)

Reply via email to