* df-problems.c (df_kill_notes): Split up in two functions. (df_remove_dead_and_unused_notes): New function, first half of df_kill notes to remove all REG_DEAD and REG_UNUSED notes. (df_remove_dead_eq_notes): New function, second half of df_kill_notes to remove REG_EQUAL and REG_EQUIV notes referring to dead registers. (df_note_bb_compute): Call df_remove_dead_and_unused_notes instead of df_kill_notes. Call df_remove_dead_eq_notes after processing insn. * web.c (web): Re-add DF_RD_PRUNE_DEAD_DEFS; Index: df-problems.c =================================================================== --- df-problems.c (revision 192490) +++ df-problems.c (working copy) @@ -2822,13 +2822,10 @@ df_ignore_stack_reg (int regno ATTRIBUTE #endif -/* Remove all of the REG_DEAD or REG_UNUSED notes from INSN and add - them to OLD_DEAD_NOTES and OLD_UNUSED_NOTES. Remove also - REG_EQUAL/REG_EQUIV notes referring to dead pseudos using LIVE - as the bitmap of currently live registers. */ +/* Remove all of the REG_DEAD or REG_UNUSED notes from INSN. */ static void -df_kill_notes (rtx insn, bitmap live) +df_remove_dead_and_unused_notes (rtx insn) { rtx *pprev = ®_NOTES (insn); rtx link = *pprev; @@ -2873,6 +2870,27 @@ df_kill_notes (rtx insn, bitmap live) } break; + default: + pprev = &XEXP (link, 1); + link = *pprev; + break; + } + } +} + +/* Remove REG_EQUAL/REG_EQUIV notes referring to dead pseudos using LIVE + as the bitmap of currently live registers. */ + +static void +df_remove_dead_eq_notes (rtx insn, bitmap live) +{ + rtx *pprev = ®_NOTES (insn); + rtx link = *pprev; + + while (link) + { + switch (REG_NOTE_KIND (link)) + { case REG_EQUAL: case REG_EQUIV: { @@ -2913,6 +2931,7 @@ df_kill_notes (rtx insn, bitmap live) } break; } + default: pprev = &XEXP (link, 1); link = *pprev; @@ -2921,7 +2940,6 @@ df_kill_notes (rtx insn, bitmap live) } } - /* Set a NOTE_TYPE note for REG in INSN. */ static inline void @@ -3195,7 +3213,7 @@ df_note_bb_compute (unsigned int bb_inde debug_insn = DEBUG_INSN_P (insn); bitmap_clear (do_not_gen); - df_kill_notes (insn, live); + df_remove_dead_and_unused_notes (insn); /* Process the defs. */ if (CALL_P (insn)) @@ -3336,6 +3354,8 @@ df_note_bb_compute (unsigned int bb_inde } } + df_remove_dead_eq_notes (insn, live); + if (debug_insn == -1) { /* ??? We could probably do better here, replacing dead Index: web.c =================================================================== --- web.c (revision 192490) +++ web.c (working copy) @@ -336,8 +336,7 @@ web_main (void) rtx insn; df_set_flags (DF_NO_HARD_REGS + DF_EQ_NOTES); - /* We can not RD_PRUNE_DEAD_DEFS, because we care about REG_EQUAL - notes. */ + df_set_flags (DF_RD_PRUNE_DEAD_DEFS); df_chain_add_problem (DF_UD_CHAIN); df_analyze (); df_set_flags (DF_DEFER_INSN_RESCAN);