summaryrefslogtreecommitdiff
path: root/gcc/lra-assigns.c
diff options
context:
space:
mode:
authorVladimir Makarov <vmakarov@redhat.com>2019-01-11 19:25:31 +0000
committerVladimir Makarov <vmakarov@gcc.gnu.org>2019-01-11 19:25:31 +0000
commit4321da7b93e4a5de7ca73a9933db8be6822a9ff1 (patch)
tree1f543b4be35317fc9129b2a9736f241b74ff4d24 /gcc/lra-assigns.c
parente17fa93eca7611415368af47d6e4dd2796c8fd7b (diff)
re PR rtl-optimization/87305 (Segfault in end_hard_regno in setup_live_pseudos_and_spill_after_risky_transforms on aarch64 big-endian)
2019-01-11 Vladimir Makarov <vmakarov@redhat.com> PR rtl-optimization/87305 * lra-assigns.c (setup_live_pseudos_and_spill_after_risky_transforms): Add code for little endian pseudos used as paradoxical subreg. From-SVN: r267854
Diffstat (limited to 'gcc/lra-assigns.c')
-rw-r--r--gcc/lra-assigns.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/gcc/lra-assigns.c b/gcc/lra-assigns.c
index bcd81450c06..8b56b58fb2e 100644
--- a/gcc/lra-assigns.c
+++ b/gcc/lra-assigns.c
@@ -1174,10 +1174,14 @@ setup_live_pseudos_and_spill_after_risky_transforms (bitmap
- hard_regno_nregs (hard_regno, PSEUDO_REGNO_MODE (i)));
enum reg_class rclass = lra_get_allocno_class (i);
- if (WORDS_BIG_ENDIAN
- && (hard_regno - nregs_diff < 0
- || !TEST_HARD_REG_BIT (reg_class_contents[rclass],
- hard_regno - nregs_diff)))
+ if ((WORDS_BIG_ENDIAN
+ && (hard_regno - nregs_diff < 0
+ || !TEST_HARD_REG_BIT (reg_class_contents[rclass],
+ hard_regno - nregs_diff)))
+ || (!WORDS_BIG_ENDIAN
+ && (hard_regno + nregs_diff >= FIRST_PSEUDO_REGISTER
+ || !TEST_HARD_REG_BIT (reg_class_contents[rclass],
+ hard_regno + nregs_diff))))
{
/* Hard registers of paradoxical sub-registers are out of
range of pseudo register class. Spill the pseudo. */