From 8c266ffa32d238cc400fa8ed92448de789f67739 Mon Sep 17 00:00:00 2001 From: Steven Bosscher Date: Wed, 17 Oct 2012 06:15:38 +0000 Subject: [PATCH] df-problems.c (df_kill_notes): Split up in two functions. * 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; From-SVN: r192526 --- gcc/ChangeLog | 12 ++++++++++++ gcc/df-problems.c | 34 +++++++++++++++++++++++++++------- gcc/web.c | 3 +-- 3 files changed, 40 insertions(+), 9 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5bef03d..72b9e14 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,15 @@ +2012-10-16 Steven Bosscher + + * 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; + 2012-10-16 Ian Lance Taylor * doc/extend.texi (Return Address): Change diff --git a/gcc/df-problems.c b/gcc/df-problems.c index b4df2ba..3f9228d 100644 --- a/gcc/df-problems.c +++ b/gcc/df-problems.c @@ -2822,13 +2822,10 @@ df_ignore_stack_reg (int regno ATTRIBUTE_UNUSED) #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_index, 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_index, } } + df_remove_dead_eq_notes (insn, live); + if (debug_insn == -1) { /* ??? We could probably do better here, replacing dead diff --git a/gcc/web.c b/gcc/web.c index 2816681..d565634 100644 --- a/gcc/web.c +++ b/gcc/web.c @@ -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); -- 2.7.4