From: J"orn Rennecke Date: Tue, 19 Dec 2000 00:42:31 +0000 (+0000) Subject: reload.c (push_reload): When using a dying register for the reload register in an... X-Git-Tag: prereleases/libstdc++-2.92~2137 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=d0b6af711c43f070719fa06f4bc154405377b295;p=thirdparty%2Fgcc.git reload.c (push_reload): When using a dying register for the reload register in an in-out reload... * reload.c (push_reload): When using a dying register for the reload register in an in-out reload, use outmode if wider than inmode. From-SVN: r38373 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index cb3001e0b137..6932876158be 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +Tue Dec 19 00:37:08 2000 J"orn Rennecke + + * reload.c (push_reload): When using a dying register for the reload + register in an in-out reload, use outmode if wider than inmode. + 2000-12-19 Joseph S. Myers * config/d30v/d30v.h (EXIT_BODY): Update comment. diff --git a/gcc/reload.c b/gcc/reload.c index 86d80c1af23b..ddc599fc247d 100644 --- a/gcc/reload.c +++ b/gcc/reload.c @@ -1451,6 +1451,10 @@ push_reload (in, out, inloc, outloc, class, { rtx note; int regno; + enum machine_mode rel_mode = inmode; + + if (out && GET_MODE_SIZE (outmode) > GET_MODE_SIZE (inmode)) + rel_mode = outmode; for (note = REG_NOTES (this_insn); note; note = XEXP (note, 1)) if (REG_NOTE_KIND (note) == REG_DEAD @@ -1460,7 +1464,7 @@ push_reload (in, out, inloc, outloc, class, && ! refers_to_regno_for_reload_p (regno, (regno + HARD_REGNO_NREGS (regno, - inmode)), + rel_mode)), PATTERN (this_insn), inloc) /* If this is also an output reload, IN cannot be used as the reload register if it is set in this insn unless IN @@ -1469,7 +1473,7 @@ push_reload (in, out, inloc, outloc, class, || ! hard_reg_set_here_p (regno, (regno + HARD_REGNO_NREGS (regno, - inmode)), + rel_mode)), PATTERN (this_insn))) /* ??? Why is this code so different from the previous? Is there any simple coherent way to describe the two together? @@ -1481,9 +1485,9 @@ push_reload (in, out, inloc, outloc, class, == ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (in))) + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD)))) /* Make sure the operand fits in the reg that dies. */ - && GET_MODE_SIZE (inmode) <= GET_MODE_SIZE (GET_MODE (XEXP (note, 0))) + && (GET_MODE_SIZE (rel_mode) + <= GET_MODE_SIZE (GET_MODE (XEXP (note, 0)))) && HARD_REGNO_MODE_OK (regno, inmode) - && GET_MODE_SIZE (outmode) <= GET_MODE_SIZE (GET_MODE (XEXP (note, 0))) && HARD_REGNO_MODE_OK (regno, outmode)) { unsigned int offs; @@ -1498,7 +1502,7 @@ push_reload (in, out, inloc, outloc, class, if (offs == nregs) { - rld[i].reg_rtx = gen_rtx_REG (inmode, regno); + rld[i].reg_rtx = gen_rtx_REG (rel_mode, regno); break; } }