summaryrefslogtreecommitdiff
path: root/gcc/lra-constraints.c
diff options
context:
space:
mode:
authorbernds <bernds@138bc75d-0d04-0410-961f-82ee72b054a4>2016-03-18 19:09:08 +0000
committerbernds <bernds@138bc75d-0d04-0410-961f-82ee72b054a4>2016-03-18 19:09:08 +0000
commite7142ce1fb81c48623bef1c30ef3fe222c89b25f (patch)
tree56844518935399d010918f8fc3def7ad42f8012f /gcc/lra-constraints.c
parent5539bc70a31b6694a83c6b6a5dc528fae73378f9 (diff)
downloadgcc-e7142ce1fb81c48623bef1c30ef3fe222c89b25f.tar.gz
Fix PR70278, a problem with the previous split_reg change
PR rtl-optimization/70278 * lra-constraints.c (split_reg): Handle the case where biggest_mode is VOIDmode. testsuite/ * gcc.dg/torture/pr70278.c: New test. * gcc.target/arm/pr70278.c: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@234342 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/lra-constraints.c')
-rw-r--r--gcc/lra-constraints.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/gcc/lra-constraints.c b/gcc/lra-constraints.c
index ced9e12b0f1..4883eefc532 100644
--- a/gcc/lra-constraints.c
+++ b/gcc/lra-constraints.c
@@ -4982,7 +4982,12 @@ split_reg (bool before_p, int original_regno, rtx_insn *insn,
nregs = 1;
mode = lra_reg_info[hard_regno].biggest_mode;
machine_mode reg_rtx_mode = GET_MODE (regno_reg_rtx[hard_regno]);
- if (GET_MODE_SIZE (mode) > GET_MODE_SIZE (reg_rtx_mode))
+ /* A reg can have a biggest_mode of VOIDmode if it was only ever seen
+ as part of a multi-word register. In that case, or if the biggest
+ mode was larger than a register, just use the reg_rtx. Otherwise,
+ limit the size to that of the biggest access in the function. */
+ if (mode == VOIDmode
+ || GET_MODE_SIZE (mode) > GET_MODE_SIZE (reg_rtx_mode))
{
original_reg = regno_reg_rtx[hard_regno];
mode = reg_rtx_mode;