From: Bernd Schmidt Date: Tue, 3 Apr 2001 14:46:54 +0000 (+0000) Subject: Backport reload_combine bugfix X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5d22540e59f53b55cc53229e41294e49e9ecb946;p=thirdparty%2Fgcc.git Backport reload_combine bugfix From-SVN: r41057 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e8552ac619bb..d12f8e2b8ca8 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -21,6 +21,10 @@ (get_last_value_validate) : Same. (get_last_value) : Same. + Fri Mar 3 12:49:28 2000 J"orn Rennecke + * reload1.c (reload_combine_note_use): Handle return register USEs. + REG case: Handle multi-hard-register hard regs. + 2001-03-30 Bernd Schmidt * jump.c (delete_barrier_successors): Fix error in last change. diff --git a/gcc/reload1.c b/gcc/reload1.c index f8d87517a1b6..24eb0116a7ab 100644 --- a/gcc/reload1.c +++ b/gcc/reload1.c @@ -9970,6 +9970,21 @@ reload_combine_note_use (xp, insn) } break; + case USE: + /* If this is the USE of a return value, we can't change it. */ + if (GET_CODE (XEXP (x, 0)) == REG && REG_FUNCTION_VALUE_P (XEXP (x, 0))) + { + /* Mark the return register as used in an unknown fashion. */ + rtx reg = XEXP (x, 0); + int regno = REGNO (reg); + int nregs = HARD_REGNO_NREGS (regno, GET_MODE (reg)); + + while (--nregs >= 0) + reg_state[regno + nregs].use_index = -1; + return; + } + break; + case CLOBBER: if (GET_CODE (SET_DEST (x)) == REG) return; @@ -9986,12 +10001,23 @@ reload_combine_note_use (xp, insn) { int regno = REGNO (x); int use_index; + int nregs; /* Some spurious USEs of pseudo registers might remain. Just ignore them. */ if (regno >= FIRST_PSEUDO_REGISTER) return; + nregs = HARD_REGNO_NREGS (regno, GET_MODE (x)); + + /* We can't substitute into multi-hard-reg uses. */ + if (nregs > 1) + { + while (--nregs >= 0) + reg_state[regno + nregs].use_index = -1; + return; + } + /* If this register is already used in some unknown fashion, we can't do anything. If we decrement the index from zero to -1, we can't store more