[PATCH 1/3] S/390: Do not use signaling vector comparisons on z13
authorIlya Leoshkevich <iii@linux.ibm.com>
Thu, 10 Oct 2019 17:00:29 +0000 (17:00 +0000)
committerIlya Leoshkevich <iii@gcc.gnu.org>
Thu, 10 Oct 2019 17:00:29 +0000 (17:00 +0000)
z13 supports only non-signaling vector comparisons.  This means we
cannot vectorize LT, LE, GT, GE and LTGT when compiling for z13.  Notify
middle-end about this by using more restrictive operator predicate in
vcond<V_HW:mode><V_HW2:mode>.

gcc/ChangeLog:

2019-10-10  Ilya Leoshkevich  <iii@linux.ibm.com>

PR target/77918
* config/s390/vector.md (vcond_comparison_operator): New
predicate.
(vcond<V_HW:mode><V_HW2:mode>): Use vcond_comparison_operator.

From-SVN: r276842

gcc/ChangeLog
gcc/config/s390/vector.md

index e3c1a4f0717c149ee2008eba686e254c8138745e..9c34213997f0c83c782058380bd91c0d0a6be4cf 100644 (file)
@@ -1,3 +1,10 @@
+2019-10-10  Ilya Leoshkevich  <iii@linux.ibm.com>
+
+       PR target/77918
+       * config/s390/vector.md (vcond_comparison_operator): New
+       predicate.
+       (vcond<V_HW:mode><V_HW2:mode>): Use vcond_comparison_operator.
+
 2019-10-10  David Malcolm  <dmalcolm@redhat.com>
 
        PR 87488
index 127b75f63f1db49c01f885dd378ece51e28d9f13..e50047b96e4cd83b8cbb739b46dd1f3651b7de76 100644 (file)
   operands[2] = GEN_INT (GET_MODE_NUNITS (<MODE>mode) - 1);
 })
 
+(define_predicate "vcond_comparison_operator"
+  (match_operand 0 "comparison_operator")
+{
+  if (!HONOR_NANS (GET_MODE (XEXP (op, 0)))
+      && !HONOR_NANS (GET_MODE (XEXP (op, 1))))
+    return true;
+  switch (GET_CODE (op))
+    {
+    case LE:
+    case LT:
+    case GE:
+    case GT:
+    case LTGT:
+      /* Signaling vector comparisons are supported only on z14+.  */
+      return TARGET_Z14;
+    default:
+      return true;
+    }
+})
+
 (define_expand "vcond<V_HW:mode><V_HW2:mode>"
   [(set (match_operand:V_HW 0 "register_operand" "")
        (if_then_else:V_HW
-        (match_operator 3 "comparison_operator"
+        (match_operator 3 "vcond_comparison_operator"
                         [(match_operand:V_HW2 4 "register_operand" "")
                          (match_operand:V_HW2 5 "nonmemory_operand" "")])
         (match_operand:V_HW 1 "nonmemory_operand" "")