On Wed, May 05, 2021 at 01:21:20PM +0200, Eric Botcazou wrote:
> > I mean, can't we have just one while loop that skips over all debug insns,
> > NOTE_INSN_BASIC_BLOCK_P, NOTE_INSN_PROLOGUE_END and NOTE_INSN_FUNCTION_BEG
> > and stops on anything else, or, if we want to skip at most one of some or
> > all of those note kinds, do some tracking if we've already skipped that kind
> > of note?
> 
> Revised version attached.

It was meant as a question, I don't know what the right answer is.
At least for NOTE_INSN_BASIC_BLOCK skipping more than one might
be problematic, because that would mean we've skipped into a different basic
block and it wouldn't surprise me if split_block in that case crashed or
did something weird (if the first argument is not BLOCK_FOR_INSN of the
second argument when it is non-NULL).
For the other notes, I think they should normally appear just once and
shouldn't be a problem therefore.

> diff --git a/gcc/cfgcleanup.c b/gcc/cfgcleanup.c
> index f05cb6136c7..f49a34dcb0f 100644
> --- a/gcc/cfgcleanup.c
> +++ b/gcc/cfgcleanup.c
> @@ -2134,18 +2134,15 @@ try_crossjump_to_edge (int mode, edge e1, edge e2,
>    update_br_prob_note (redirect_edges_to);
>  
>    /* Edit SRC1 to go to REDIRECT_TO at NEWPOS1.  */
> -
> -  /* Skip possible basic block header.  */
>    if (LABEL_P (newpos1))
>      newpos1 = NEXT_INSN (newpos1);
>  
> -  while (DEBUG_INSN_P (newpos1))
> -    newpos1 = NEXT_INSN (newpos1);
> -
> -  if (NOTE_INSN_BASIC_BLOCK_P (newpos1))
> -    newpos1 = NEXT_INSN (newpos1);
> -
> -  while (DEBUG_INSN_P (newpos1))
> +  /* Skip debug insns, basic block header and prologue markers.  */
> +  while (DEBUG_INSN_P (newpos1)
> +      || (NOTE_P (newpos1)
> +          && (NOTE_KIND (newpos1) == NOTE_INSN_BASIC_BLOCK
> +              || NOTE_KIND (newpos1) == NOTE_INSN_PROLOGUE_END
> +              || NOTE_KIND (newpos1) == NOTE_INSN_FUNCTION_BEG)))
>      newpos1 = NEXT_INSN (newpos1);
>  
>    redirect_from = split_block (src1, PREV_INSN (newpos1))->src;


        Jakub

Reply via email to