diff options
author | grahams <grahams@138bc75d-0d04-0410-961f-82ee72b054a4> | 2001-11-22 14:22:09 +0000 |
---|---|---|
committer | grahams <grahams@138bc75d-0d04-0410-961f-82ee72b054a4> | 2001-11-22 14:22:09 +0000 |
commit | 7cbdd69742090d57fb123193bba8d977b3b91598 (patch) | |
tree | 8f02c75db182e66ff83fd6f610385066081d10c6 /gcc/local-alloc.c | |
parent | 021974f76bef046f8245d4151aaaf66c44fd03cd (diff) | |
download | gcc-7cbdd69742090d57fb123193bba8d977b3b91598.tar.gz |
* local-alloc.c (combine_regs): Handle SUBREG_REG being a MEM.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@47268 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/local-alloc.c')
-rw-r--r-- | gcc/local-alloc.c | 62 |
1 files changed, 40 insertions, 22 deletions
diff --git a/gcc/local-alloc.c b/gcc/local-alloc.c index 1c45ae4f069..43f74bca175 100644 --- a/gcc/local-alloc.c +++ b/gcc/local-alloc.c @@ -1801,20 +1801,29 @@ combine_regs (usedreg, setreg, may_save_copy, insn_number, insn, already_dead) while (GET_CODE (usedreg) == SUBREG) { - if (GET_MODE_SIZE (GET_MODE (SUBREG_REG (usedreg))) > UNITS_PER_WORD) - may_save_copy = 0; - if (REGNO (SUBREG_REG (usedreg)) < FIRST_PSEUDO_REGISTER) - offset += subreg_regno_offset (REGNO (SUBREG_REG (usedreg)), - GET_MODE (SUBREG_REG (usedreg)), - SUBREG_BYTE (usedreg), - GET_MODE (usedreg)); - else - offset += (SUBREG_BYTE (usedreg) - / REGMODE_NATURAL_SIZE (GET_MODE (usedreg))); - usedreg = SUBREG_REG (usedreg); + rtx subreg = SUBREG_REG (usedreg); + + if (GET_CODE (subreg) == REG) + { + if (GET_MODE_SIZE (GET_MODE (subreg)) > UNITS_PER_WORD) + may_save_copy = 0; + + if (REGNO (subreg) < FIRST_PSEUDO_REGISTER) + offset += subreg_regno_offset (REGNO (subreg), + GET_MODE (subreg), + SUBREG_BYTE (usedreg), + GET_MODE (usedreg)); + else + offset += (SUBREG_BYTE (usedreg) + / REGMODE_NATURAL_SIZE (GET_MODE (usedreg))); + } + + usedreg = subreg; } + if (GET_CODE (usedreg) != REG) return 0; + ureg = REGNO (usedreg); if (ureg < FIRST_PSEUDO_REGISTER) usize = HARD_REGNO_NREGS (ureg, GET_MODE (usedreg)); @@ -1825,20 +1834,29 @@ combine_regs (usedreg, setreg, may_save_copy, insn_number, insn, already_dead) while (GET_CODE (setreg) == SUBREG) { - if (GET_MODE_SIZE (GET_MODE (SUBREG_REG (setreg))) > UNITS_PER_WORD) - may_save_copy = 0; - if (REGNO (SUBREG_REG (setreg)) < FIRST_PSEUDO_REGISTER) - offset -= subreg_regno_offset (REGNO (SUBREG_REG (setreg)), - GET_MODE (SUBREG_REG (setreg)), - SUBREG_BYTE (setreg), - GET_MODE (setreg)); - else - offset -= (SUBREG_BYTE (setreg) - / REGMODE_NATURAL_SIZE (GET_MODE (setreg))); - setreg = SUBREG_REG (setreg); + rtx subreg = SUBREG_REG (setreg); + + if (GET_CODE (subreg) == REG) + { + if (GET_MODE_SIZE (GET_MODE (subreg)) > UNITS_PER_WORD) + may_save_copy = 0; + + if (REGNO (subreg) < FIRST_PSEUDO_REGISTER) + offset -= subreg_regno_offset (REGNO (subreg), + GET_MODE (subreg), + SUBREG_BYTE (setreg), + GET_MODE (setreg)); + else + offset -= (SUBREG_BYTE (setreg) + / REGMODE_NATURAL_SIZE (GET_MODE (setreg))); + } + + setreg = subreg; } + if (GET_CODE (setreg) != REG) return 0; + sreg = REGNO (setreg); if (sreg < FIRST_PSEUDO_REGISTER) ssize = HARD_REGNO_NREGS (sreg, GET_MODE (setreg)); |