diff options
Diffstat (limited to 'gcc/lra-eliminations.c')
-rw-r--r-- | gcc/lra-eliminations.c | 18 |
1 files changed, 9 insertions, 9 deletions
diff --git a/gcc/lra-eliminations.c b/gcc/lra-eliminations.c index 24a0dc7523d..a59ab6eacca 100644 --- a/gcc/lra-eliminations.c +++ b/gcc/lra-eliminations.c @@ -1042,11 +1042,12 @@ spill_pseudos (HARD_REG_SET set) registers. Spill pseudos assigned to registers which became uneliminable, update LRA_NO_ALLOC_REGS and ELIMINABLE_REG_SET. Add insns to INSNS_WITH_CHANGED_OFFSETS containing eliminable hard - registers whose offsets should be changed. */ -static void + registers whose offsets should be changed. Return true if any + elimination offset changed. */ +static bool update_reg_eliminate (bitmap insns_with_changed_offsets) { - bool prev; + bool prev, result; struct elim_table *ep, *ep1; HARD_REG_SET temp_hard_reg_set; @@ -1122,6 +1123,7 @@ update_reg_eliminate (bitmap insns_with_changed_offsets) AND_COMPL_HARD_REG_SET (eliminable_regset, temp_hard_reg_set); spill_pseudos (temp_hard_reg_set); setup_elimination_map (); + result = false; for (ep = reg_eliminate; ep < ®_eliminate[NUM_ELIMINABLE_REGS]; ep++) if (elimination_map[ep->from] == ep && ep->previous_offset != ep->offset) { @@ -1132,7 +1134,9 @@ update_reg_eliminate (bitmap insns_with_changed_offsets) changed. */ lra_update_reg_val_offset (lra_reg_info[ep->from].val, ep->offset - ep->previous_offset); + result = true; } + return result; } /* Initialize the table of hard registers to eliminate. @@ -1273,12 +1277,8 @@ lra_eliminate (bool final_p) bitmap_ior_into (&insns_with_changed_offsets, &lra_reg_info[ep->from].insn_bitmap); } - else - { - update_reg_eliminate (&insns_with_changed_offsets); - if (bitmap_empty_p (&insns_with_changed_offsets)) - goto lra_eliminate_done; - } + else if (! update_reg_eliminate (&insns_with_changed_offsets)) + goto lra_eliminate_done; if (lra_dump_file != NULL) { fprintf (lra_dump_file, "New elimination table:\n"); |