Tom de Vries <[email protected]> writes:
> On 27/11/11 23:59, Eric Botcazou wrote:
>>> No, DELETED_LABEL notes still work just fine. It depends on how you
>>> remove the label and replace it with a note, and Tom isn't showing
>>> what he did, so...
>>
>> I agree that there is no obvious reason why just calling delete_insn would
>> not
>> work, so this should be investigated first.
>>
>
> The reason it didn't work, is because after turning a label into a
> NOTE_INSN_DELETED_LABEL, one needs to move it to after the
> NOTE_INSN_BASIC_BLOCK
> as in cfgcleanup.c:try_optimize_cfg():
> ...
> delete_insn_chain (label, label, false);
> /* If the case label is undeletable, move it after the
> BASIC_BLOCK note. */
> if (NOTE_KIND (BB_HEAD (b)) == NOTE_INSN_DELETED_LABEL)
> {
> rtx bb_note = NEXT_INSN (BB_HEAD (b));
>
> reorder_insns_nobb (label, label, bb_note);
> BB_HEAD (b) = bb_note;
> if (BB_END (b) == bb_note)
> BB_END (b) = label;
> }
> ...
>
> Attached patch factors out this piece of code and reuses it in
> fixup_reorder_chain.
But isn't...
> @@ -2637,15 +2658,7 @@ try_optimize_cfg (int mode)
> delete_insn_chain (label, label, false);
> /* If the case label is undeletable, move it after the
> BASIC_BLOCK note. */
> - if (NOTE_KIND (BB_HEAD (b)) == NOTE_INSN_DELETED_LABEL)
> - {
> - rtx bb_note = NEXT_INSN (BB_HEAD (b));
> -
> - reorder_insns_nobb (label, label, bb_note);
> - BB_HEAD (b) = bb_note;
> - if (BB_END (b) == bb_note)
> - BB_END (b) = label;
> - }
> + fixup_deleted_label (b);
...this "delete_insn_chain (label, label, false);" call equivalent
to "delete_insn (label)"? Splitting the operation in two here and:
> Index: gcc/cfglayout.c
> ===================================================================
> --- gcc/cfglayout.c (revision 181652)
> +++ gcc/cfglayout.c (working copy)
> @@ -857,6 +857,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
> + && single_pred_p (e_taken->dest))
> + {
> + delete_insn (ret_label);
> + fixup_deleted_label (e_taken->dest);
> + }
...here seems a little odd.
Richard