From a4971e68935654be575c76864b954a80c94d6c42 Mon Sep 17 00:00:00 2001 From: Vladimir Makarov Date: Fri, 28 Mar 2014 15:27:58 +0000 Subject: re PR target/60675 ([aarch64] internal compiler error: Max. number of generated reload insns per insn is achieved (90)) 2014-03-28 Vladimir Makarov PR target/60675 * lra-assigns.c (find_hard_regno_for): Remove unavailable hard regs from checking multi-reg pseudos. 2014-03-28 Vladimir Makarov PR target/60675 * gcc.target/aarch64/pr60675.C: New. From-SVN: r208900 --- gcc/lra-assigns.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'gcc/lra-assigns.c') diff --git a/gcc/lra-assigns.c b/gcc/lra-assigns.c index cba8b8f..f7bb86b 100644 --- a/gcc/lra-assigns.c +++ b/gcc/lra-assigns.c @@ -473,7 +473,7 @@ find_hard_regno_for (int regno, int *cost, int try_only_hard_regno, enum reg_class rclass; bitmap_iterator bi; bool *rclass_intersect_p; - HARD_REG_SET impossible_start_hard_regs; + HARD_REG_SET impossible_start_hard_regs, available_regs; COPY_HARD_REG_SET (conflict_set, lra_no_alloc_regs); rclass = regno_allocno_class_array[regno]; @@ -586,6 +586,8 @@ find_hard_regno_for (int regno, int *cost, int try_only_hard_regno, biggest_nregs = hard_regno_nregs[hard_regno][biggest_mode]; nregs_diff = (biggest_nregs - hard_regno_nregs[hard_regno][PSEUDO_REGNO_MODE (regno)]); + COPY_HARD_REG_SET (available_regs, reg_class_contents[rclass]); + AND_COMPL_HARD_REG_SET (available_regs, lra_no_alloc_regs); for (i = 0; i < rclass_size; i++) { if (try_only_hard_regno >= 0) @@ -601,9 +603,9 @@ find_hard_regno_for (int regno, int *cost, int try_only_hard_regno, && (nregs_diff == 0 || (WORDS_BIG_ENDIAN ? (hard_regno - nregs_diff >= 0 - && TEST_HARD_REG_BIT (reg_class_contents[rclass], + && TEST_HARD_REG_BIT (available_regs, hard_regno - nregs_diff)) - : TEST_HARD_REG_BIT (reg_class_contents[rclass], + : TEST_HARD_REG_BIT (available_regs, hard_regno + nregs_diff)))) { if (hard_regno_costs_check[hard_regno] -- cgit v1.1