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 | |
parent | e17fa93eca7611415368af47d6e4dd2796c8fd7b (diff) | |
download | gcc-4321da7b93e4a5de7ca73a9933db8be6822a9ff1.zip gcc-4321da7b93e4a5de7ca73a9933db8be6822a9ff1.tar.gz gcc-4321da7b93e4a5de7ca73a9933db8be6822a9ff1.tar.bz2 |
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
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/lra-assigns.c | 12 |
2 files changed, 15 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index bca96c0..3185dd6 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +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. + 2019-01-11 Jakub Jelinek <jakub@redhat.com> PR tree-optimization/88693 diff --git a/gcc/lra-assigns.c b/gcc/lra-assigns.c index bcd8145..8b56b58 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. */ |