diff options
author | J"orn Rennecke <amylaar@redhat.com> | 2000-12-19 00:42:31 +0000 |
---|---|---|
committer | Joern Rennecke <amylaar@gcc.gnu.org> | 2000-12-19 00:42:31 +0000 |
commit | d0b6af711c43f070719fa06f4bc154405377b295 (patch) | |
tree | 32bd2cbf3c3edcfbc6f2bde32226fb2e8a067bd9 | |
parent | 3173ca6431f12a3a48eabfed93ade74edb47788e (diff) | |
download | gcc-d0b6af711c43f070719fa06f4bc154405377b295.zip gcc-d0b6af711c43f070719fa06f4bc154405377b295.tar.gz gcc-d0b6af711c43f070719fa06f4bc154405377b295.tar.bz2 |
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
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/reload.c | 14 |
2 files changed, 14 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index cb3001e..6932876 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +Tue Dec 19 00:37:08 2000 J"orn Rennecke <amylaar@redhat.com> + + * 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 <jsm28@cam.ac.uk> * config/d30v/d30v.h (EXIT_BODY): Update comment. diff --git a/gcc/reload.c b/gcc/reload.c index 86d80c1..ddc599f 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; } } |