diff options
author | Richard Stallman <rms@gnu.org> | 1993-05-07 22:05:09 +0000 |
---|---|---|
committer | Richard Stallman <rms@gnu.org> | 1993-05-07 22:05:09 +0000 |
commit | 05b4ec4f0f3d4605246783e543720373f68fbd0e (patch) | |
tree | b86c6ea7b300a46cfa294bbfb4c89a2264c3d87e | |
parent | 1e558d3581b65f3e6b67f239420a99eb0cf95b99 (diff) | |
download | gcc-05b4ec4f0f3d4605246783e543720373f68fbd0e.zip gcc-05b4ec4f0f3d4605246783e543720373f68fbd0e.tar.gz gcc-05b4ec4f0f3d4605246783e543720373f68fbd0e.tar.bz2 |
(push_reload): Don't use IN as the reload reg in in-out
reload if it is set elsewhere in the insn.
From-SVN: r4382
-rw-r--r-- | gcc/reload.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/gcc/reload.c b/gcc/reload.c index 4673468..77cc05d 100644 --- a/gcc/reload.c +++ b/gcc/reload.c @@ -1263,6 +1263,18 @@ push_reload (in, out, inloc, outloc, class, + HARD_REGNO_NREGS (regno, inmode)), 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 + is also OUT. */ + && (out == 0 || in == out + || ! hard_reg_set_here_p (regno, + (regno + + HARD_REGNO_NREGS (regno, + inmode)), + PATTERN (this_insn))) + /* ??? Why is this code so different from the previous? + Is there any simple coherent way to describe the two together? + What's going on here. */ && (in != out || (GET_CODE (in) == SUBREG && (((GET_MODE_SIZE (GET_MODE (in)) + (UNITS_PER_WORD - 1)) |