https://gcc.gnu.org/g:929044cf459560200db55922d9d1d66d1de77f85

commit 929044cf459560200db55922d9d1d66d1de77f85
Author: Michael Meissner <meiss...@linux.ibm.com>
Date:   Wed Feb 12 15:02:28 2025 -0500

    Revert changes

Diff:
---
 gcc/config/rs6000/predicates.md               | 10 +---------
 gcc/config/rs6000/rs6000-protos.h             | 17 +---------------
 gcc/config/rs6000/rs6000.cc                   | 23 +++++-----------------
 gcc/config/rs6000/rs6000.h                    | 10 ++--------
 gcc/config/rs6000/rs6000.md                   | 24 +++++++++--------------
 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, 18 insertions(+), 172 deletions(-)

diff --git a/gcc/config/rs6000/predicates.md b/gcc/config/rs6000/predicates.md
index ba8df6a7979d..647e89afb6a7 100644
--- a/gcc/config/rs6000/predicates.md
+++ b/gcc/config/rs6000/predicates.md
@@ -1466,16 +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).
-;;
-;; invert_fpmask_comparison_operator is used to form floating point conditional
-;; moves on power9.  The instructions that would be generated (xscmpeqdp,
-;; xscmpgtdp, or xscmpgedp) will raise an error if one of the arguments is a
-;; signalling NaN.  Don't allow the test to be inverted if NaNs are supported
-;; and the comparison is an ordered comparison.
 (define_predicate "invert_fpmask_comparison_operator"
-  (ior (match_code "ne")
-       (and (match_code "unlt,unle")
-           (match_test "flag_finite_math_only"))))
+  (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 ea9f267bb8e3..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_cond_t {
-  REVERSE_COND_ORDERED_OK,
-  REVERSE_COND_NO_ORDERED
-};
-
 extern enum rtx_code rs6000_reverse_condition (machine_mode,
-                                              enum rtx_code,
-                                              enum reverse_cond_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 563fac8eddd2..f9f9a0b931db 100644
--- a/gcc/config/rs6000/rs6000.cc
+++ b/gcc/config/rs6000/rs6000.cc
@@ -15360,25 +15360,15 @@ rs6000_print_patchable_function_entry (FILE *file,
 }
 
 enum rtx_code
-rs6000_reverse_condition (machine_mode mode,
-                         enum rtx_code code,
-                         enum reverse_cond_t ordered_cmp_ok)
+rs6000_reverse_condition (machine_mode mode, enum rtx_code code)
 {
   /* 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.  */
-
+     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 (ordered_cmp_ok == REVERSE_COND_NO_ORDERED && !flag_finite_math_only
-           ? UNKNOWN
-           : reverse_condition_maybe_unordered (code));
+    return reverse_condition_maybe_unordered (code);
   else
     return reverse_condition (code);
 }
@@ -15990,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_COND_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 c595d7138bcd..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_COND_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 5f7ff36617da..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,25 +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_COND_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_COND_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