aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2017-01-16 21:42:57 +1030
committerAlan Modra <amodra@gcc.gnu.org>2017-01-16 21:42:57 +1030
commit7cefdfd5aa277fe096cce99c9dc7afb1669ab4e2 (patch)
tree5ad410c18aa61aab554518c9acfea81afaa7d717 /gcc
parent1bcd0192bf2b9adbdf0fab7ab8f245d6f68aea71 (diff)
downloadgcc-7cefdfd5aa277fe096cce99c9dc7afb1669ab4e2.zip
gcc-7cefdfd5aa277fe096cce99c9dc7afb1669ab4e2.tar.gz
gcc-7cefdfd5aa277fe096cce99c9dc7afb1669ab4e2.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/config/rs6000/rs6000.c69
2 files changed, 41 insertions, 34 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 0df0bbc..c109ca7 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2017-01-16 Alan Modra <amodra@gmail.com>
+
+ PR target/79098
+ * config/rs6000/rs6000.c (rs6000_legitimate_combined_insn): Don't
+ use a switch.
+
2017-01-16 Georg-Johann Lay <avr@gjlay.de>
* 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 11394b2..f1d5d9d 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;
}