We're updating REG_DEAD notes in regrename.c, but it seems this is for historical reasons only. As far as I can tell, every pass that needs such notes recomputes them with df_note_add_problem/df_analyze, and the following patch bootstrapped and tested successfully on i686-linux (some random libmudflap failures mentioned previously), with the following change to ensure it's tested:
+++ gcc/config/i386/i386.c (working copy) @@ -5099,6 +5099,9 @@ static const struct default_options ix86 #ifdef INSN_SCHEDULING { OPT_LEVELS_ALL, OPT_fschedule_insns, NULL, 0 }, #endif +#ifdef INSN_SCHEDULING + { OPT_LEVELS_2_PLUS, OPT_frename_registers, NULL, 1 }, +#endif Ok? Bernd
* regrename.c (do_replace): Don't update notes. Index: gcc/regrename.c =================================================================== --- gcc/regrename.c (revision 174842) +++ gcc/regrename.c (working copy) @@ -432,7 +432,6 @@ do_replace (struct du_head *head, int re { struct du_chain *chain; unsigned int base_regno = head->regno; - bool found_note = false; gcc_assert (! DEBUG_INSN_P (head->first->insn)); @@ -446,46 +445,15 @@ do_replace (struct du_head *head, int re 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)) - { - enum reg_note kind = REG_NOTE_KIND (note); - if (kind == REG_DEAD || kind == REG_UNUSED) - { - rtx reg = XEXP (note, 0); - gcc_assert (HARD_REGISTER_P (reg)); - - if (REGNO (reg) == base_regno) - { - found_note = true; - if (kind == REG_DEAD - && reg_set_p (*chain->loc, chain->insn)) - remove_note (chain->insn, note); - else - XEXP (note, 0) = *chain->loc; - break; - } - } - } } df_insn_rescan (chain->insn); } - if (!found_note) - { - /* If the chain's first insn is the same as the last, we should have - found a REG_UNUSED note. */ - gcc_assert (head->first->insn != head->last->insn); - if (!reg_set_p (*head->last->loc, head->last->insn)) - add_reg_note (head->last->insn, REG_DEAD, *head->last->loc); - } }