simplify-rtx.c (cfc_args): add "unordered" field.

* simplify-rtx.c (cfc_args): add "unordered" field.
	(check_fold_consts): Set unordered field.
	(simplify_relational_operation): Simplify the unordered
	comparisons.

	* reg-stack.c (swap_rtx_condition): Ensure that the transformation
	is valid.

	* emit-rtl.c (try_split): Fix code to mark labels.
	* jump.c (mark_jump_label): Make global.
	* rtl.h (mark_jump_label): Declare.

	* predict.c (estimate_probability): Handle unordred comparisons.

From-SVN: r38711
This commit is contained in:
Jan Hubicka 2001-01-05 16:34:39 +01:00 committed by Jan Hubicka
parent bfa2cb330e
commit 90a747032a
7 changed files with 91 additions and 25 deletions

View File

@ -1,3 +1,19 @@
Fri Jan 5 16:29:49 MET 2001 Jan Hubicka <jh@suse.cz>
* simplify-rtx.c (cfc_args): add "unordered" field.
(check_fold_consts): Set unordered field.
(simplify_relational_operation): Simplify the unordered
comparisons.
* reg-stack.c (swap_rtx_condition): Ensure that the transformation
is valid.
* emit-rtl.c (try_split): Fix code to mark labels.
* jump.c (mark_jump_label): Make global.
* rtl.h (mark_jump_label): Declare.
* predict.c (estimate_probability): Handle unordred comparisons.
2001-01-05 Neil Booth <neil@daikokuya.demon.co.uk>
* cpp.texi: Update for -MP. Clarify behaviour of -MT.

View File

@ -1,6 +1,6 @@
/* Emit RTL for the GNU C-Compiler expander.
Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
1999, 2000 Free Software Foundation, Inc.
1999, 2000, 2001 Free Software Foundation, Inc.
This file is part of GNU CC.
@ -2433,19 +2433,11 @@ try_split (pat, trial, last)
&& rtx_equal_p (PATTERN (XVECEXP (seq, 0, i)), pat))
return trial;
/* If we are splitting a JUMP_INSN, look for the JUMP_INSN in
SEQ and copy our JUMP_LABEL to it. If JUMP_LABEL is non-zero,
increment the usage count so we don't delete the label. */
if (GET_CODE (trial) == JUMP_INSN)
for (i = XVECLEN (seq, 0) - 1; i >= 0; i--)
if (GET_CODE (XVECEXP (seq, 0, i)) == JUMP_INSN)
{
JUMP_LABEL (XVECEXP (seq, 0, i)) = JUMP_LABEL (trial);
if (JUMP_LABEL (trial))
LABEL_NUSES (JUMP_LABEL (trial))++;
}
/* Mark labels. */
for (i = XVECLEN (seq, 0) - 1; i >= 0; i--)
if (GET_CODE (XVECEXP (seq, 0, i)) == JUMP_INSN)
mark_jump_label (PATTERN (XVECEXP (seq, 0, i)),
XVECEXP (seq, 0, i), 0, 0);
/* If we are splitting a CALL_INSN, look for the CALL_INSN
in SEQ and copy our CALL_INSN_FUNCTION_USAGE to it. */

View File

@ -1,6 +1,6 @@
/* Optimize jump instructions, for GNU compiler.
Copyright (C) 1987, 1988, 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997
1998, 1999, 2000 Free Software Foundation, Inc.
1998, 1999, 2000, 2001 Free Software Foundation, Inc.
This file is part of GNU CC.
@ -113,7 +113,6 @@ static void find_cross_jump PARAMS ((rtx, rtx, int, rtx *, rtx *));
static void do_cross_jump PARAMS ((rtx, rtx, rtx));
static int jump_back_p PARAMS ((rtx, rtx));
static int tension_vector_labels PARAMS ((rtx, int));
static void mark_jump_label PARAMS ((rtx, rtx, int, int));
static void delete_computation PARAMS ((rtx));
static void redirect_exp_1 PARAMS ((rtx *, rtx, rtx, rtx));
static int redirect_exp PARAMS ((rtx, rtx, rtx));
@ -2377,7 +2376,7 @@ tension_vector_labels (x, idx)
Once reload has completed (CROSS_JUMP non-zero), we need not consider
two labels distinct if they are separated by only USE or CLOBBER insns. */
static void
void
mark_jump_label (x, insn, cross_jump, in_mem)
register rtx x;
rtx insn;

View File

@ -1,5 +1,5 @@
/* Branch prediction routines for the GNU compiler.
Copyright (C) 2000 Free Software Foundation, Inc.
Copyright (C) 2000, 2001 Free Software Foundation, Inc.
This file is part of GNU CC.
@ -183,11 +183,19 @@ estimate_probability (loops_info)
goto emitnote;
case EQ:
case UNEQ:
prob = PROB_UNLIKELY;
goto emitnote;
case NE:
case LTGT:
prob = PROB_LIKELY;
goto emitnote;
case ORDERED:
prob = PROB_LIKELY;
goto emitnote;
case UNORDERED:
prob = PROB_UNLIKELY;
goto emitnote;
case LE:
case LT:
if (XEXP (cond, 1) == const0_rtx)

View File

@ -1,6 +1,6 @@
/* Register to Stack convert for GNU compiler.
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998,
1999, 2000 Free Software Foundation, Inc.
1999, 2000, 2001 Free Software Foundation, Inc.
This file is part of GNU CC.
@ -1261,7 +1261,17 @@ swap_rtx_condition (insn)
pat = PATTERN (insn);
}
return swap_rtx_condition_1 (pat);
if (swap_rtx_condition_1 (pat))
{
INSN_CODE (insn) = -1;
if (recog_memoized (insn) == -1)
{
swap_rtx_condition_1 (pat);
return 0;
}
return 1;
}
return 0;
}
/* Handle a comparison. Special care needs to be taken to avoid

View File

@ -1,6 +1,6 @@
/* Register Transfer Language (RTL) definitions for GNU C-Compiler
Copyright (C) 1987, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
1999, 2000 Free Software Foundation, Inc.
1999, 2000, 2001 Free Software Foundation, Inc.
This file is part of GNU CC.
@ -1287,6 +1287,7 @@ extern enum rtx_code reverse_condition_maybe_unordered PARAMS ((enum rtx_code));
extern enum rtx_code swap_condition PARAMS ((enum rtx_code));
extern enum rtx_code unsigned_condition PARAMS ((enum rtx_code));
extern enum rtx_code signed_condition PARAMS ((enum rtx_code));
extern void mark_jump_label PARAMS ((rtx, rtx, int, int));
/* In reload.c */
extern rtx find_equiv_reg PARAMS ((rtx, rtx, enum reg_class, int, short *, int, enum machine_mode));

View File

@ -1,6 +1,6 @@
/* RTL simplification functions for GNU compiler.
Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
1999, 2000 Free Software Foundation, Inc.
1999, 2000, 2001 Free Software Foundation, Inc.
This file is part of GNU CC.
@ -1676,6 +1676,7 @@ struct cfc_args
{
rtx op0, op1; /* Input */
int equal, op0lt, op1lt; /* Output */
int unordered;
};
static void
@ -1685,11 +1686,19 @@ check_fold_consts (data)
struct cfc_args *args = (struct cfc_args *) data;
REAL_VALUE_TYPE d0, d1;
/* We may possibly raise an exception while reading the value. */
args->unordered = 1;
REAL_VALUE_FROM_CONST_DOUBLE (d0, args->op0);
REAL_VALUE_FROM_CONST_DOUBLE (d1, args->op1);
/* Comparisons of Inf versus Inf are ordered. */
if (REAL_VALUE_ISNAN (d0)
|| REAL_VALUE_ISNAN (d1))
return;
args->equal = REAL_VALUES_EQUAL (d0, d1);
args->op0lt = REAL_VALUES_LESS (d0, d1);
args->op1lt = REAL_VALUES_LESS (d1, d0);
args->unordered = 0;
}
/* Like simplify_binary_operation except used for relational operators.
@ -1772,9 +1781,32 @@ simplify_relational_operation (code, mode, op0, op1)
args.op0 = op0;
args.op1 = op1;
if (do_float_handler(check_fold_consts, (PTR) &args) == 0)
/* We got an exception from check_fold_consts() */
return 0;
if (!do_float_handler(check_fold_consts, (PTR) &args))
args.unordered = 1;
if (args.unordered)
switch (code)
{
case UNEQ:
case UNLT:
case UNGT:
case UNLE:
case UNGE:
case NE:
case UNORDERED:
return const_true_rtx;
case EQ:
case LT:
case GT:
case LE:
case GE:
case LTGT:
case ORDERED:
return const0_rtx;
default:
return 0;
}
/* Receive output from check_fold_consts() */
equal = args.equal;
@ -1905,12 +1937,16 @@ simplify_relational_operation (code, mode, op0, op1)
switch (code)
{
case EQ:
case UNEQ:
return equal ? const_true_rtx : const0_rtx;
case NE:
case LTGT:
return ! equal ? const_true_rtx : const0_rtx;
case LT:
case UNLT:
return op0lt ? const_true_rtx : const0_rtx;
case GT:
case UNGT:
return op1lt ? const_true_rtx : const0_rtx;
case LTU:
return op0ltu ? const_true_rtx : const0_rtx;
@ -1924,6 +1960,10 @@ simplify_relational_operation (code, mode, op0, op1)
return equal || op0ltu ? const_true_rtx : const0_rtx;
case GEU:
return equal || op1ltu ? const_true_rtx : const0_rtx;
case ORDERED:
return const_true_rtx;
case UNORDERED:
return const0_rtx;
default:
abort ();
}