aboutsummaryrefslogtreecommitdiff
path: root/gcc/reload1.c
diff options
context:
space:
mode:
authorJ"orn Rennecke <amylaar@cygnus.co.uk>1998-12-09 11:39:17 +0000
committerJoern Rennecke <amylaar@gcc.gnu.org>1998-12-09 11:39:17 +0000
commited937a19933c284504d74a480f04c926386e1107 (patch)
treed92653963a7fae38e7ca39eb74e94fefb35729f4 /gcc/reload1.c
parent290b61f7fa8fa2444fea905363113d31b1e651a2 (diff)
downloadgcc-ed937a19933c284504d74a480f04c926386e1107.zip
gcc-ed937a19933c284504d74a480f04c926386e1107.tar.gz
gcc-ed937a19933c284504d74a480f04c926386e1107.tar.bz2
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
Diffstat (limited to 'gcc/reload1.c')
-rw-r--r--gcc/reload1.c27
1 files changed, 20 insertions, 7 deletions
diff --git a/gcc/reload1.c b/gcc/reload1.c
index 4a90c25..c974c26 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--)