Message ID | 4EC6E724.4090008@mentor.com |
---|---|
State | New |
Headers | show |
Hi, On Sat, 19 Nov 2011, Tom de Vries wrote: > On 11/18/2011 10:29 PM, Eric Botcazou wrote: > >> For the test-case of PR50764, a dead label is introduced by > >> fixup_reorder_chain in cfg_layout_finalize, called from > >> pass_reorder_blocks. > > > > I presume that there is no reasonable way of preventing fixup_reorder_chain > > from introducing it or of teaching fixup_reorder_chain to remove it? > > > > This (untested) patch also removes the dead label for the PR, and I > think it is safe. ... cfgrtl.c has already code to delete labels (delete_insn) when appropriate (can_delete_label_p). Perhaps that can be reused somehow. > Index: cfglayout.c > =================================================================== --- > cfglayout.c (revision 181377) +++ cfglayout.c (working copy) @@ -702,6 > +702,21 @@ relink_block_chain (bool stay_in_cfglayo > } > > > +static bool > +forced_label_p (rtx label) > +{ > + rtx insn, forced_label; > + for (insn = forced_labels; insn; insn = XEXP (insn, 1)) > + { > + forced_label = XEXP (insn, 0); > + if (!LABEL_P (forced_label)) > + continue; > + if (forced_label == label) > + return true; > + } > + return false; > +} That's in_expr_list_p(). > @@ -857,6 +872,12 @@ fixup_reorder_chain (void) > (e_taken->src, e_taken->dest)); > e_taken->flags |= EDGE_FALLTHRU; > update_br_prob_note (bb); > + if (LABEL_NUSES (ret_label) == 0 > + && !LABEL_PRESERVE_P (ret_label) > + && LABEL_NAME (ret_label) == NULL > + && !forced_label_p (ret_label) And this is cfgrtl.c:can_delete_label_p. Note that you actually can remove labels also if they are !can_delete_label_p, if you use delete_insn (which you do). It will replace such undeletable labels by a DELETED_LABEL note. Ciao, Michael.
Index: cfglayout.c =================================================================== --- cfglayout.c (revision 181377) +++ cfglayout.c (working copy) @@ -702,6 +702,21 @@ relink_block_chain (bool stay_in_cfglayo } +static bool +forced_label_p (rtx label) +{ + rtx insn, forced_label; + for (insn = forced_labels; insn; insn = XEXP (insn, 1)) + { + forced_label = XEXP (insn, 0); + if (!LABEL_P (forced_label)) + continue; + if (forced_label == label) + return true; + } + return false; +} + /* Given a reorder chain, rearrange the code to match. */ static void @@ -857,6 +872,12 @@ fixup_reorder_chain (void) (e_taken->src, e_taken->dest)); e_taken->flags |= EDGE_FALLTHRU; update_br_prob_note (bb); + if (LABEL_NUSES (ret_label) == 0 + && !LABEL_PRESERVE_P (ret_label) + && LABEL_NAME (ret_label) == NULL + && !forced_label_p (ret_label) + && single_pred_p (e_taken->dest)) + delete_insn (ret_label); continue; } }