mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-14 17:41:08 +08:00
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:
parent
ea8f106d4c
commit
7cd689bcf0
@ -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*
|
||||
|
@ -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 = ®_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
|
||||
|
@ -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 = ®_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
|
||||
|
@ -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);
|
||||
|
@ -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 = ®_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. */
|
||||
|
Loading…
x
Reference in New Issue
Block a user