https://gcc.gnu.org/g:13bf9232fc1ec2cb7be85b628a6f2d5ed15510d9
commit r13-8664-g13bf9232fc1ec2cb7be85b628a6f2d5ed15510d9 Author: Joe Ramsay <joe.ram...@arm.com> Date: Fri Mar 15 09:20:45 2024 +0000 match.pd: Only merge truncation with conversion for -fno-signed-zeros This optimisation does not honour signed zeros, so should not be enabled except with -fno-signed-zeros. 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. (cherry picked from commit 7dd3b2b09cbeb6712ec680a0445cb0ad41070423) Diff: --- gcc/match.pd | 1 + .../aarch64/no_merge_trunc_signed_zero.c | 24 ++++++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/gcc/match.pd b/gcc/match.pd index 47e48fa2ca5..dc34e7ead9f 100644 --- a/gcc/match.pd +++ b/gcc/match.pd @@ -4188,6 +4188,7 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) (simplify (float (fix_trunc @0)) (if (!flag_trapping_math + && !HONOR_SIGNED_ZEROS (type) && 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\]+" } } */ +