aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Kenner <kenner@gcc.gnu.org>1995-08-26 06:56:53 -0400
committerRichard Kenner <kenner@gcc.gnu.org>1995-08-26 06:56:53 -0400
commita7911cd2b4620ced3322c9dea68c926fa0ea16a7 (patch)
tree3cce62cd492b1a367d56263c40c5907090c3f449
parent67340b0310b5f62fe9e6ff0316cf8cbe556278d1 (diff)
downloadgcc-a7911cd2b4620ced3322c9dea68c926fa0ea16a7.zip
gcc-a7911cd2b4620ced3322c9dea68c926fa0ea16a7.tar.gz
gcc-a7911cd2b4620ced3322c9dea68c926fa0ea16a7.tar.bz2
(emit_reload_insns): Do nothing for SUBREG whose operand is unused subsequently.
(emit_reload_insns): Do nothing for SUBREG whose operand is unused subsequently. In secondary reload case, if paradoxical SUBREG for output, reload thing inside SUBREG, just like gen_reload. From-SVN: r10284
-rw-r--r--gcc/reload1.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/gcc/reload1.c b/gcc/reload1.c
index 03ade38..5343e2d 100644
--- a/gcc/reload1.c
+++ b/gcc/reload1.c
@@ -6259,6 +6259,16 @@ emit_reload_insns (insn)
XEXP (note, 0) = reload_reg_rtx[j];
continue;
}
+ /* Likewise for a SUBREG of an operand that dies. */
+ else if (GET_CODE (old) == SUBREG
+ && GET_CODE (SUBREG_REG (old)) == REG
+ && 0 != (note = find_reg_note (insn, REG_UNUSED,
+ SUBREG_REG (old))))
+ {
+ XEXP (note, 0) = gen_lowpart_common (GET_MODE (old),
+ reload_reg_rtx[j]);
+ continue;
+ }
else if (GET_CODE (old) == SCRATCH)
/* If we aren't optimizing, there won't be a REG_UNUSED note,
but we don't want to make an output reload. */
@@ -6344,11 +6354,23 @@ emit_reload_insns (insn)
{
rtx third_reloadreg
= reload_reg_rtx[reload_secondary_out_reload[secondary_reload]];
+ rtx tem;
/* Copy primary reload reg to secondary reload reg.
(Note that these have been swapped above, then
secondary reload reg to OLD using our insn. */
+ /* If REAL_OLD is a paradoxical SUBREG, remove it
+ and try to put the opposite SUBREG on
+ RELOADREG. */
+ if (GET_CODE (real_old) == SUBREG
+ && (GET_MODE_SIZE (GET_MODE (real_old))
+ > GET_MODE_SIZE (GET_MODE (SUBREG_REG (real_old))))
+ && 0 != (tem = gen_lowpart_common
+ (GET_MODE (SUBREG_REG (real_old)),
+ reloadreg)))
+ real_old = SUBREG_REG (real_old), reloadreg = tem;
+
gen_reload (reloadreg, second_reloadreg,
reload_opnum[j], reload_when_needed[j]);
emit_insn ((GEN_FCN (tertiary_icode)