]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Do not put reload insns in the last empty BB.
authorVladimir N. Makarov <vmakarov@redhat.com>
Sun, 15 Nov 2020 16:22:19 +0000 (11:22 -0500)
committerVladimir N. Makarov <vmakarov@redhat.com>
Sun, 15 Nov 2020 16:30:50 +0000 (11:30 -0500)
gcc/
* lra.c (lra_process_new_insns): Don't put reload insns in the
last empty BB.

gcc/lra.c

index 673554d0a4b6e0abe1ac3adf4fbe8cb9db49bae3..b318cfd7456531c2890340c674c429f65bd0cc7b 100644 (file)
--- 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.  */
+               if (curr == NULL)
+                 continue;
+               start_sequence ();
+               for (curr = after; curr != NULL_RTX; curr = NEXT_INSN (curr))
                  emit_insn (copy_insn (PATTERN (curr)));
                rtx_insn *copy = get_insns (), *last = get_last_insn ();
                end_sequence ();