From 7cefdfd5aa277fe096cce99c9dc7afb1669ab4e2 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Mon, 16 Jan 2017 21:42:57 +1030 Subject: [PATCH] Powerpc bootstrap failure due to duplicate case value PR target/79098 * config/rs6000/rs6000.c (rs6000_legitimate_combined_insn): Don't use a switch. From-SVN: r244489 --- gcc/ChangeLog | 6 ++++ gcc/config/rs6000/rs6000.c | 69 +++++++++++++++++++++++----------------------- 2 files changed, 41 insertions(+), 34 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 0df0bbc3956..c109ca7ae7c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2017-01-16 Alan Modra + + PR target/79098 + * config/rs6000/rs6000.c (rs6000_legitimate_combined_insn): Don't + use a switch. + 2017-01-16 Georg-Johann Lay * config/avr/avr.h (BRANCH_COST) [reload_completed]: Increase by 4. diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index 11394b2f700..f1d5d9d1f9d 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -9085,40 +9085,41 @@ rs6000_const_not_ok_for_debug_p (rtx x) static bool rs6000_legitimate_combined_insn (rtx_insn *insn) { - switch (INSN_CODE (insn)) - { - /* Reject creating doloop insns. Combine should not be allowed - to create these for a number of reasons: - 1) In a nested loop, if combine creates one of these in an - outer loop and the register allocator happens to allocate ctr - to the outer loop insn, then the inner loop can't use ctr. - Inner loops ought to be more highly optimized. - 2) Combine often wants to create one of these from what was - originally a three insn sequence, first combining the three - insns to two, then to ctrsi/ctrdi. When ctrsi/ctrdi is not - allocated ctr, the splitter takes use back to the three insn - sequence. It's better to stop combine at the two insn - sequence. - 3) Faced with not being able to allocate ctr for ctrsi/crtdi - insns, the register allocator sometimes uses floating point - or vector registers for the pseudo. Since ctrsi/ctrdi is a - jump insn and output reloads are not implemented for jumps, - the ctrsi/ctrdi splitters need to handle all possible cases. - That's a pain, and it gets to be seriously difficult when a - splitter that runs after reload needs memory to transfer from - a gpr to fpr. See PR70098 and PR71763 which are not fixed - for the difficult case. It's better to not create problems - in the first place. */ - case CODE_FOR_ctrsi_internal1: - case CODE_FOR_ctrdi_internal1: - case CODE_FOR_ctrsi_internal2: - case CODE_FOR_ctrdi_internal2: - case CODE_FOR_ctrsi_internal3: - case CODE_FOR_ctrdi_internal3: - case CODE_FOR_ctrsi_internal4: - case CODE_FOR_ctrdi_internal4: - return false; - } + int icode = INSN_CODE (insn); + + /* Reject creating doloop insns. Combine should not be allowed + to create these for a number of reasons: + 1) In a nested loop, if combine creates one of these in an + outer loop and the register allocator happens to allocate ctr + to the outer loop insn, then the inner loop can't use ctr. + Inner loops ought to be more highly optimized. + 2) Combine often wants to create one of these from what was + originally a three insn sequence, first combining the three + insns to two, then to ctrsi/ctrdi. When ctrsi/ctrdi is not + allocated ctr, the splitter takes use back to the three insn + sequence. It's better to stop combine at the two insn + sequence. + 3) Faced with not being able to allocate ctr for ctrsi/crtdi + insns, the register allocator sometimes uses floating point + or vector registers for the pseudo. Since ctrsi/ctrdi is a + jump insn and output reloads are not implemented for jumps, + the ctrsi/ctrdi splitters need to handle all possible cases. + That's a pain, and it gets to be seriously difficult when a + splitter that runs after reload needs memory to transfer from + a gpr to fpr. See PR70098 and PR71763 which are not fixed + for the difficult case. It's better to not create problems + in the first place. */ + if (icode != CODE_FOR_nothing + && (icode == CODE_FOR_ctrsi_internal1 + || icode == CODE_FOR_ctrdi_internal1 + || icode == CODE_FOR_ctrsi_internal2 + || icode == CODE_FOR_ctrdi_internal2 + || icode == CODE_FOR_ctrsi_internal3 + || icode == CODE_FOR_ctrdi_internal3 + || icode == CODE_FOR_ctrsi_internal4 + || icode == CODE_FOR_ctrdi_internal4)) + return false; + return true; } -- 2.11.4.GIT