diff options
author | Segher Boessenkool <segher@kernel.crashing.org> | 2017-01-15 18:06:00 +0100 |
---|---|---|
committer | Segher Boessenkool <segher@gcc.gnu.org> | 2017-01-15 18:06:00 +0100 |
commit | 81e63b637aef0fc61e85de64b2be62517723e606 (patch) | |
tree | 1bd78fae14e682601ecbd3eb3625b7ca3c4f44f5 | |
parent | 32a8d3f66a4d02b77774a713e5c4ff8d586af4f4 (diff) | |
download | gcc-81e63b637aef0fc61e85de64b2be62517723e606.zip gcc-81e63b637aef0fc61e85de64b2be62517723e606.tar.gz gcc-81e63b637aef0fc61e85de64b2be62517723e606.tar.bz2 |
Make rtl_split_edge work for jumps that fall through (PR72749)
If a jump always falls through but that cannot be optimised away, like
is the case with the PowerPC bdnz insn if its jump target is the same as
the fallthrough, sched gets confused if it schedules some instructions
from before that jump instruction to behind it: it splits the
fallthrough branch, but the jump target isn't updated, and things fall
apart as in the PR. This patch fixes it.
The second patch fragment makes -fsched-verbose=N work for N>=4; the
currently scheduled fragment can now contain a label. Everything else
seems to work fine with that.
PR target/72749
* cfgrtl.c (rtl_split_edge): Also patch jump insns that jump to the
fallthrough.
* haifa-sched.c (dump_insn_stream): Don't crash if there is a label
in the currently scheduled RTL fragment.
From-SVN: r244477
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/cfgrtl.c | 3 | ||||
-rw-r--r-- | gcc/haifa-sched.c | 2 |
3 files changed, 11 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c689c58..9d07973 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,13 @@ 2017-01-15 Segher Boessenkool <segher@kernel.crashing.org> + PR target/72749 + * cfgrtl.c (rtl_split_edge): Also patch jump insns that jump to the + fallthrough. + * haifa-sched.c (dump_insn_stream): Don't crash if there is a label + in the currently scheduled RTL fragment. + +2017-01-15 Segher Boessenkool <segher@kernel.crashing.org> + PR rtl-optimization/78751 * ifcvt.c (find_cond_trap): If we generated a non-existing insn, give up. diff --git a/gcc/cfgrtl.c b/gcc/cfgrtl.c index bba4a99..c7e355e 100644 --- a/gcc/cfgrtl.c +++ b/gcc/cfgrtl.c @@ -1935,7 +1935,8 @@ rtl_split_edge (edge edge_in) if (last && JUMP_P (last) && edge_in->dest != EXIT_BLOCK_PTR_FOR_FN (cfun) - && extract_asm_operands (PATTERN (last)) != NULL_RTX + && (extract_asm_operands (PATTERN (last)) + || JUMP_LABEL (last) == before) && patch_jump_insn (last, before, bb)) df_set_bb_dirty (edge_in->src); } diff --git a/gcc/haifa-sched.c b/gcc/haifa-sched.c index 1b13e32..07de1bb 100644 --- a/gcc/haifa-sched.c +++ b/gcc/haifa-sched.c @@ -6495,7 +6495,7 @@ dump_insn_stream (rtx_insn *head, rtx_insn *tail) if (sched_verbose >= 4) { - if (NOTE_P (insn) || recog_memoized (insn) < 0) + if (NOTE_P (insn) || LABEL_P (insn) || recog_memoized (insn) < 0) fprintf (sched_dump, "nothing"); else print_reservation (sched_dump, insn); |