aboutsummaryrefslogtreecommitdiff
path: root/gcc/lra-assigns.c
diff options
context:
space:
mode:
authorVladimir Makarov <vmakarov@redhat.com>2014-03-28 15:27:58 +0000
committerVladimir Makarov <vmakarov@gcc.gnu.org>2014-03-28 15:27:58 +0000
commita4971e68935654be575c76864b954a80c94d6c42 (patch)
tree204028c15c937ba36953d0e2a4dd188e33c2a946 /gcc/lra-assigns.c
parent2486c24a8c2b1b603899e99c7424784de976f8d2 (diff)
downloadgcc-a4971e68935654be575c76864b954a80c94d6c42.zip
gcc-a4971e68935654be575c76864b954a80c94d6c42.tar.gz
gcc-a4971e68935654be575c76864b954a80c94d6c42.tar.bz2
re PR target/60675 ([aarch64] internal compiler error: Max. number of generated reload insns per insn is achieved (90))
2014-03-28 Vladimir Makarov <vmakarov@redhat.com> PR target/60675 * lra-assigns.c (find_hard_regno_for): Remove unavailable hard regs from checking multi-reg pseudos. 2014-03-28 Vladimir Makarov <vmakarov@redhat.com> PR target/60675 * gcc.target/aarch64/pr60675.C: New. From-SVN: r208900
Diffstat (limited to 'gcc/lra-assigns.c')
-rw-r--r--gcc/lra-assigns.c8
1 files changed, 5 insertions, 3 deletions
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]