diff options
Diffstat (limited to 'gcc/lra-constraints.c')
-rw-r--r-- | gcc/lra-constraints.c | 19 |
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, |