dojump.c (do_jump): If the expression being compared against zero...

* dojump.c (do_jump): If the expression being compared against
	zero, is the subreg of a promoted variable, perform the comparison
	in the promoted mode.
	* simplify-rtx.c (simplify_unary_operation): Optimize sign and
	zero-extensions of subregs of promoted variables where the
	extension is identical to that used to promote the variable.

From-SVN: r74332
This commit is contained in:
Roger Sayle 2003-12-05 14:06:46 +00:00 committed by Roger Sayle
parent 64ed86c718
commit 2a67ff5e9e
3 changed files with 37 additions and 3 deletions

View File

@ -1,3 +1,12 @@
2003-12-05 Roger Sayle <roger@eyesopen.com>
* dojump.c (do_jump): If the expression being compared against
zero, is the subreg of a promoted variable, perform the comparison
in the promoted mode.
* simplify-rtx.c (simplify_unary_operation): Optimize sign and
zero-extensions of subregs of promoted variables where the
extension is identical to that used to promote the variable.
2003-12-05 Hans-Peter Nilsson <hp@axis.com>
PR target/13256

View File

@ -584,7 +584,14 @@ do_jump (tree exp, rtx if_false_label, rtx if_true_label)
{
/* The RTL optimizers prefer comparisons against pseudos. */
if (GET_CODE (temp) == SUBREG)
temp = copy_to_reg (temp);
{
/* Compare promoted variables in their promoted mode. */
if (SUBREG_PROMOTED_VAR_P (temp)
&& GET_CODE (XEXP (temp, 0)) == REG)
temp = XEXP (temp, 0);
else
temp = copy_to_reg (temp);
}
do_compare_rtx_and_jump (temp, CONST0_RTX (GET_MODE (temp)),
NE, TREE_UNSIGNED (TREE_TYPE (exp)),
GET_MODE (temp), NULL_RTX,

View File

@ -1031,6 +1031,15 @@ simplify_unary_operation (enum rtx_code code, enum machine_mode mode,
&& GET_CODE (XEXP (XEXP (op, 0), 1)) == LABEL_REF)
return XEXP (op, 0);
/* Check for a sign extension of a subreg of a promoted
variable, where the promotion is sign-extended, and the
target mode is the same as the variable's promotion. */
if (GET_CODE (op) == SUBREG
&& SUBREG_PROMOTED_VAR_P (op)
&& ! SUBREG_PROMOTED_UNSIGNED_P (op)
&& GET_MODE (XEXP (op, 0)) == mode)
return XEXP (op, 0);
#if defined(POINTERS_EXTEND_UNSIGNED) && !defined(HAVE_ptr_extend)
if (! POINTERS_EXTEND_UNSIGNED
&& mode == Pmode && GET_MODE (op) == ptr_mode
@ -1043,8 +1052,17 @@ simplify_unary_operation (enum rtx_code code, enum machine_mode mode,
#endif
break;
#if defined(POINTERS_EXTEND_UNSIGNED) && !defined(HAVE_ptr_extend)
case ZERO_EXTEND:
/* Check for a zero extension of a subreg of a promoted
variable, where the promotion is zero-extended, and the
target mode is the same as the variable's promotion. */
if (GET_CODE (op) == SUBREG
&& SUBREG_PROMOTED_VAR_P (op)
&& SUBREG_PROMOTED_UNSIGNED_P (op)
&& GET_MODE (XEXP (op, 0)) == mode)
return XEXP (op, 0);
#if defined(POINTERS_EXTEND_UNSIGNED) && !defined(HAVE_ptr_extend)
if (POINTERS_EXTEND_UNSIGNED > 0
&& mode == Pmode && GET_MODE (op) == ptr_mode
&& (CONSTANT_P (op)
@ -1053,8 +1071,8 @@ simplify_unary_operation (enum rtx_code code, enum machine_mode mode,
&& REG_POINTER (SUBREG_REG (op))
&& GET_MODE (SUBREG_REG (op)) == Pmode)))
return convert_memory_address (Pmode, op);
break;
#endif
break;
default:
break;