* Extending simplify-rtx handling of SUBREG_PROMOTED_VAR_P
@ 2007-10-28 12:32 Richard Sandiford
0 siblings, 0 replies; only message in thread
From: Richard Sandiford @ 2007-10-28 12:32 UTC (permalink / raw)
To: gcc-patches
This isn't really stage 3 material, but since the patch is written
and tested, I thought I might as well post it anyway for comments.
While looking at the DSE patch that I posted earlier, I found a case
in which we had:
(set (reg:SI foo) (sign_extend:SI (subreg/s:QI (reg:DI R))))
where the "/s" indicates that R is a sign-extension of a QImode value.
This is equivalent to:
(set (reg:SI foo) (subreg/s:SI (reg:DI R)))
since R is also the sign extension of an SImode value (which is itself
an extension of a QImode value). The transformation would be correct
even without the "/s" in the new subreg, but keeping it preserves more
information.
The patch adds code to handle this case. In other words:
- it generalises the existing SUBREG_PROMOTED_VAR_P handling to
cope with cases where the extended value is not as wide as the
fully-promoted value (but is still wider than the unpromoted
value, because extensions are always widening operations).
- it makes simplify_subreg keep the SUBREG_PROMOTED_VAR_P
information in an input SUBREG, in cases where doing so
is valid.
The CSiBE results for mipsisa64-elf at -Os (without the DSE patch) are:
Total 3605997 3605713 : 99.99%
which is wortwhile but hardly earth-shattering. Bootstrapped &
regression-tested on x86_64-linux-gnu. Also regression-tested on
mipsisa32-elf and mipsisa64-elf.
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 2007-10-27 09:25:22.000000000 +0100
+++ gcc/simplify-rtx.c 2007-10-27 09:32:58.000000000 +0100
@@ -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 gen_lowpart_common (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 gen_lowpart_common (mode, op);
#if defined(POINTERS_EXTEND_UNSIGNED) && !defined(HAVE_ptr_extend)
if (POINTERS_EXTEND_UNSIGNED > 0
@@ -5001,7 +5001,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;
}
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2007-10-28 12:04 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2007-10-28 12:32 Extending simplify-rtx handling of SUBREG_PROMOTED_VAR_P Richard Sandiford
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).