https://gcc.gnu.org/g:a4a728cc6cbb0870e718befc23a863b77770d537

commit a4a728cc6cbb0870e718befc23a863b77770d537
Author: Michael Meissner <meiss...@linux.ibm.com>
Date:   Mon Feb 10 20:31:03 2025 -0500

    Revert changes

Diff:
---
 gcc/config/rs6000/predicates.md               |  8 +-----
 gcc/config/rs6000/rs6000-protos.h             | 17 +-----------
 gcc/config/rs6000/rs6000.cc                   | 37 +++++++--------------------
 gcc/config/rs6000/rs6000.h                    | 10 ++------
 gcc/config/rs6000/rs6000.md                   | 26 +++++++------------
 gcc/testsuite/gcc.target/powerpc/pr118541-1.c | 28 --------------------
 gcc/testsuite/gcc.target/powerpc/pr118541-2.c | 26 -------------------
 gcc/testsuite/gcc.target/powerpc/pr118541-3.c | 26 -------------------
 gcc/testsuite/gcc.target/powerpc/pr118541-4.c | 26 -------------------
 9 files changed, 22 insertions(+), 182 deletions(-)

diff --git a/gcc/config/rs6000/predicates.md b/gcc/config/rs6000/predicates.md
index 56fd6b55916f..647e89afb6a7 100644
--- a/gcc/config/rs6000/predicates.md
+++ b/gcc/config/rs6000/predicates.md
@@ -1466,14 +1466,8 @@
 ;; Return 1 if OP is a comparison operator suitable for vector/scalar
 ;; comparisons that generate a 0/-1 mask (i.e. the inverse of
 ;; fpmask_comparison_operator).
-;;
-;; On power9 and above, do not allow ordered comparisons to be inverted, since
-;; the XSCMP{EQ,GT,GE}DP instruction used in floating point conditional moves
-;; will trap if one of the inputs is a signalling NaN.
 (define_predicate "invert_fpmask_comparison_operator"
-  (ior (match_code "ne")
-       (and (match_code "unlt,unle")
-           (match_test "flag_finite_math_only || !TARGET_P9_VECTOR"))))
+  (match_code "ne,unlt,unle"))
 
 ;; Return 1 if OP is a comparison operation suitable for integer vector/scalar
 ;; comparisons that generate a -1/0 mask.
diff --git a/gcc/config/rs6000/rs6000-protos.h 
b/gcc/config/rs6000/rs6000-protos.h
index 524c463cb660..4619142d197b 100644
--- a/gcc/config/rs6000/rs6000-protos.h
+++ b/gcc/config/rs6000/rs6000-protos.h
@@ -114,23 +114,8 @@ extern const char *rs6000_sibcall_template (rtx *, 
unsigned int);
 extern const char *rs6000_indirect_call_template (rtx *, unsigned int);
 extern const char *rs6000_indirect_sibcall_template (rtx *, unsigned int);
 extern const char *rs6000_pltseq_template (rtx *, int);
-
-/* Whether we can reverse the sense of an ordered (UNLT, UNLE, UNGT, UNGE,
-   UNEQ, or LTGT) comairson.  If we are doing floating point conditional moves
-   on power9 and above, we cannot convert an ordered comparison to unordered,
-   since the instructions (XSCMP{EQ,GT,GE}DP) that are used for conditional
-   moves can trap if an argument is a signalling NaN.  However for normal jumps
-   we can reverse a comparison since we only use unordered compare instructions
-   which do not trap on signalling NaNs.  */
-
-enum reverse_condition_t {
-  REVERSE_CONDITION_NO_ORDERED,
-  REVERSE_CONDITION_ORDERED_OK
-};
-
 extern enum rtx_code rs6000_reverse_condition (machine_mode,
-                                              enum rtx_code,
-                                              enum reverse_condition_t);
+                                              enum rtx_code);
 extern rtx rs6000_emit_eqne (machine_mode, rtx, rtx, rtx);
 extern rtx rs6000_emit_fp_cror (rtx_code, machine_mode, rtx);
 extern void rs6000_emit_sCOND (machine_mode, rtx[]);
diff --git a/gcc/config/rs6000/rs6000.cc b/gcc/config/rs6000/rs6000.cc
index 21727e993712..f9f9a0b931db 100644
--- a/gcc/config/rs6000/rs6000.cc
+++ b/gcc/config/rs6000/rs6000.cc
@@ -15360,31 +15360,15 @@ rs6000_print_patchable_function_entry (FILE *file,
 }
 
 enum rtx_code
-rs6000_reverse_condition (machine_mode mode,
-                         enum rtx_code code,
-                         enum reverse_condition_t allow_ordered)
+rs6000_reverse_condition (machine_mode mode, enum rtx_code code)
 {
-  bool support_nan = !flag_finite_math_only;
-  bool ordered_compare = (code == UNLT || code == UNLE || code == UNGT
-                         || code == UNGE || code == UNEQ || code == LTGT);
-
   /* Reversal of FP compares takes care -- an ordered compare
-     becomes an unordered compare and vice versa.
-
-     However, this is not safe for ordered comparisons (i.e. for isgreater,
-     etc.)  starting with the power9 because ifcvt.cc will want to create a fp
-     cmove, and the x{s,v}cmp{eq,gt,ge}{dp,qp} instructions will trap if one of
-     the arguments is a signalling NaN.  */
-
-  if (mode == CCFPmode && (support_nan || ordered_compare))
-    {
-      if (support_nan && ordered_compare
-         && allow_ordered == REVERSE_CONDITION_NO_ORDERED)
-       return UNKNOWN;
-
-      return reverse_condition_maybe_unordered (code);
-    }
-
+     becomes an unordered compare and vice versa.  */
+  if (mode == CCFPmode
+      && (!flag_finite_math_only
+         || code == UNLT || code == UNLE || code == UNGT || code == UNGE
+         || code == UNEQ || code == LTGT))
+    return reverse_condition_maybe_unordered (code);
   else
     return reverse_condition (code);
 }
@@ -15996,14 +15980,11 @@ rs6000_emit_sCOND (machine_mode mode, rtx operands[])
       rtx not_result = gen_reg_rtx (CCEQmode);
       rtx not_op, rev_cond_rtx;
       machine_mode cc_mode;
-      enum rtx_code rev;
 
       cc_mode = GET_MODE (XEXP (condition_rtx, 0));
 
-      rev = rs6000_reverse_condition (cc_mode, cond_code,
-                                     REVERSE_CONDITION_ORDERED_OK);
-      rev_cond_rtx = gen_rtx_fmt_ee (rev, SImode, XEXP (condition_rtx, 0),
-                                    const0_rtx);
+      rev_cond_rtx = gen_rtx_fmt_ee (rs6000_reverse_condition (cc_mode, 
cond_code),
+                                    SImode, XEXP (condition_rtx, 0), 
const0_rtx);
       not_op = gen_rtx_COMPARE (CCEQmode, rev_cond_rtx, const0_rtx);
       emit_insn (gen_rtx_SET (not_result, not_op));
       condition_rtx = gen_rtx_EQ (VOIDmode, not_result, const0_rtx);
diff --git a/gcc/config/rs6000/rs6000.h b/gcc/config/rs6000/rs6000.h
index 10277a2db80e..ec08c96d0f67 100644
--- a/gcc/config/rs6000/rs6000.h
+++ b/gcc/config/rs6000/rs6000.h
@@ -1812,17 +1812,11 @@ extern scalar_int_mode rs6000_pmode;
 
 /* Can the condition code MODE be safely reversed?  This is safe in
    all cases on this port, because at present it doesn't use the
-   trapping FP comparisons (fcmpo).
-
-   However, this is not safe for ordered comparisons (i.e. for isgreater, etc.)
-   starting with the power9 because ifcvt.cc will want to create a fp cmove,
-   and the x{s,v}cmp{eq,gt,ge}{dp,qp} instructions will trap if one of the
-   arguments is a signalling NaN.  */
+   trapping FP comparisons (fcmpo).  */
 #define REVERSIBLE_CC_MODE(MODE) 1
 
 /* Given a condition code and a mode, return the inverse condition.  */
-#define REVERSE_CONDITION(CODE, MODE) \
-  rs6000_reverse_condition (MODE, CODE, REVERSE_CONDITION_NO_ORDERED)
+#define REVERSE_CONDITION(CODE, MODE) rs6000_reverse_condition (MODE, CODE)
 
 
 /* Target cpu costs.  */
diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md
index 1500efa14cd1..65da0c653304 100644
--- a/gcc/config/rs6000/rs6000.md
+++ b/gcc/config/rs6000/rs6000.md
@@ -13497,7 +13497,7 @@
 ;; If we are comparing the result of two comparisons, this can be done
 ;; using creqv or crxor.
 
-(define_insn_and_split "*reverse_branch_comparison"
+(define_insn_and_split ""
   [(set (match_operand:CCEQ 0 "cc_reg_operand" "=y")
        (compare:CCEQ (match_operator 1 "branch_comparison_operator"
                              [(match_operand 2 "cc_reg_operand" "y")
@@ -13519,27 +13519,19 @@
                                                    GET_MODE (operands[3]));
 
   if (! positive_1)
-    {
-      enum rtx_code rev
-       = rs6000_reverse_condition (GET_MODE (operands[2]),
-                                            GET_CODE (operands[1]),
-                                            REVERSE_CONDITION_ORDERED_OK);
-      gcc_assert (rev != UNKNOWN);
-      operands[1] = gen_rtx_fmt_ee (rev, SImode, operands[2], const0_rtx);
-    }
+    operands[1] = gen_rtx_fmt_ee (rs6000_reverse_condition (GET_MODE 
(operands[2]),
+                                                           GET_CODE 
(operands[1])),
+                                 SImode,
+                                 operands[2], const0_rtx);
   else if (GET_MODE (operands[1]) != SImode)
     operands[1] = gen_rtx_fmt_ee (GET_CODE (operands[1]), SImode,
                                  operands[2], const0_rtx);
 
   if (! positive_2)
-    {
-      enum rtx_code rev
-       = rs6000_reverse_condition (GET_MODE (operands[4]),
-                                            GET_CODE (operands[3]),
-                                            REVERSE_CONDITION_ORDERED_OK);
-      gcc_assert (rev != UNKNOWN);
-      operands[3] = gen_rtx_fmt_ee (rev, SImode, operands[4], const0_rtx);
-    }
+    operands[3] = gen_rtx_fmt_ee (rs6000_reverse_condition (GET_MODE 
(operands[4]),
+                                                           GET_CODE 
(operands[3])),
+                                 SImode,
+                                 operands[4], const0_rtx);
   else if (GET_MODE (operands[3]) != SImode)
     operands[3] = gen_rtx_fmt_ee (GET_CODE (operands[3]), SImode,
                                  operands[4], const0_rtx);
diff --git a/gcc/testsuite/gcc.target/powerpc/pr118541-1.c 
b/gcc/testsuite/gcc.target/powerpc/pr118541-1.c
deleted file mode 100644
index d5690dd7e38a..000000000000
--- a/gcc/testsuite/gcc.target/powerpc/pr118541-1.c
+++ /dev/null
@@ -1,28 +0,0 @@
-/* { dg-do compile } */
-/* { dg-options "-mdejagnu-cpu=power9 -O2" } */
-/* { dg-require-effective-target powerpc_vsx } */
-
-/* PR target/118541 says that the ordered comparison functions like isgreater
-   should not optimize floating point conditional moves to use
-   x{s,v}cmp{eq,gt,ge}{dp,qp} and xxsel since that instruction can cause traps
-   if one of the arguments is a signaling NaN.  */
-
-/* Verify isgreater does not generate xscmpgtdp when NaNs are allowed.  */
-
-double
-ordered_compare (double a, double b, double c, double d)
-{
-  /*
-   * fcmpu 0,1,2
-   * fmr   1,4
-   * bnglr 0
-   * fmr   1,3
-   * blr
-   */
-
-  return __builtin_isgreater (a, b) ? c : d;
-}
-
-/* { dg-final { scan-assembler-not {\mxscmpg[te]dp\M}       } } */
-/* { dg-final { scan-assembler-not {\mxxsel\M}              } } */
-/* { dg-final { scan-assembler     {\mxscmpudp\M|\mfcmpu\M} } } */
diff --git a/gcc/testsuite/gcc.target/powerpc/pr118541-2.c 
b/gcc/testsuite/gcc.target/powerpc/pr118541-2.c
deleted file mode 100644
index 5e1d83daedad..000000000000
--- a/gcc/testsuite/gcc.target/powerpc/pr118541-2.c
+++ /dev/null
@@ -1,26 +0,0 @@
-/* { dg-do compile } */
-/* { dg-options "-mdejagnu-cpu=power9 -Ofast" } */
-/* { dg-require-effective-target powerpc_vsx } */
-
-/* PR target/118541 says that the ordered comparison functions like isgreater
-   should not optimize floating point conditional moves to use
-   x{s,v}cmp{eq,gt,ge}{dp,qp} and xxsel since that instruction can cause traps
-   if one of the arguments is a signaling NaN.  */
-
-/* Verify isgreater does generate xscmpgtdp when NaNs are not allowed.  */
-
-double
-ordered_compare (double a, double b, double c, double d)
-{
-  /*
-   * xscmpgtdp 1,1,2
-   * xxsel     1,4,3,1
-   * blr
-   */
-
-  return __builtin_isgreater (a, b) ? c : d;
-}
-
-/* { dg-final { scan-assembler     {\mxscmpg[te]dp\M}       } } */
-/* { dg-final { scan-assembler     {\mxxsel\M}              } } */
-/* { dg-final { scan-assembler-not {\mxscmpudp\M|\mfcmpu\M} } } */
diff --git a/gcc/testsuite/gcc.target/powerpc/pr118541-3.c 
b/gcc/testsuite/gcc.target/powerpc/pr118541-3.c
deleted file mode 100644
index bac7486d211c..000000000000
--- a/gcc/testsuite/gcc.target/powerpc/pr118541-3.c
+++ /dev/null
@@ -1,26 +0,0 @@
-/* { dg-do compile } */
-/* { dg-options "-mdejagnu-cpu=power9 -O2" } */
-/* { dg-require-effective-target powerpc_vsx } */
-
-/* PR target/118541 says that the ordered comparison functions like isgreater
-   should not optimize floating point conditional moves to use
-   x{s,v}cmp{eq,gt,ge}{dp,qp} and xxsel since that instruction can cause traps
-   if one of the arguments is a signaling NaN.  */
-
-/* Verify normal > does generate xscmpgtdp when NaNs are allowed.  */
-
-double
-normal_compare (double a, double b, double c, double d)
-{
-  /*
-   * xscmpgtdp 1,1,2
-   * xxsel     1,4,3,1
-   * blr
-   */
-
-  return a > b ? c : d;
-}
-
-/* { dg-final { scan-assembler     {\mxscmpg[te]dp\M}       } } */
-/* { dg-final { scan-assembler     {\mxxsel\M}              } } */
-/* { dg-final { scan-assembler-not {\mxscmpudp\M|\mfcmpu\M} } } */
diff --git a/gcc/testsuite/gcc.target/powerpc/pr118541-4.c 
b/gcc/testsuite/gcc.target/powerpc/pr118541-4.c
deleted file mode 100644
index 3e82a937c7bc..000000000000
--- a/gcc/testsuite/gcc.target/powerpc/pr118541-4.c
+++ /dev/null
@@ -1,26 +0,0 @@
-/* { dg-do compile } */
-/* { dg-options "-mdejagnu-cpu=power9 -Ofast" } */
-/* { dg-require-effective-target powerpc_vsx } */
-
-/* PR target/118541 says that the ordered comparison functions like isgreater
-   should not optimize floating point conditional moves to use
-   x{s,v}cmp{eq,gt,ge}{dp,qp} and xxsel since that instruction can cause traps
-   if one of the arguments is a signaling NaN.  */
-
-/* Verify normal > does generate xscmpgtdp when NaNs are not allowed.  */
-
-double
-normal_compare (double a, double b, double c, double d)
-{
-  /*
-   * xscmpgtdp 1,1,2
-   * xxsel     1,4,3,1
-   * blr
-   */
-
-  return a > b ? c : d;
-}
-
-/* { dg-final { scan-assembler     {\mxscmpg[te]dp\M}       } } */
-/* { dg-final { scan-assembler     {\mxxsel\M}              } } */
-/* { dg-final { scan-assembler-not {\mxscmpudp\M|\mfcmpu\M} } } */

Reply via email to