summaryrefslogtreecommitdiff
path: root/gcc/regrename.c
diff options
context:
space:
mode:
authorchrbr <chrbr@138bc75d-0d04-0410-961f-82ee72b054a4>2009-09-15 13:15:51 +0000
committerchrbr <chrbr@138bc75d-0d04-0410-961f-82ee72b054a4>2009-09-15 13:15:51 +0000
commitdfbe3fb616b2d61f3c25588bb1fe206014bdea09 (patch)
tree1d5dc639c5f8dc99a27155272a568a39dae7b788 /gcc/regrename.c
parentf4f7b066c2fa56fd484171eb345cd6caa241274f (diff)
downloadgcc-dfbe3fb616b2d61f3c25588bb1fe206014bdea09.tar.gz
Update REG_DEAD notes
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@151720 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/regrename.c')
-rw-r--r--gcc/regrename.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/gcc/regrename.c b/gcc/regrename.c
index 03aba8073a2..68d08749e6e 100644
--- a/gcc/regrename.c
+++ b/gcc/regrename.c
@@ -376,11 +376,26 @@ do_replace (struct du_chain *chain, int reg)
INSN_VAR_LOCATION_LOC (chain->insn) = gen_rtx_UNKNOWN_VAR_LOC ();
else
{
+ rtx note;
+
*chain->loc = gen_raw_REG (GET_MODE (*chain->loc), reg);
if (regno >= FIRST_PSEUDO_REGISTER)
ORIGINAL_REGNO (*chain->loc) = regno;
REG_ATTRS (*chain->loc) = attr;
REG_POINTER (*chain->loc) = reg_ptr;
+
+ for (note = REG_NOTES (chain->insn); note; note = XEXP (note, 1))
+ {
+ if (REG_NOTE_KIND (note) == REG_DEAD
+ || REG_NOTE_KIND (note) == REG_UNUSED)
+ {
+ rtx reg = XEXP (note, 0);
+ gcc_assert (HARD_REGISTER_P (reg));
+
+ if (REGNO (reg) == base_regno)
+ XEXP (note, 0) = *chain->loc;
+ }
+ }
}
df_insn_rescan (chain->insn);