flow.c (REVERSE_CONDEXEC_PREDICATES_P): Use the whole comparison, not just the codes...
authorRichard Earnshaw <rearnsha@arm.com>
Sun, 29 Aug 2004 22:10:44 +0000 (22:10 +0000)
committerRichard Earnshaw <rearnsha@gcc.gnu.org>
Sun, 29 Aug 2004 22:10:44 +0000 (22:10 +0000)
* flow.c (REVERSE_CONDEXEC_PREDICATES_P): Use the whole comparison, not
just the codes, call reversed_comparison_code ().
(ior_reg_cond): Update arguments to REVERSE_CONDEXEC_PREDICATES_P.
(not_reg_cond): Use reversed_comparison_code.
(and_reg_cond): Likewise.
* ifcvt.c (cond_exec_process_if_block): Likewise.
* doc/tm.texi (REVERSE_CONDEXEC_PREDICATES_P): Update documentation.

From-SVN: r86737

gcc/ChangeLog
gcc/doc/tm.texi
gcc/flow.c
gcc/ifcvt.c

index 7f0869775bc744c19c0e4b8629a0e95fda706a0e..e4134edff1f6580e04668ec9c17ff4e3f8663f2f 100644 (file)
@@ -1,3 +1,13 @@
+2004-08-29  Richard Earnshaw  <rearnsha@arm.com>
+
+       * flow.c (REVERSE_CONDEXEC_PREDICATES_P): Use the whole comparison, not
+       just the codes, call reversed_comparison_code ().
+       (ior_reg_cond): Update arguments to REVERSE_CONDEXEC_PREDICATES_P.
+       (not_reg_cond): Use reversed_comparison_code.
+       (and_reg_cond): Likewise.
+       * ifcvt.c (cond_exec_process_if_block): Likewise.
+       * doc/tm.texi (REVERSE_CONDEXEC_PREDICATES_P): Update documentation.
+
 2004-08-29  Richard Earnshaw  <rearnsha@arm.com>
 
        * sched-deps.c (get_condition): Rewrite using jump support functions.
index b15cb53dec67e896eaafb5aea211209f5b86c8b4..2a873985703e78a3c77382644b5c3479ea42ea03 100644 (file)
@@ -5240,16 +5240,17 @@ like:
 @end smallexample
 @end defmac
 
-@defmac REVERSE_CONDEXEC_PREDICATES_P (@var{code1}, @var{code2})
+@defmac REVERSE_CONDEXEC_PREDICATES_P (@var{op1}, @var{op2})
 A C expression that returns true if the conditional execution predicate
-@var{code1} is the inverse of @var{code2} and vice versa.  Define this to
-return 0 if the target has conditional execution predicates that cannot be
-reversed safely.  If no expansion is specified, this macro is defined as
-follows:
+@var{op1}, a comparison operation, is the inverse of @var{op2} and vice
+versa.  Define this to return 0 if the target has conditional execution
+predicates that cannot be reversed safely.  There is no need to validate
+that the arguments of op1 and op2 are the same, this is done separately.
+If no expansion is specified, this macro is defined as follows:
 
 @smallexample
 #define REVERSE_CONDEXEC_PREDICATES_P (x, y) \
-   ((x) == reverse_condition (y))
+   (GET_CODE ((x)) == reversed_comparison_code ((y), NULL))
 @end smallexample
 @end defmac
 
index 3db96daf4eac85f2f5d74737e6d59799575f64a0..abbac675b80135a7ac3efad89c9a7838f40054f2 100644 (file)
@@ -160,7 +160,8 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 
 #ifdef HAVE_conditional_execution
 #ifndef REVERSE_CONDEXEC_PREDICATES_P
-#define REVERSE_CONDEXEC_PREDICATES_P(x, y) ((x) == reverse_condition (y))
+#define REVERSE_CONDEXEC_PREDICATES_P(x, y) \
+  (GET_CODE ((x)) == reversed_comparison_code ((y), NULL))
 #endif
 #endif
 
@@ -2996,7 +2997,7 @@ ior_reg_cond (rtx old, rtx x, int add)
   if (COMPARISON_P (old))
     {
       if (COMPARISON_P (x)
-         && REVERSE_CONDEXEC_PREDICATES_P (GET_CODE (x), GET_CODE (old))
+         && REVERSE_CONDEXEC_PREDICATES_P (x, old)
          && REGNO (XEXP (x, 0)) == REGNO (XEXP (old, 0)))
        return const1_rtx;
       if (GET_CODE (x) == GET_CODE (old)
@@ -3079,14 +3080,11 @@ ior_reg_cond (rtx old, rtx x, int add)
 static rtx
 not_reg_cond (rtx x)
 {
-  enum rtx_code x_code;
-
   if (x == const0_rtx)
     return const1_rtx;
   else if (x == const1_rtx)
     return const0_rtx;
-  x_code = GET_CODE (x);
-  if (x_code == NOT)
+  if (GET_CODE (x) == NOT)
     return XEXP (x, 0);
   if (COMPARISON_P (x)
       && REG_P (XEXP (x, 0)))
@@ -3094,7 +3092,7 @@ not_reg_cond (rtx x)
       if (XEXP (x, 1) != const0_rtx)
        abort ();
 
-      return gen_rtx_fmt_ee (reverse_condition (x_code),
+      return gen_rtx_fmt_ee (reversed_comparison_code (x, NULL),
                             VOIDmode, XEXP (x, 0), const0_rtx);
     }
   return gen_rtx_NOT (0, x);
@@ -3108,7 +3106,7 @@ and_reg_cond (rtx old, rtx x, int add)
   if (COMPARISON_P (old))
     {
       if (COMPARISON_P (x)
-         && GET_CODE (x) == reverse_condition (GET_CODE (old))
+         && GET_CODE (x) == reversed_comparison_code (old, NULL)
          && REGNO (XEXP (x, 0)) == REGNO (XEXP (old, 0)))
        return const0_rtx;
       if (GET_CODE (x) == GET_CODE (old)
index 7473054757f2ee1d9e40509c3e4054b087bcd0d3..0767eb25008a537fa46c2309f3aacef0a0abfcd3 100644 (file)
@@ -491,6 +491,7 @@ cond_exec_process_if_block (ce_if_block_t * ce_info,
        {
          rtx start, end;
          rtx t, f;
+         enum rtx_code f_code;
 
          bb = block_fallthru (bb);
          start = first_active_insn (bb);
@@ -510,11 +511,11 @@ cond_exec_process_if_block (ce_if_block_t * ce_info,
          if (! t)
            goto fail;
 
-         f = gen_rtx_fmt_ee (reverse_condition (GET_CODE (t)),
-                             GET_MODE (t),
-                             XEXP (t, 0),
-                             XEXP (t, 1));
+         f_code = reversed_comparison_code (t, BB_END (bb));
+         if (f_code == UNKNOWN)
+           goto fail;
 
+         f = gen_rtx_fmt_ee (f_code, GET_MODE (t), XEXP (t, 0), XEXP (t, 1));
          if (ce_info->and_and_p)
            {
              t = gen_rtx_AND (GET_MODE (t), true_expr, t);