aboutsummaryrefslogtreecommitdiff
path: root/gcc/lra-constraints.c
diff options
context:
space:
mode:
authorVladimir Makarov <vmakarov@redhat.com>2016-11-30 17:35:40 +0000
committerVladimir Makarov <vmakarov@gcc.gnu.org>2016-11-30 17:35:40 +0000
commitf7abdf36e580423f00d974704f5e8ae5e34ded32 (patch)
treef80d2afbb2f124af6664421a6fc4f97b0bf8b676 /gcc/lra-constraints.c
parentde683d58cfb792650c2549bf1522f45b03397bd7 (diff)
downloadgcc-f7abdf36e580423f00d974704f5e8ae5e34ded32.zip
gcc-f7abdf36e580423f00d974704f5e8ae5e34ded32.tar.gz
gcc-f7abdf36e580423f00d974704f5e8ae5e34ded32.tar.bz2
re PR tree-optimization/77856 (wrong code at -O2 on x86_64-linux-gnu in 32-bit mode)
2016-11-30 Vladimir Makarov <vmakarov@redhat.com> PR tree-optimization/77856 * lra-constraints.c (inherit_in_ebb): Check original regno for invalid invariant regs too. Set only clobbered hard regs for the invalid invariant regs. 2016-11-30 Vladimir Makarov <vmakarov@redhat.com> PR tree-optimization/77856 * gcc.target/i386.c (pr77856.c): New. From-SVN: r243038
Diffstat (limited to 'gcc/lra-constraints.c')
-rw-r--r--gcc/lra-constraints.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/gcc/lra-constraints.c b/gcc/lra-constraints.c
index 7784ad2..260591a 100644
--- a/gcc/lra-constraints.c
+++ b/gcc/lra-constraints.c
@@ -5888,7 +5888,9 @@ inherit_in_ebb (rtx_insn *head, rtx_insn *tail)
&& dst_regno >= lra_constraint_new_regno_start
&& invariant_p (SET_SRC (curr_set))
&& (cl = lra_get_allocno_class (dst_regno)) != NO_REGS
- && ! bitmap_bit_p (&invalid_invariant_regs, dst_regno))
+ && ! bitmap_bit_p (&invalid_invariant_regs, dst_regno)
+ && ! bitmap_bit_p (&invalid_invariant_regs,
+ ORIGINAL_REGNO(regno_reg_rtx[dst_regno])))
{
/* 'reload_pseudo <- invariant'. */
if (ira_class_hard_regs_num[cl] <= max_small_class_regs_num)
@@ -6159,16 +6161,20 @@ inherit_in_ebb (rtx_insn *head, rtx_insn *tail)
curr_id = lra_get_insn_recog_data (curr_insn);
for (reg = curr_id->regs; reg != NULL; reg = reg->next)
if (reg->type != OP_IN)
- bitmap_set_bit (&invalid_invariant_regs, reg->regno);
+ {
+ bitmap_set_bit (&invalid_invariant_regs, reg->regno);
+ bitmap_set_bit (&invalid_invariant_regs,
+ ORIGINAL_REGNO (regno_reg_rtx[reg->regno]));
+ }
curr_static_id = curr_id->insn_static_data;
for (reg = curr_static_id->hard_regs; reg != NULL; reg = reg->next)
if (reg->type != OP_IN)
bitmap_set_bit (&invalid_invariant_regs, reg->regno);
if (curr_id->arg_hard_regs != NULL)
for (i = 0; (regno = curr_id->arg_hard_regs[i]) >= 0; i++)
+ if (regno >= FIRST_PSEUDO_REGISTER)
bitmap_set_bit (&invalid_invariant_regs,
- regno >= FIRST_PSEUDO_REGISTER
- ? regno : regno - FIRST_PSEUDO_REGISTER);
+ regno - FIRST_PSEUDO_REGISTER);
}
/* We reached the start of the current basic block. */
if (prev_insn == NULL_RTX || prev_insn == PREV_INSN (head)