flow.c (REVERSE_CONDEXEC_PREDICATES_P): Use the whole comparison, not just the codes, call reversed_comparison_code ().

* 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
This commit is contained in:
Richard Earnshaw 2004-08-29 22:10:44 +00:00 committed by Richard Earnshaw
parent 6903ecd491
commit 15dce8121c
4 changed files with 28 additions and 18 deletions

View 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> 2004-08-29 Richard Earnshaw <rearnsha@arm.com>
* sched-deps.c (get_condition): Rewrite using jump support functions. * sched-deps.c (get_condition): Rewrite using jump support functions.

View File

@ -5240,16 +5240,17 @@ like:
@end smallexample @end smallexample
@end defmac @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 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 @var{op1}, a comparison operation, is the inverse of @var{op2} and vice
return 0 if the target has conditional execution predicates that cannot be versa. Define this to return 0 if the target has conditional execution
reversed safely. If no expansion is specified, this macro is defined as predicates that cannot be reversed safely. There is no need to validate
follows: 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 @smallexample
#define REVERSE_CONDEXEC_PREDICATES_P (x, y) \ #define REVERSE_CONDEXEC_PREDICATES_P (x, y) \
((x) == reverse_condition (y)) (GET_CODE ((x)) == reversed_comparison_code ((y), NULL))
@end smallexample @end smallexample
@end defmac @end defmac

View File

@ -160,7 +160,8 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#ifdef HAVE_conditional_execution #ifdef HAVE_conditional_execution
#ifndef REVERSE_CONDEXEC_PREDICATES_P #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
#endif #endif
@ -2996,7 +2997,7 @@ ior_reg_cond (rtx old, rtx x, int add)
if (COMPARISON_P (old)) if (COMPARISON_P (old))
{ {
if (COMPARISON_P (x) 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))) && REGNO (XEXP (x, 0)) == REGNO (XEXP (old, 0)))
return const1_rtx; return const1_rtx;
if (GET_CODE (x) == GET_CODE (old) if (GET_CODE (x) == GET_CODE (old)
@ -3079,14 +3080,11 @@ ior_reg_cond (rtx old, rtx x, int add)
static rtx static rtx
not_reg_cond (rtx x) not_reg_cond (rtx x)
{ {
enum rtx_code x_code;
if (x == const0_rtx) if (x == const0_rtx)
return const1_rtx; return const1_rtx;
else if (x == const1_rtx) else if (x == const1_rtx)
return const0_rtx; return const0_rtx;
x_code = GET_CODE (x); if (GET_CODE (x) == NOT)
if (x_code == NOT)
return XEXP (x, 0); return XEXP (x, 0);
if (COMPARISON_P (x) if (COMPARISON_P (x)
&& REG_P (XEXP (x, 0))) && REG_P (XEXP (x, 0)))
@ -3094,7 +3092,7 @@ not_reg_cond (rtx x)
if (XEXP (x, 1) != const0_rtx) if (XEXP (x, 1) != const0_rtx)
abort (); 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); VOIDmode, XEXP (x, 0), const0_rtx);
} }
return gen_rtx_NOT (0, x); 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 (old))
{ {
if (COMPARISON_P (x) 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))) && REGNO (XEXP (x, 0)) == REGNO (XEXP (old, 0)))
return const0_rtx; return const0_rtx;
if (GET_CODE (x) == GET_CODE (old) if (GET_CODE (x) == GET_CODE (old)

View File

@ -491,6 +491,7 @@ cond_exec_process_if_block (ce_if_block_t * ce_info,
{ {
rtx start, end; rtx start, end;
rtx t, f; rtx t, f;
enum rtx_code f_code;
bb = block_fallthru (bb); bb = block_fallthru (bb);
start = first_active_insn (bb); start = first_active_insn (bb);
@ -510,11 +511,11 @@ cond_exec_process_if_block (ce_if_block_t * ce_info,
if (! t) if (! t)
goto fail; goto fail;
f = gen_rtx_fmt_ee (reverse_condition (GET_CODE (t)), f_code = reversed_comparison_code (t, BB_END (bb));
GET_MODE (t), if (f_code == UNKNOWN)
XEXP (t, 0), goto fail;
XEXP (t, 1));
f = gen_rtx_fmt_ee (f_code, GET_MODE (t), XEXP (t, 0), XEXP (t, 1));
if (ce_info->and_and_p) if (ce_info->and_and_p)
{ {
t = gen_rtx_AND (GET_MODE (t), true_expr, t); t = gen_rtx_AND (GET_MODE (t), true_expr, t);