From 44a5da099ebaa8aa06912fb71b8114e495c839c6 Mon Sep 17 00:00:00 2001 From: Graham Stott Date: Thu, 22 Nov 2001 14:22:09 +0000 Subject: [PATCH] * local-alloc.c (combine_regs): Handle SUBREG_REG being a MEM. From-SVN: r47268 --- gcc/ChangeLog | 4 ++++ gcc/local-alloc.c | 62 +++++++++++++++++++++++++++++++++++-------------------- 2 files changed, 44 insertions(+), 22 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 685ef9a..80a3f1c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,7 @@ +2001-11-22 Graham Stott + + * local-alloc.c (combine_regs): Handle SUBREG_REG being a MEM. + Thu Nov 22 06:49:14 2001 Richard Kenner * config/i386/i386.md (leave, leave_rex64): Have RTL reflect what diff --git a/gcc/local-alloc.c b/gcc/local-alloc.c index 1c45ae4..43f74bca 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)); -- 2.7.4