From: Richard Henderson Date: Wed, 14 Apr 1999 10:00:12 +0000 (-0700) Subject: reload1.c (emit_reload_insns): Also find equivalent mems for subregs of pseudos. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=4eea1672584f6ff384865ccf3e93194a85b3eb99;p=gcc.git reload1.c (emit_reload_insns): Also find equivalent mems for subregs of pseudos. * reload1.c (emit_reload_insns): Also find equivalent mems for subregs of pseudos. From-SVN: r26444 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a701e942197..3990cc140b1 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +Wed Apr 14 09:59:38 1999 Richard Henderson + + * reload1.c (emit_reload_insns): Also find equivalent mems + for subregs of pseudos. + Wed Apr 14 09:39:20 1999 Richard Henderson * i386.md (neghi): Use the whole register when widening the op. diff --git a/gcc/reload1.c b/gcc/reload1.c index e97e98e8e08..c566d3819d0 100644 --- a/gcc/reload1.c +++ b/gcc/reload1.c @@ -6865,6 +6865,7 @@ emit_reload_insns (chain) int secondary_reload = reload_secondary_in_reload[j]; rtx real_oldequiv = oldequiv; rtx real_old = old; + rtx tmp; /* If OLDEQUIV is a pseudo with a MEM, get the real MEM and similarly for OLD. @@ -6873,30 +6874,42 @@ emit_reload_insns (chain) equivalent MEM, we must fall back to reload_in, which will have all the necessary substitutions registered. Likewise for a pseudo that can't be replaced with its - equivalent constant. */ + equivalent constant. + + Take extra care for subregs of such pseudos. Note that + we cannot use reg_equiv_mem in this case because it is + not in the right mode. */ - if (GET_CODE (oldequiv) == REG - && REGNO (oldequiv) >= FIRST_PSEUDO_REGISTER - && (reg_equiv_memory_loc[REGNO (oldequiv)] != 0 - || reg_equiv_constant[REGNO (oldequiv)] != 0)) + tmp = oldequiv; + if (GET_CODE (tmp) == SUBREG) + tmp = SUBREG_REG (tmp); + if (GET_CODE (tmp) == REG + && REGNO (tmp) >= FIRST_PSEUDO_REGISTER + && (reg_equiv_memory_loc[REGNO (tmp)] != 0 + || reg_equiv_constant[REGNO (tmp)] != 0)) { - if (! reg_equiv_mem[REGNO (oldequiv)] - || num_not_at_initial_offset) + if (! reg_equiv_mem[REGNO (tmp)] + || num_not_at_initial_offset + || GET_CODE (oldequiv) == SUBREG) real_oldequiv = reload_in[j]; else - real_oldequiv = reg_equiv_mem[REGNO (oldequiv)]; + real_oldequiv = reg_equiv_mem[REGNO (tmp)]; } - if (GET_CODE (old) == REG - && REGNO (old) >= FIRST_PSEUDO_REGISTER - && (reg_equiv_memory_loc[REGNO (old)] != 0 - || reg_equiv_constant[REGNO (old)] != 0)) + tmp = old; + if (GET_CODE (tmp) == SUBREG) + tmp = SUBREG_REG (tmp); + if (GET_CODE (tmp) == REG + && REGNO (tmp) >= FIRST_PSEUDO_REGISTER + && (reg_equiv_memory_loc[REGNO (tmp)] != 0 + || reg_equiv_constant[REGNO (tmp)] != 0)) { - if (! reg_equiv_mem[REGNO (old)] - || num_not_at_initial_offset) + if (! reg_equiv_mem[REGNO (tmp)] + || num_not_at_initial_offset + || GET_CODE (old) == SUBREG) real_old = reload_in[j]; else - real_old = reg_equiv_mem[REGNO (old)]; + real_old = reg_equiv_mem[REGNO (tmp)]; } second_reload_reg = reload_reg_rtx[secondary_reload];