Tom de Vries <tom_devr...@mentor.com> 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

Reply via email to