s390x: Fix fmin/fmax patterns

Message ID 20250916121303.51772-1-jchrist@linux.ibm.com
State New
Headers
Series s390x: Fix fmin/fmax patterns |

Commit Message

Juergen Christ Sept. 16, 2025, 12:13 p.m. UTC
  s390x floating point minimum and maximum functions unfortunately do
not canonicalize NaNs.  Hence, test pr105414.c fails since
c476f554e3f.  Fix this by only allowing fmin/fmax pattern if trapping
math is disabled.

Bootstrapped and reg-tested on s390x.  Ok for trunk?

gcc/ChangeLog:

	* config/s390/vector.md (fmax<mode>3): Restrict to no trapping
	math.
	(fmin<mode>3): Ditto.

gcc/testsuite/ChangeLog:

	* gcc.target/s390/fminmax-1.c: Force no trapping math.
	* gcc.target/s390/fminmax-2.c: Ditto.
	* gcc.target/s390/vector/reduc-minmax-1.c: Ditto.

Signed-off-by: Juergen Christ <jchrist@linux.ibm.com>
---
 gcc/config/s390/vector.md                             | 8 ++++----
 gcc/testsuite/gcc.target/s390/fminmax-1.c             | 2 +-
 gcc/testsuite/gcc.target/s390/fminmax-2.c             | 2 +-
 gcc/testsuite/gcc.target/s390/vector/reduc-minmax-1.c | 2 +-
 4 files changed, 7 insertions(+), 7 deletions(-)
  

Comments

Stefan Schulze Frielinghaus Oct. 10, 2025, 12:12 p.m. UTC | #1
On Tue, Sep 16, 2025 at 02:13:03PM +0200, Juergen Christ wrote:
> s390x floating point minimum and maximum functions unfortunately do
> not canonicalize NaNs.  Hence, test pr105414.c fails since
> c476f554e3f.  Fix this by only allowing fmin/fmax pattern if trapping
> math is disabled.
> 
> Bootstrapped and reg-tested on s390x.  Ok for trunk?

Option -fno-trapping-math implies -fno-signaling-nans so the former is
definitely fine.  Just wondering whether -fno-signaling-nans alone is
already enough here?

Anyhow, with either option it is ok.

Thanks,
Stefan
  

Patch

diff --git a/gcc/config/s390/vector.md b/gcc/config/s390/vector.md
index 205ead2ca9d8..70832ea72c11 100644
--- a/gcc/config/s390/vector.md
+++ b/gcc/config/s390/vector.md
@@ -3663,7 +3663,7 @@ 
 	       (match_operand:VFT_BFP           2 "register_operand")
 	       (const_int 4)]
 	      UNSPEC_FMAX))]
-  "TARGET_VXE")
+  "TARGET_VXE && !flag_trapping_math")
 
 ; fmin
 (define_expand "fmin<mode>3"
@@ -3672,7 +3672,7 @@ 
 	       (match_operand:VFT_BFP           2 "register_operand")
 	       (const_int 4)]
 	      UNSPEC_FMIN))]
-  "TARGET_VXE")
+  "TARGET_VXE && !flag_trapping_math")
 
 ; reduc_plus
 (define_expand "reduc_plus_scal_<mode>"
@@ -3764,7 +3764,7 @@ 
 	(unspec:V2DF [(match_dup 1) (match_dup 2) (const_int 4)] REDUC_FMINMAX))
    (set (match_operand:DF 0 "register_operand" "")
 	(vec_select:DF (match_dup 3) (parallel [(const_int 0)])))]
-  "TARGET_VX"
+  "TARGET_VX && !flag_trapping_math"
 {
   operands[2] = gen_reg_rtx (V2DFmode);
   operands[3] = gen_reg_rtx (V2DFmode);
@@ -3787,7 +3787,7 @@ 
 	(unspec:V4SF [(match_dup 3) (match_dup 4) (const_int 4)] REDUC_FMINMAX))
    (set (match_operand:SF 0 "register_operand")
 	(vec_select:SF (match_dup 5) (parallel [(const_int 0)])))]
-   "TARGET_VXE"
+   "TARGET_VXE && !flag_trapping_math"
 {
   operands[2] = gen_reg_rtx (V4SFmode);
   operands[3] = gen_reg_rtx (V4SFmode);
diff --git a/gcc/testsuite/gcc.target/s390/fminmax-1.c b/gcc/testsuite/gcc.target/s390/fminmax-1.c
index df10905f037a..756a19970a50 100644
--- a/gcc/testsuite/gcc.target/s390/fminmax-1.c
+++ b/gcc/testsuite/gcc.target/s390/fminmax-1.c
@@ -1,7 +1,7 @@ 
 /* Check fmin/fmax expanders for scalars on VXE targets.  */
 
 /* { dg-do compile } */
-/* { dg-options "-O2 -march=z14 -mzarch" } */
+/* { dg-options "-O2 -march=z14 -mzarch -fno-trapping-math" } */
 /* { dg-final { check-function-bodies "**" "" } } */
 
 /*
diff --git a/gcc/testsuite/gcc.target/s390/fminmax-2.c b/gcc/testsuite/gcc.target/s390/fminmax-2.c
index ea37a0a821de..ac090c65d1bd 100644
--- a/gcc/testsuite/gcc.target/s390/fminmax-2.c
+++ b/gcc/testsuite/gcc.target/s390/fminmax-2.c
@@ -1,7 +1,7 @@ 
 /* Check fmin/fmax expanders for scalars on non-VXE targets.  */
 
 /* { dg-do compile } */
-/* { dg-options "-O2 -march=z13 -mzarch" } */
+/* { dg-options "-O2 -march=z13 -mzarch -fno-trapping-math" } */
 /* { dg-final { scan-assembler-times "jg" 4 } } */
 
 double
diff --git a/gcc/testsuite/gcc.target/s390/vector/reduc-minmax-1.c b/gcc/testsuite/gcc.target/s390/vector/reduc-minmax-1.c
index 5295250dcb74..7f4d16a03ddd 100644
--- a/gcc/testsuite/gcc.target/s390/vector/reduc-minmax-1.c
+++ b/gcc/testsuite/gcc.target/s390/vector/reduc-minmax-1.c
@@ -1,5 +1,5 @@ 
 /* { dg-do compile } */
-/* { dg-options "-O3 -mzarch -march=z14 -ftree-vectorize -fdump-tree-optimized" } */
+/* { dg-options "-O3 -mzarch -march=z14 -ftree-vectorize -fdump-tree-optimized -fno-trapping-math" } */
 
 #define MAX(a, b) ((a) > (b) ? (a) : (b))
 #define MIN(a, b) ((a) > (b) ? (b) : (a))