aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorKwok Cheung Yeung <kcy@codesourcery.com>2019-11-10 18:22:38 +0000
committerKwok Cheung Yeung <kcy@gcc.gnu.org>2019-11-10 18:22:38 +0000
commit4b77a3806c4f2e27d149da326a689286043e433c (patch)
treef0271bda2d2013bec6262840401f4aae8802ecab /gcc
parentb53513884626d162d4fad4bf144207f5fb762910 (diff)
downloadgcc-4b77a3806c4f2e27d149da326a689286043e433c.zip
gcc-4b77a3806c4f2e27d149da326a689286043e433c.tar.gz
gcc-4b77a3806c4f2e27d149da326a689286043e433c.tar.bz2
[LRA] Do not use eliminable registers for spilling
The liveness of eliminable hard registers is not tracked by LRA between basic blocks, so they should not be used as spill registers as LRA may decide to allocate them to pseudos while the spilled value is still live. 2019-11-10 Kwok Cheung Yeung <kcy@codesourcery.com> gcc/ * lra-spills.c (assign_spill_hard_regs): Do not spill into registers in eliminable_regset. From-SVN: r278024
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/lra-spills.c2
2 files changed, 7 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 02b24d3..8b7ed63 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2019-11-10 Kwok Cheung Yeung <kcy@codesourcery.com>
+
+ * lra-spills.c (assign_spill_hard_regs): Do not spill into
+ registers in eliminable_regset.
+
2019-11-10 Jan Hubicka <hubicka@ucw.cz>
* ipa-inline.c (compute_uninlined_call_time,
diff --git a/gcc/lra-spills.c b/gcc/lra-spills.c
index 0068e52..54f76cc 100644
--- a/gcc/lra-spills.c
+++ b/gcc/lra-spills.c
@@ -283,6 +283,8 @@ assign_spill_hard_regs (int *pseudo_regnos, int n)
for (k = 0; k < spill_class_size; k++)
{
hard_regno = ira_class_hard_regs[spill_class][k];
+ if (TEST_HARD_REG_BIT (eliminable_regset, hard_regno))
+ continue;
if (! overlaps_hard_reg_set_p (conflict_hard_regs, mode, hard_regno))
break;
}