From ed937a19933c284504d74a480f04c926386e1107 Mon Sep 17 00:00:00 2001 From: "J\"orn Rennecke" Date: Wed, 9 Dec 1998 11:39:17 +0000 Subject: [PATCH] reload1.c (reload_combine, [...]): Make USE_RUID always valid. * reload1.c (reload_combine, reload_combine_note_store): Make USE_RUID always valid. (reload_combine): Check if BASE is clobbered too early. From-SVN: r24216 --- gcc/ChangeLog | 6 ++++++ gcc/reload1.c | 27 ++++++++++++++++++++------- 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ae7983d164d..0a083abb673 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +Wed Dec 9 19:36:57 1998 J"orn Rennecke + + * reload1.c (reload_combine, reload_combine_note_store): + Make USE_RUID always valid. + (reload_combine): Check if BASE is clobbered too early. + Wed Dec 9 09:53:58 1998 Nick Clifton * reload.c (find_reloads): Display the insn that cannot be diff --git a/gcc/reload1.c b/gcc/reload1.c index 4a90c25dbb5..c974c2625bc 100644 --- a/gcc/reload1.c +++ b/gcc/reload1.c @@ -9357,7 +9357,10 @@ struct reg_use { rtx insn, *usep; }; register (which is first among these we have seen since we scan backwards), OFFSET contains the constant offset that is added to the register in all encountered uses, and USE_RUID indicates the first encountered, i.e. - last, of these uses. */ + last, of these uses. + STORE_RUID is always meaningful if we only want to use a value in a + register in a different place: it denotes the next insn in the insn + stream (i.e. the last ecountered) that sets or clobbers the register. */ static struct { struct reg_use reg_use[RELOAD_COMBINE_MAX_USES]; @@ -9405,13 +9408,11 @@ reload_combine () last_label_ruid = reload_combine_ruid = 0; for (i = FIRST_PSEUDO_REGISTER - 1; i >= 0; --i) { + reg_state[i].store_ruid = reload_combine_ruid; if (fixed_regs[i]) reg_state[i].use_index = -1; else - { - reg_state[i].use_index = RELOAD_COMBINE_MAX_USES; - reg_state[i].store_ruid = reload_combine_ruid; - } + reg_state[i].use_index = RELOAD_COMBINE_MAX_USES; } for (insn = get_last_insn (); insn; insn = PREV_INSN (insn)) @@ -9493,10 +9494,14 @@ reload_combine () } } } + /* Check that PREV_SET is indeed (set (REGX) (CONST_INT)) and that + (REGY), i.e. BASE, is not clobbered before the last use we'll + create. */ if (prev_set && GET_CODE (SET_SRC (prev_set)) == CONST_INT && rtx_equal_p (SET_DEST (prev_set), reg) && reg_state[regno].use_index >= 0 + && reg_state[REGNO (base)].store_ruid <= reg_state[regno].use_ruid && reg_sum) { int i; @@ -9588,7 +9593,12 @@ reload_combine () { if (REG_NOTE_KIND (note) == REG_INC && GET_CODE (XEXP (note, 0)) == REG) - reg_state[REGNO (XEXP (note, 0))].use_index = -1; + { + int regno = REGNO (XEXP (note, 0)); + + reg_state[regno].store_ruid = reload_combine_ruid; + reg_state[regno].use_index = -1; + } } } } @@ -9616,7 +9626,10 @@ reload_combine_note_store (dst, set) /* note_stores might have stripped a STRICT_LOW_PART, so we have to be careful with registers / register parts that are not full words. */ if (size < (unsigned) UNITS_PER_WORD) - reg_state[regno].use_index = -1; + { + reg_state[regno].use_index = -1; + reg_state[regno].store_ruid = reload_combine_ruid; + } else { for (i = size / UNITS_PER_WORD - 1 + regno; i >= regno; i--) -- 2.30.2