diff options
author | Vladimir Makarov <vmakarov@redhat.com> | 2019-01-11 19:25:31 +0000 |
---|---|---|
committer | Vladimir Makarov <vmakarov@gcc.gnu.org> | 2019-01-11 19:25:31 +0000 |
commit | 4321da7b93e4a5de7ca73a9933db8be6822a9ff1 (patch) | |
tree | 1f543b4be35317fc9129b2a9736f241b74ff4d24 /gcc/lra-assigns.c | |
parent | e17fa93eca7611415368af47d6e4dd2796c8fd7b (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.c | 12 |
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. */ |