diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7f0869775bc..e4134edff1f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2004-08-29 Richard Earnshaw + + * 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 * sched-deps.c (get_condition): Rewrite using jump support functions. diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi index b15cb53dec6..2a873985703 100644 --- a/gcc/doc/tm.texi +++ b/gcc/doc/tm.texi @@ -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 diff --git a/gcc/flow.c b/gcc/flow.c index 3db96daf4ea..abbac675b80 100644 --- a/gcc/flow.c +++ b/gcc/flow.c @@ -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) diff --git a/gcc/ifcvt.c b/gcc/ifcvt.c index 7473054757f..0767eb25008 100644 --- a/gcc/ifcvt.c +++ b/gcc/ifcvt.c @@ -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);