rtl.h (remove_reg_equal_equiv_notes): New prototype.

* rtl.h (remove_reg_equal_equiv_notes): New prototype.
	* rtlanal.c (remove_reg_equal_equiv_notes): New function.
	* combine.c (adjust_for_new_dest): Use it.
	* postreload.c (reload_combine): Likewise.

From-SVN: r122178
This commit is contained in:
Steven Bosscher 2007-02-20 22:14:41 +00:00
parent ea8f106d4c
commit 7cd689bcf0
5 changed files with 28 additions and 21 deletions

View File

@ -1,3 +1,10 @@
2007-02-20 Steven Bosscher <steven@gcc.gnu.org>
* rtl.h (remove_reg_equal_equiv_notes): New prototype.
* rtlanal.c (remove_reg_equal_equiv_notes): New function.
* combine.c (adjust_for_new_dest): Use it.
* postreload.c (reload_combine): Likewise.
2007-02-20 Steven Bosscher <steven@gcc.gnu.org>
* rtlanal.c (find_reg_equal_equiv_note): Do not find REG_EQ*

View File

@ -1726,18 +1726,8 @@ likely_spilled_retval_p (rtx insn)
static void
adjust_for_new_dest (rtx insn)
{
rtx *loc;
/* For notes, be conservative and simply remove them. */
loc = &REG_NOTES (insn);
while (*loc)
{
enum reg_note kind = REG_NOTE_KIND (*loc);
if (kind == REG_EQUAL || kind == REG_EQUIV)
*loc = XEXP (*loc, 1);
else
loc = &XEXP (*loc, 1);
}
remove_reg_equal_equiv_notes (insn);
/* The new insn will have a destination that was previously the destination
of an insn just above it. Call distribute_links to make a LOG_LINK from

View File

@ -887,22 +887,13 @@ reload_combine (void)
if (apply_change_group ())
{
rtx *np;
/* Delete the reg-reg addition. */
delete_insn (insn);
if (reg_state[regno].offset != const0_rtx)
/* Previous REG_EQUIV / REG_EQUAL notes for PREV
are now invalid. */
for (np = &REG_NOTES (prev); *np;)
{
if (REG_NOTE_KIND (*np) == REG_EQUAL
|| REG_NOTE_KIND (*np) == REG_EQUIV)
*np = XEXP (*np, 1);
else
np = &XEXP (*np, 1);
}
remove_reg_equal_equiv_notes (prev);
reg_state[regno].use_index = RELOAD_COMBINE_MAX_USES;
reg_state[REGNO (const_reg)].store_ruid

View File

@ -1702,6 +1702,7 @@ extern int find_reg_fusage (rtx, enum rtx_code, rtx);
extern int find_regno_fusage (rtx, enum rtx_code, unsigned int);
extern int pure_call_p (rtx);
extern void remove_note (rtx, rtx);
extern void remove_reg_equal_equiv_notes (rtx);
extern int side_effects_p (rtx);
extern int volatile_refs_p (rtx);
extern int volatile_insn_p (rtx);

View File

@ -1820,6 +1820,24 @@ remove_note (rtx insn, rtx note)
gcc_unreachable ();
}
/* Remove REG_EQUAL and/or REG_EQUIV notes if INSN has such notes. */
void
remove_reg_equal_equiv_notes (rtx insn)
{
rtx *loc;
loc = &REG_NOTES (insn);
while (*loc)
{
enum reg_note kind = REG_NOTE_KIND (*loc);
if (kind == REG_EQUAL || kind == REG_EQUIV)
*loc = XEXP (*loc, 1);
else
loc = &XEXP (*loc, 1);
}
}
/* Search LISTP (an EXPR_LIST) for an entry whose first operand is NODE and
return 1 if it is found. A simple equality test is used to determine if
NODE matches. */