summaryrefslogtreecommitdiff
path: root/gcc/lra-constraints.c
diff options
context:
space:
mode:
authorVladimir Makarov <vmakarov@redhat.com>2018-03-16 18:48:26 +0000
committerVladimir Makarov <vmakarov@gcc.gnu.org>2018-03-16 18:48:26 +0000
commit7293e3f58edb7535d826c85160b9fa6d4132ffea (patch)
treee912a6237dfa23ea59dabc33b01717104a47b0ba /gcc/lra-constraints.c
parentc011faee33f1f52a28b561d6879b253ddc86c9a4 (diff)
downloadgcc-7293e3f58edb7535d826c85160b9fa6d4132ffea.tar.gz
re PR target/84876 (ICE on invalid code in lra_assign at gcc/lra-assigns.c:1601 since r258504)
2018-03-16 Vladimir Makarov <vmakarov@redhat.com> PR target/84876 * lra-assigns.c (lra_split_hard_reg_for): Don't use regno_allocno_class_array and sorted_pseudos. * lra-constraints.c (spill_hard_reg_in_range): Ignore hard regs in insns where regno is used. 2018-03-16 Vladimir Makarov <vmakarov@redhat.com> PR target/84876 * gcc.target/i386/pr84876.c: New test. From-SVN: r258602
Diffstat (limited to 'gcc/lra-constraints.c')
-rw-r--r--gcc/lra-constraints.c19
1 files changed, 18 insertions, 1 deletions
diff --git a/gcc/lra-constraints.c b/gcc/lra-constraints.c
index 118b65f6a23..31faefab9c2 100644
--- a/gcc/lra-constraints.c
+++ b/gcc/lra-constraints.c
@@ -5680,13 +5680,30 @@ spill_hard_reg_in_range (int regno, enum reg_class rclass, rtx_insn *from, rtx_i
int i, hard_regno;
int rclass_size;
rtx_insn *insn;
+ unsigned int uid;
+ bitmap_iterator bi;
+ HARD_REG_SET ignore;
lra_assert (from != NULL && to != NULL);
+ CLEAR_HARD_REG_SET (ignore);
+ EXECUTE_IF_SET_IN_BITMAP (&lra_reg_info[regno].insn_bitmap, 0, uid, bi)
+ {
+ lra_insn_recog_data_t id = lra_insn_recog_data[uid];
+ struct lra_static_insn_data *static_id = id->insn_static_data;
+ struct lra_insn_reg *reg;
+
+ for (reg = id->regs; reg != NULL; reg = reg->next)
+ if (reg->regno <= FIRST_PSEUDO_REGISTER)
+ SET_HARD_REG_BIT (ignore, reg->regno);
+ for (reg = static_id->hard_regs; reg != NULL; reg = reg->next)
+ SET_HARD_REG_BIT (ignore, reg->regno);
+ }
rclass_size = ira_class_hard_regs_num[rclass];
for (i = 0; i < rclass_size; i++)
{
hard_regno = ira_class_hard_regs[rclass][i];
- if (! TEST_HARD_REG_BIT (lra_reg_info[regno].conflict_hard_regs, hard_regno))
+ if (! TEST_HARD_REG_BIT (lra_reg_info[regno].conflict_hard_regs, hard_regno)
+ || TEST_HARD_REG_BIT (ignore, hard_regno))
continue;
for (insn = from; insn != NEXT_INSN (to); insn = NEXT_INSN (insn))
if (bitmap_bit_p (&lra_reg_info[hard_regno].insn_bitmap,