aboutsummaryrefslogtreecommitdiff
path: root/gcc/lra-constraints.c
diff options
context:
space:
mode:
authorBernd Schmidt <bernds@redhat.com>2016-03-14 15:08:54 +0000
committerBernd Schmidt <bernds@gcc.gnu.org>2016-03-14 15:08:54 +0000
commit3cbf012a4007511b8989d90e9450a93d4c75a8a6 (patch)
treefa0721d7527c8d8af0cd822d4a28519e071f5320 /gcc/lra-constraints.c
parenta9fee7cdc3c62d0e51730b6a9814909c557d3070 (diff)
downloadgcc-3cbf012a4007511b8989d90e9450a93d4c75a8a6.zip
gcc-3cbf012a4007511b8989d90e9450a93d4c75a8a6.tar.gz
gcc-3cbf012a4007511b8989d90e9450a93d4c75a8a6.tar.bz2
LRA: identify biggest access mode for hard_regs and use it in split_reg
PR target/70083 * lra-lives.c (process_bb_lives): Also update biggest mode for hard regs. (lra_create_live_ranges_1): initialize hard register biggest_mode to VOIDmode. * lra-constraints.c (split_reg): For hard regs, try to find the biggest single-register mode used in the function. testsuite/ PR target/70083 * gcc.dg/torture/pr70083.c: New test. * gcc.target/i386/pr70083.c: New test. From-SVN: r234184
Diffstat (limited to 'gcc/lra-constraints.c')
-rw-r--r--gcc/lra-constraints.c23
1 files changed, 15 insertions, 8 deletions
diff --git a/gcc/lra-constraints.c b/gcc/lra-constraints.c
index b070218..171ed65 100644
--- a/gcc/lra-constraints.c
+++ b/gcc/lra-constraints.c
@@ -4972,6 +4972,7 @@ split_reg (bool before_p, int original_regno, rtx_insn *insn,
rtx_insn *restore, *save;
bool after_p;
bool call_save_p;
+ machine_mode mode;
if (original_regno < FIRST_PSEUDO_REGISTER)
{
@@ -4979,24 +4980,32 @@ split_reg (bool before_p, int original_regno, rtx_insn *insn,
hard_regno = original_regno;
call_save_p = false;
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))
+ {
+ original_reg = regno_reg_rtx[hard_regno];
+ mode = reg_rtx_mode;
+ }
+ else
+ original_reg = gen_rtx_REG (mode, hard_regno);
}
else
{
+ mode = PSEUDO_REGNO_MODE (original_regno);
hard_regno = reg_renumber[original_regno];
- nregs = hard_regno_nregs[hard_regno][PSEUDO_REGNO_MODE (original_regno)];
+ nregs = hard_regno_nregs[hard_regno][mode];
rclass = lra_get_allocno_class (original_regno);
original_reg = regno_reg_rtx[original_regno];
call_save_p = need_for_call_save_p (original_regno);
}
- original_reg = regno_reg_rtx[original_regno];
lra_assert (hard_regno >= 0);
if (lra_dump_file != NULL)
fprintf (lra_dump_file,
" ((((((((((((((((((((((((((((((((((((((((((((((((\n");
+
if (call_save_p)
{
- machine_mode mode = GET_MODE (original_reg);
-
mode = HARD_REGNO_CALLER_SAVE_MODE (hard_regno,
hard_regno_nregs[hard_regno][mode],
mode);
@@ -5004,8 +5013,7 @@ split_reg (bool before_p, int original_regno, rtx_insn *insn,
}
else
{
- rclass = choose_split_class (rclass, hard_regno,
- GET_MODE (original_reg));
+ rclass = choose_split_class (rclass, hard_regno, mode);
if (rclass == NO_REGS)
{
if (lra_dump_file != NULL)
@@ -5023,8 +5031,7 @@ split_reg (bool before_p, int original_regno, rtx_insn *insn,
}
return false;
}
- new_reg = lra_create_new_reg (GET_MODE (original_reg), original_reg,
- rclass, "split");
+ new_reg = lra_create_new_reg (mode, original_reg, rclass, "split");
reg_renumber[REGNO (new_reg)] = hard_regno;
}
save = emit_spill_move (true, new_reg, original_reg);