This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[4.4 resubmission] Extending simplify-rtx handling of SUBREG_PROMOTED_VAR_P
- From: Richard Sandiford <rsandifo at nildram dot co dot uk>
- To: gcc-patches at gcc dot gnu dot org
- Cc: bonzini at gnu dot org
- Date: Mon, 25 Feb 2008 21:33:02 +0000
- Subject: [4.4 resubmission] Extending simplify-rtx handling of SUBREG_PROMOTED_VAR_P
I posted this patch during stage 4.3 as an FYI:
http://gcc.gnu.org/ml/gcc-patches/2007-10/msg01667.html
Paolo, you seemed in favour of the patch here, except that I'd used
the wrong gen_lowpart function:
http://gcc.gnu.org/ml/gcc-patches/2007-10/msg01799.html
Here's the corrected version. Bootstrapped & regression-tested on
x86_64-linux-gnu. Regression-tested on mips64-linux-gnu. OK for trunk?
Richard
gcc/
* simplify-rtx.c (simplify_unary_operation_1): Extend the handling
of SUBREG_PROMOTED_VAR_P to cope with cases where the extended value
is smaller than the original promoted value.
(simplify_subreg): If OP is a SUBREG, try to preserve its
SUBREG_PROMOTED_VAR_P information.
Index: gcc/simplify-rtx.c
===================================================================
--- gcc/simplify-rtx.c 2008-02-24 12:22:32.000000000 +0000
+++ gcc/simplify-rtx.c 2008-02-24 12:22:54.000000000 +0000
@@ -859,8 +859,8 @@ simplify_unary_operation_1 (enum rtx_cod
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);
+ && GET_MODE_SIZE (mode) <= GET_MODE_SIZE (GET_MODE (XEXP (op, 0))))
+ return rtl_hooks.gen_lowpart_no_emit (mode, op);
#if defined(POINTERS_EXTEND_UNSIGNED) && !defined(HAVE_ptr_extend)
if (! POINTERS_EXTEND_UNSIGNED
@@ -881,8 +881,8 @@ simplify_unary_operation_1 (enum rtx_cod
if (GET_CODE (op) == SUBREG
&& SUBREG_PROMOTED_VAR_P (op)
&& SUBREG_PROMOTED_UNSIGNED_P (op) > 0
- && GET_MODE (XEXP (op, 0)) == mode)
- return XEXP (op, 0);
+ && GET_MODE_SIZE (mode) <= GET_MODE_SIZE (GET_MODE (XEXP (op, 0))))
+ return rtl_hooks.gen_lowpart_no_emit (mode, op);
#if defined(POINTERS_EXTEND_UNSIGNED) && !defined(HAVE_ptr_extend)
if (POINTERS_EXTEND_UNSIGNED > 0
@@ -5021,7 +5021,21 @@ simplify_subreg (enum machine_mode outer
return newx;
if (validate_subreg (outermode, innermostmode,
SUBREG_REG (op), final_offset))
- return gen_rtx_SUBREG (outermode, SUBREG_REG (op), final_offset);
+ {
+ newx = gen_rtx_SUBREG (outermode, SUBREG_REG (op), final_offset);
+ if (SUBREG_PROMOTED_VAR_P (op)
+ && SUBREG_PROMOTED_UNSIGNED_P (op) >= 0
+ && IN_RANGE (GET_MODE_SIZE (outermode),
+ GET_MODE_SIZE (innermode),
+ GET_MODE_SIZE (innermostmode))
+ && subreg_lowpart_p (newx))
+ {
+ SUBREG_PROMOTED_VAR_P (newx) = 1;
+ SUBREG_PROMOTED_UNSIGNED_SET
+ (newx, SUBREG_PROMOTED_UNSIGNED_P (op));
+ }
+ return newx;
+ }
return NULL_RTX;
}