https://gcc.gnu.org/g:9e4e7275743b9a7588712923cef5872f109f30f7

commit 9e4e7275743b9a7588712923cef5872f109f30f7
Author: Michael Meissner <meiss...@linux.ibm.com>
Date:   Thu May 22 15:08:12 2025 -0400

    Revert changes

Diff:
---
 gcc/config/rs6000/predicates.md             |   6 +-
 gcc/config/rs6000/rs6000-protos.h           |   1 -
 gcc/config/rs6000/rs6000.cc                 |  24 -----
 gcc/config/rs6000/rs6000.h                  |  15 +--
 gcc/config/rs6000/rs6000.md                 |  12 +--
 gcc/testsuite/gcc.target/powerpc/pr118541.c | 147 ----------------------------
 6 files changed, 13 insertions(+), 192 deletions(-)

diff --git a/gcc/config/rs6000/predicates.md b/gcc/config/rs6000/predicates.md
index 3a82113833c3..647e89afb6a7 100644
--- a/gcc/config/rs6000/predicates.md
+++ b/gcc/config/rs6000/predicates.md
@@ -1465,9 +1465,9 @@
 
 ;; 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 when the arguments are swapped).
-(define_predicate "fpmask_reverse_args_comparison_operator"
-  (match_code "ne,lt,le"))
+;; fpmask_comparison_operator).
+(define_predicate "invert_fpmask_comparison_operator"
+  (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 f3cbfbfe5a13..4619142d197b 100644
--- a/gcc/config/rs6000/rs6000-protos.h
+++ b/gcc/config/rs6000/rs6000-protos.h
@@ -116,7 +116,6 @@ extern const char *rs6000_indirect_sibcall_template (rtx *, 
unsigned int);
 extern const char *rs6000_pltseq_template (rtx *, int);
 extern enum rtx_code rs6000_reverse_condition (machine_mode,
                                               enum rtx_code);
-extern enum rtx_code rs6000_fpmask_reverse_args (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 8eaca7988d80..11dfde7f288b 100644
--- a/gcc/config/rs6000/rs6000.cc
+++ b/gcc/config/rs6000/rs6000.cc
@@ -15379,30 +15379,6 @@ rs6000_reverse_condition (machine_mode mode, enum 
rtx_code code)
     return reverse_condition (code);
 }
 
-/* Like reverse_condition, but return the condition code where the arguments
-   are reversed.  I.e. do not convert an unordered compare into an ordered
-   compare.  This is used for the fpmask operations in power9 to implement
-   floating point conditional moves.  */
-
-enum rtx_code
-rs6000_fpmask_reverse_args (enum rtx_code code)
-{
-  switch (code)
-    {
-    case NE:
-      return EQ;
-
-    case LE:
-      return GT;
-
-    case LT:
-      return GE;
-
-    default:
-      gcc_unreachable ();
-    }
-}
-
 /* Check if C (as 64bit integer) can be rotated to a constant which constains
    nonzero bits at the LOWBITS low bits only.
 
diff --git a/gcc/config/rs6000/rs6000.h b/gcc/config/rs6000/rs6000.h
index c8d9456e0912..9267612fbc9c 100644
--- a/gcc/config/rs6000/rs6000.h
+++ b/gcc/config/rs6000/rs6000.h
@@ -1810,17 +1810,10 @@ extern scalar_int_mode rs6000_pmode;
    : (((OP) == EQ || (OP) == NE) && COMPARISON_P (X)                     \
       ? CCEQmode : CCmode))
 
-/* Can the condition code MODE be safely reversed?  Don't allow floating point
-   comparisons to be reversed unless NaNs are not allowed.
-
-   In the past, we used to allow reversing FP operations because we only
-   generated FCMPU comparisons and not FCMPO.  However, starting with power9,
-   the XSCMPEQDP, XSCMPGTDP, and XSCMPGEDP instructions will trap if a
-   signalling NaN is used.  If we allow reversing FP operations, we could wind
-   up converting a LT operation into UNGE and the instruction will trap.  The
-   machine independent parts of the compiler will handle reversing the
-   arguments if the FP comparison cannot be reversed.  */
-#define REVERSIBLE_CC_MODE(MODE) ((MODE) != CCFPmode || flag_finite_math_only)
+/* 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).  */
+#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)
diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md
index b5cc98bcb0eb..65da0c653304 100644
--- a/gcc/config/rs6000/rs6000.md
+++ b/gcc/config/rs6000/rs6000.md
@@ -5734,7 +5734,7 @@
 (define_insn_and_split "*mov<SFDF:mode><SFDF2:mode>cc_invert_p9"
   [(set (match_operand:SFDF 0 "vsx_register_operand" "=&wa,wa")
        (if_then_else:SFDF
-        (match_operator:CCFP 1 "fpmask_reverse_args_comparison_operator"
+        (match_operator:CCFP 1 "invert_fpmask_comparison_operator"
                [(match_operand:SFDF2 2 "vsx_register_operand" "wa,wa")
                 (match_operand:SFDF2 3 "vsx_register_operand" "wa,wa")])
         (match_operand:SFDF 4 "vsx_register_operand" "wa,wa")
@@ -5754,7 +5754,7 @@
                           (match_dup 4)))]
 {
   rtx op1 = operands[1];
-  enum rtx_code cond = rs6000_fpmask_reverse_args (GET_CODE (op1));
+  enum rtx_code cond = reverse_condition_maybe_unordered (GET_CODE (op1));
 
   if (GET_CODE (operands[6]) == SCRATCH)
     operands[6] = gen_reg_rtx (V2DImode);
@@ -5762,7 +5762,7 @@
   operands[7] = CONSTM1_RTX (V2DImode);
   operands[8] = CONST0_RTX (V2DImode);
 
-  operands[9] = gen_rtx_fmt_ee (cond, CCFPmode, operands[3], operands[2]);
+  operands[9] = gen_rtx_fmt_ee (cond, CCFPmode, operands[2], operands[3]);
 }
  [(set_attr "length" "8")
   (set_attr "type" "vecperm")])
@@ -5839,7 +5839,7 @@
 (define_insn_and_split "*mov<mode>cc_invert_p10"
   [(set (match_operand:IEEE128 0 "altivec_register_operand" "=&v,v")
        (if_then_else:IEEE128
-        (match_operator:CCFP 1 "fpmask_reverse_args_comparison_operator"
+        (match_operator:CCFP 1 "invert_fpmask_comparison_operator"
                [(match_operand:IEEE128 2 "altivec_register_operand" "v,v")
                 (match_operand:IEEE128 3 "altivec_register_operand" "v,v")])
         (match_operand:IEEE128 4 "altivec_register_operand" "v,v")
@@ -5859,7 +5859,7 @@
                              (match_dup 4)))]
 {
   rtx op1 = operands[1];
-  enum rtx_code cond = rs6000_fpmask_reverse_args (GET_CODE (op1));
+  enum rtx_code cond = reverse_condition_maybe_unordered (GET_CODE (op1));
 
   if (GET_CODE (operands[6]) == SCRATCH)
     operands[6] = gen_reg_rtx (V2DImode);
@@ -5867,7 +5867,7 @@
   operands[7] = CONSTM1_RTX (V2DImode);
   operands[8] = CONST0_RTX (V2DImode);
 
-  operands[9] = gen_rtx_fmt_ee (cond, CCFPmode, operands[3], operands[2]);
+  operands[9] = gen_rtx_fmt_ee (cond, CCFPmode, operands[2], operands[3]);
 }
  [(set_attr "length" "8")
   (set_attr "type" "vecperm")])
diff --git a/gcc/testsuite/gcc.target/powerpc/pr118541.c 
b/gcc/testsuite/gcc.target/powerpc/pr118541.c
deleted file mode 100644
index a38c94c8b7ed..000000000000
--- a/gcc/testsuite/gcc.target/powerpc/pr118541.c
+++ /dev/null
@@ -1,147 +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, isgreaterequal, isless, and islessequal does not generate
-   xscmpltdp, xscmpgtdp, or xscmpeqdp.  */
-
-double
-ordered_gt (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;
-}
-
-double
-ordered_ge (double a, double b, double c, double d)
-{
-  /*
-   * fcmpu 0,1,2
-   * fmr 1,4
-   * cror 2,0,3
-   * beqlr 0
-   * fmr 1,3
-   * blr
-   */
-
-  return __builtin_isgreaterequal (a, b) ? c : d;
-}
-
-double
-ordered_lt (double a, double b, double c, double d)
-{
-  /*
-   * fcmpu 0,1,2
-   * fmr 1,4
-   * bnllr 0
-   * fmr 1,3
-   * blr
-   */
-
-  return __builtin_isless (a, b) ? c : d;
-}
-
-double
-ordered_le (double a, double b, double c, double d)
-{
-  /*
-   * fcmpu 0,1,2
-   * fmr 1,4
-   * cror 2,1,3
-   * beqlr 0
-   * fmr 1,3
-   * blr
-   */
-
-  return __builtin_islessequal (a, b) ? c : d;
-}
-
-double
-normal_gt (double a, double b, double c, double d)
-{
-  /*
-   * xscmpgtdp 1,1,2
-   * xxsel 1,4,3,1
-   * blr
-   */
-
-  return a > b ? c : d;
-}
-
-double
-normal_ge (double a, double b, double c, double d)
-{
-  /*
-   * xscmpgedp 1,1,2
-   * xxsel 1,4,3,1
-   * blr
-   */
-
-  return a >= b ? c : d;
-}
-
-double
-normal_lt (double a, double b, double c, double d)
-{
-  /*
-   * xscmpgtdp 1,2,1
-   * xxsel 1,4,3,1
-   * blr
-   */
-
-  return a < b ? c : d;
-}
-
-double
-normal_le (double a, double b, double c, double d)
-{
-  /*
-   * xscmpgedp 1,2,1
-   * xxsel 1,4,3,1
-   * blr
-   */
-
-  return a <= b ? c : d;
-}
-
-double
-normal_eq (double a, double b, double c, double d)
-{
-  /*
-   * xscmpeqdp 1,1,2
-   * xxsel 1,4,3,1
-   * blr
-   */
-
-  return a == b ? c : d;
-}
-
-double
-normal_ne (double a, double b, double c, double d)
-{
-  /*
-   * xscmpeqdp 1,1,2
-   * xxsel 1,3,4,1
-   * blr
-   */
-
-  return a != b ? c : d;
-}
-
-/* { dg-final { scan-assembler-times {\mxscmpudp\M|\mfcmpu\M} 4 } } */
-/* { dg-final { scan-assembler-times {\mxscmpeqdp\M}          2 } } */
-/* { dg-final { scan-assembler-times {\mxscmpgedp\M}          2 } } */
-/* { dg-final { scan-assembler-times {\mxscmpgtdp\M}          2 } } */
-/* { dg-final { scan-assembler-times {\mxxsel\M}              6 } } */

Reply via email to