diff options
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/lra-lives.c | 6 |
2 files changed, 12 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b3a42ae..69f5d71 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2019-10-02 Richard Sandiford <richard.sandiford@arm.com> + + PR middle-end/91957 + * lra-lives.c (make_hard_regno_dead): Don't record conflicts for + eliminable registers. + (make_hard_regno_live): Likewise, and don't make them live. + 2019-10-01 David Malcolm <dmalcolm@redhat.com> * diagnostic-show-locus.c (layout::print_gap_in_line_numbering): diff --git a/gcc/lra-lives.c b/gcc/lra-lives.c index 389a79d..1d1525c 100644 --- a/gcc/lra-lives.c +++ b/gcc/lra-lives.c @@ -281,7 +281,8 @@ static void make_hard_regno_live (int regno) { lra_assert (HARD_REGISTER_NUM_P (regno)); - if (TEST_HARD_REG_BIT (hard_regs_live, regno)) + if (TEST_HARD_REG_BIT (hard_regs_live, regno) + || TEST_HARD_REG_BIT (eliminable_regset, regno)) return; SET_HARD_REG_BIT (hard_regs_live, regno); sparseset_set_bit (start_living, regno); @@ -295,6 +296,9 @@ make_hard_regno_live (int regno) static void make_hard_regno_dead (int regno) { + if (TEST_HARD_REG_BIT (eliminable_regset, regno)) + return; + lra_assert (HARD_REGISTER_NUM_P (regno)); unsigned int i; EXECUTE_IF_SET_IN_SPARSESET (pseudos_live, i) |