aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorVladimir N. Makarov <vmakarov@redhat.com>2020-11-15 11:22:19 -0500
committerVladimir N. Makarov <vmakarov@redhat.com>2020-11-15 11:30:50 -0500
commit253c415a1acba50711c82693426391743ac18040 (patch)
tree600a63f76292e6aa56e9ccf8df4116a3fbf7f948 /gcc
parent26285af40f98dfdb809b98b08386073c63b65db1 (diff)
downloadgcc-253c415a1acba50711c82693426391743ac18040.zip
gcc-253c415a1acba50711c82693426391743ac18040.tar.gz
gcc-253c415a1acba50711c82693426391743ac18040.tar.bz2
Do not put reload insns in the last empty BB.
gcc/ * lra.c (lra_process_new_insns): Don't put reload insns in the last empty BB.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/lra.c16
1 files changed, 12 insertions, 4 deletions
diff --git a/gcc/lra.c b/gcc/lra.c
index 673554d..b318cfd 100644
--- 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 ();