IBM Z: Fix PR96456
authorAndreas Krebbel <krebbel@linux.ibm.com>
Wed, 12 Aug 2020 06:02:34 +0000 (08:02 +0200)
committerAndreas Krebbel <krebbel@linux.ibm.com>
Wed, 12 Aug 2020 06:04:39 +0000 (08:04 +0200)
The testcase failed because our backend refuses to generate vector
compare instructions for signaling operators with -fno-trapping-math
-fno-finite-math-only.

gcc/ChangeLog:

PR target/96456
* config/s390/s390.h (TARGET_NONSIGNALING_VECTOR_COMPARE_OK): New
macro.
* config/s390/vector.md (vcond_comparison_operator): Use new macro
for the check.

gcc/testsuite/ChangeLog:

PR target/96456
* gcc.target/s390/pr96456.c: New test.

gcc/config/s390/s390.h
gcc/config/s390/vector.md
gcc/testsuite/gcc.target/s390/pr96456.c [new file with mode: 0644]

index e4ef63e4080818ecd12bbaf7347966218fadd791..ec5128c0af23bb1989dc7b576706536811fadab4 100644 (file)
@@ -175,6 +175,11 @@ enum processor_flags
 #define TARGET_VECTOR_LOADSTORE_ALIGNMENT_HINTS 0
 #endif
 
+/* Evaluate to true if it is ok to emit a non-signaling vector
+   comparison.  */
+#define TARGET_NONSIGNALING_VECTOR_COMPARE_OK \
+  (TARGET_VX && !TARGET_VXE && (flag_finite_math_only || !flag_trapping_math))
+
 #ifdef HAVE_AS_MACHINE_MACHINEMODE
 #define S390_USE_TARGET_ATTRIBUTE 1
 #else
index 08f2d4cbda69ab9089c074e31eee385e9e3c4126..131bbda09bcea43f51ed044fc2e91b794c209769 100644 (file)
     case GT:
     case LTGT:
       /* Signaling vector comparisons are supported only on z14+.  */
-      return TARGET_Z14;
+      return TARGET_VXE || TARGET_NONSIGNALING_VECTOR_COMPARE_OK;
     default:
       return true;
     }
   [(set (match_operand:<tointvec>         0 "register_operand" "=v")
        (gt:<tointvec> (match_operand:VFT 1 "register_operand" "v")
                       (match_operand:VFT 2 "register_operand" "v")))]
-  "TARGET_VX && !TARGET_VXE && flag_finite_math_only"
+  "TARGET_NONSIGNALING_VECTOR_COMPARE_OK"
   "<vw>fch<sdx>b\t%v0,%v1,%v2"
   [(set_attr "op_type" "VRR")])
 
   [(set (match_operand:<tointvec>         0 "register_operand" "=v")
        (ge:<tointvec> (match_operand:VFT 1 "register_operand" "v")
                       (match_operand:VFT 2 "register_operand" "v")))]
-  "TARGET_VX && !TARGET_VXE && flag_finite_math_only"
+  "TARGET_NONSIGNALING_VECTOR_COMPARE_OK"
   "<vw>fche<sdx>b\t%v0,%v1,%v2"
   [(set_attr "op_type" "VRR")])
 
diff --git a/gcc/testsuite/gcc.target/s390/pr96456.c b/gcc/testsuite/gcc.target/s390/pr96456.c
new file mode 100644 (file)
index 0000000..ea9e9cd
--- /dev/null
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 -std=gnu99 -ffast-math -fno-finite-math-only -march=z13" } */
+
+int b, c, d;
+double *e;
+int f() {
+  double *a = a;
+  int g = d, f = c, h = b;
+  if (__builtin_expect(f, 0))
+    for (; g < h; g++)
+      e[g] = (int)(a[g] >= 0.0 ? g + 0.99999999 : a[g]);
+  return 0;
+}