gcc-9.0.0-alpha20181202 snapshot (r266729) ICEs when compiling gcc/testsuite/gcc.target/powerpc/ppc-switch-2.c w/ -mcpu=603e -O1 -fsched-stalled-insns -fsched2-use-superblocks -fschedule-insns2 -fno-dce -fno-guess-branch-probability --param max-cse-insns=4: % powerpc-e300c3-linux-gnu-gcc-9.0.0-alpha20181202 -mcpu=603e -O1 -fsched-stalled-insns -fsched2-use-superblocks -fschedule-insns2 -fno-dce -fno-guess-branch-probability --param max-cse-insns=4 -c gcc/testsuite/gcc.target/powerpc/ppc-switch-2.c during RTL pass: sched2 gcc/testsuite/gcc.target/powerpc/ppc-switch-2.c: In function 'test_switch': gcc/testsuite/gcc.target/powerpc/ppc-switch-2.c:32:1: internal compiler error: in begin_move_insn, at sched-ebb.c:175 32 | } | ^ 0x759da8 begin_move_insn /var/tmp/portage/cross-powerpc-e300c3-linux-gnu/gcc-9.0.0_alpha20181202/work/gcc-9-20181202/gcc/sched-ebb.c:175 0x145ec0b commit_schedule /var/tmp/portage/cross-powerpc-e300c3-linux-gnu/gcc-9.0.0_alpha20181202/work/gcc-9-20181202/gcc/haifa-sched.c:6228 0x1469a90 schedule_block(basic_block_def**, void*) /var/tmp/portage/cross-powerpc-e300c3-linux-gnu/gcc-9.0.0_alpha20181202/work/gcc-9-20181202/gcc/haifa-sched.c:7065 0x14f47e9 schedule_ebb(rtx_insn*, rtx_insn*, bool) /var/tmp/portage/cross-powerpc-e300c3-linux-gnu/gcc-9.0.0_alpha20181202/work/gcc-9-20181202/gcc/sched-ebb.c:537 0x14f4f64 schedule_ebbs() /var/tmp/portage/cross-powerpc-e300c3-linux-gnu/gcc-9.0.0_alpha20181202/work/gcc-9-20181202/gcc/sched-ebb.c:657 0xcc2eac rest_of_handle_sched2 /var/tmp/portage/cross-powerpc-e300c3-linux-gnu/gcc-9.0.0_alpha20181202/work/gcc-9-20181202/gcc/sched-rgn.c:3738 0xcc2eac execute /var/tmp/portage/cross-powerpc-e300c3-linux-gnu/gcc-9.0.0_alpha20181202/work/gcc-9-20181202/gcc/sched-rgn.c:3876
Confirmed. We here have an unconditional branch that is not followed by a barrier: first there is a label and a jump table, after *that* is the barrier. Is this correct RTL? If so, === diff --git a/gcc/sched-ebb.c b/gcc/sched-ebb.c index 49ae286..566cb24 100644 --- a/gcc/sched-ebb.c +++ b/gcc/sched-ebb.c @@ -172,7 +172,11 @@ begin_move_insn (rtx_insn *insn, rtx_insn *last) if (e) gcc_checking_assert (NOTE_P (x) || LABEL_P (x)); else - gcc_checking_assert (BARRIER_P (x)); + { + if (LABEL_P (x) && JUMP_TABLE_DATA_P (NEXT_INSN (x))) + x = NEXT_INSN (NEXT_INSN (x)); + gcc_checking_assert (BARRIER_P (x)); + } } if (e) === fixes it.
*** Bug 88423 has been marked as a duplicate of this bug. ***
Segher's fix appears superior to mine; am testing it now...
Candidate patch: https://gcc.gnu.org/ml/gcc-patches/2019-01/msg01372.html (though see the concerns in that thread; un-assigning myself)
Author: law Date: Mon Mar 25 23:33:36 2019 New Revision: 269928 URL: https://gcc.gnu.org/viewcvs?rev=269928&root=gcc&view=rev Log: PR rtl-optimization/88347 PR rtl-optimization/88423 * sched-deps.c (sched_analyze_insn): Take into account that for tablejumps the barrier appears after a label and a jump_table_data. * gcc.c-torture/compile/pr88347.c: New test. * gcc.c-torture/compile/pr88423.c: New test. Added: trunk/gcc/testsuite/gcc.c-torture/compile/pr88347.c trunk/gcc/testsuite/gcc.c-torture/compile/pr88423.c Modified: trunk/gcc/ChangeLog trunk/gcc/sched-deps.c trunk/gcc/testsuite/ChangeLog
Fixed on the trunk.