On Fri, 23 Feb 2024, Jakub Jelinek wrote:

> On Fri, Feb 23, 2024 at 02:43:45PM +0100, Juergen Christ wrote:
> > The emulation via word mode tries to perform integer arithmetic on floating
> > point values instead of floating point arithmetic.  This leads to
> > mis-compilations.
> > 
> > Failure occured on s390x on these existing test cases:
> > gcc.dg/vect/tsvc/vect-tsvc-s112.c
> > gcc.dg/vect/tsvc/vect-tsvc-s113.c
> > gcc.dg/vect/tsvc/vect-tsvc-s119.c
> > gcc.dg/vect/tsvc/vect-tsvc-s121.c
> > gcc.dg/vect/tsvc/vect-tsvc-s131.c
> > gcc.dg/vect/tsvc/vect-tsvc-s132.c
> > gcc.dg/vect/tsvc/vect-tsvc-s2233.c
> > gcc.dg/vect/tsvc/vect-tsvc-s421.c
> > gcc.dg/vect/vect-alias-check-14.c
> > gcc.target/s390/vector/partial/s390-vec-length-epil-run-1.c
> > gcc.target/s390/vector/partial/s390-vec-length-epil-run-3.c
> > gcc.target/s390/vector/partial/s390-vec-length-full-run-3.c
> > 
> > gcc/ChangeLog:
> > 
> 
> Please add
>       PR tree-optimization/114075
> above the * tree-vect-stmts line.
> >     * tree-vect-stmts.cc (vectorizable_operation): Don't emulate floating
> >           point vectors
> 
> This line should be tab indented like the first one, and end with .
> And given what the patch does, perhaps say non-integral instead of floating
> point.
> 
> As for testcase, I'll handle it separately, given that it already
> fixes some pre-existing tests.
> 
> > Signed-off-by: Juergen Christ <jchr...@linux.ibm.com>
> > ---
> >  gcc/tree-vect-stmts.cc | 3 ++-
> >  1 file changed, 2 insertions(+), 1 deletion(-)
> > 
> > diff --git a/gcc/tree-vect-stmts.cc b/gcc/tree-vect-stmts.cc
> > index 09749ae38174..f95ff2c2aa34 100644
> > --- a/gcc/tree-vect-stmts.cc
> > +++ b/gcc/tree-vect-stmts.cc
> > @@ -6756,7 +6756,8 @@ vectorizable_operation (vec_info *vinfo,
> >      those through even when the mode isn't word_mode.  For
> >      ops we have to lower the lowering code assumes we are
> >      dealing with word_mode.  */
> > -      if ((((code == PLUS_EXPR || code == MINUS_EXPR || code == 
> > NEGATE_EXPR)
> > +      if (!INTEGRAL_TYPE_P (TREE_TYPE (vectype))
> > +     || (((code == PLUS_EXPR || code == MINUS_EXPR || code == NEGATE_EXPR)
> >         || !target_support_p)
> >        && maybe_ne (GET_MODE_SIZE (vec_mode), UNITS_PER_WORD))
> >       /* Check only during analysis.  */

I think it will work fine.  Even after the last TLC this feels like in
the need of more TLC ;)

So OK.  Also for affected branches - the effective check should be the
same in GCC 13 at least, but with some added ad-hoc costing which might
make this not trigger (maybe_lt (nunits_out, 4U)) - so we'd need a
word_mode that can cover 4 FP elements.  Possibly triggerable with
HFmode?

Thanks,
Richard.

> LGTM, but please wait until Monday evening so that Richi or Richard
> have a chance to chime in.
> 
>       Jakub
> 
> 

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