On Sun, Nov 15, 2020 at 12:08:22PM -0500, Vladimir Makarov via Gcc-patches 
wrote:
> --- a/gcc/lra.c
> +++ b/gcc/lra.c
> @@ -1903,15 +1903,23 @@ lra_process_new_insns (rtx_insn *insn, rtx_insn 
> *before, rtx_insn *after,
>             {
>               /* We already made the edge no-critical in ira.c::ira */
>               lra_assert (!EDGE_CRITICAL_P (e));
> -             rtx_insn *tmp = BB_HEAD (e->dest);
> +             rtx_insn *curr, *tmp = BB_HEAD (e->dest);
>               if (LABEL_P (tmp))
>                 tmp = NEXT_INSN (tmp);
>               if (NOTE_INSN_BASIC_BLOCK_P (tmp))
>                 tmp = NEXT_INSN (tmp);
> -             start_sequence ();
> -             for (rtx_insn *curr = after;
> -                  curr != NULL_RTX;
> +             for (curr = tmp;
> +                  curr != NULL
> +                    && (!INSN_P (curr) || BLOCK_FOR_INSN (curr) == e->dest);
>                    curr = NEXT_INSN (curr))
> +               ;
> +             /* Do not put reload insns if it is the last BB
> +                without actual insns.  In this case the reload insns
> +                can get null BB after emitting.  */

What the above loop does doesn't match what the comment says.
Because the loop will result in curr == NULL even if e->dest contains any
number of actual insns, only cares about whether e->dest's next_bb has no
actual insns or there is no next bb at all.
Did you mean something like
                for (curr = tmp; curr != NULL; curr = NEXT_INSN (curr))
                  if (INSN_P (curr))
                    break;
(i.e. it would be non-NULL if the e->dest bb contains any actual insns, or
if it isn't the last bb and there is at least one further bb with actual
insns after it)?
See PR97933 for details.

        Jakub

Reply via email to