aboutsummaryrefslogtreecommitdiff
path: root/gcc/lra-spills.c
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/lra-spills.c
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/lra-spills.c')
-rw-r--r--gcc/lra-spills.c2
1 files changed, 2 insertions, 0 deletions
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;
}