On Wed, Mar 13, 2024 at 3:39 PM Joe Ramsay <joe.ram...@arm.com> wrote: > > This optimisation does not honour signed zeros, so should not be > enabled except with -fno-signed-zeros. > > OK for master? I do not have commit rights for GCC, so if the patch > is fine would someone be able to commit for me? The bug is present > in all GCC versions from 12.1.0 onwards - is it possible to backport > this? > > Bootstrapped Regtested on aarch64-none-linux-gnu and no issues. > > Thanks, > Joe > > gcc/ChangeLog: > > * match.pd: Fix truncation pattern for -fno-signed-zeroes > > gcc/testsuite/ChangeLog: > > * gcc.target/aarch64/no_merge_trunc_signed_zero.c: New test. > --- > gcc/match.pd | 2 +- > .../aarch64/no_merge_trunc_signed_zero.c | 24 +++++++++++++++++++ > 2 files changed, 25 insertions(+), 1 deletion(-) > create mode 100644 > gcc/testsuite/gcc.target/aarch64/no_merge_trunc_signed_zero.c > > diff --git a/gcc/match.pd b/gcc/match.pd > index 9ce313323a3..45c34c810cf 100644 > --- a/gcc/match.pd > +++ b/gcc/match.pd > @@ -4857,7 +4857,7 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) > #if GIMPLE > (simplify > (float (fix_trunc @0)) > - (if (!flag_trapping_math > + (if (!flag_trapping_math && !HONOR_SIGNED_ZEROS(type)
put the && to the next line and add a space before (type) OK with that change. Richard. > && types_match (type, TREE_TYPE (@0)) > && direct_internal_fn_supported_p (IFN_TRUNC, type, > OPTIMIZE_FOR_BOTH)) > diff --git a/gcc/testsuite/gcc.target/aarch64/no_merge_trunc_signed_zero.c > b/gcc/testsuite/gcc.target/aarch64/no_merge_trunc_signed_zero.c > new file mode 100644 > index 00000000000..b2c93e55567 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/aarch64/no_merge_trunc_signed_zero.c > @@ -0,0 +1,24 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O2 -fno-trapping-math -fsigned-zeros" } */ > + > +#include <math.h> > + > +float > +f1 (float x) > +{ > + return (int) rintf(x); > +} > + > +double > +f2 (double x) > +{ > + return (long) rint(x); > +} > + > +/* { dg-final { scan-assembler "frintx\\ts\[0-9\]+, s\[0-9\]+" } } */ > +/* { dg-final { scan-assembler "cvtzs\\ts\[0-9\]+, s\[0-9\]+" } } */ > +/* { dg-final { scan-assembler "scvtf\\ts\[0-9\]+, s\[0-9\]+" } } */ > +/* { dg-final { scan-assembler "frintx\\td\[0-9\]+, d\[0-9\]+" } } */ > +/* { dg-final { scan-assembler "cvtzs\\td\[0-9\]+, d\[0-9\]+" } } */ > +/* { dg-final { scan-assembler "scvtf\\td\[0-9\]+, d\[0-9\]+" } } */ > + > -- > 2.27.0 >