From: Segher Boessenkool Date: Sun, 15 Jan 2017 17:06:00 +0000 (+0100) Subject: Make rtl_split_edge work for jumps that fall through (PR72749) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=81e63b637aef0fc61e85de64b2be62517723e606;p=gcc.git 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c689c58670c..9d079732939 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2017-01-15 Segher Boessenkool + + 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 PR rtl-optimization/78751 diff --git a/gcc/cfgrtl.c b/gcc/cfgrtl.c index bba4a99161a..c7e355ec7d4 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 1b13e32d898..07de1bbbb23 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);