re PR rtl-optimization/55342 ([LRA,x86] Non-optimal code for simple loop with LRA)

2012-11-17  Vladimir Makarov  <vmakarov@redhat.com>

	PR rtl-optimization/55342
	* lra-assigns.c (spill_for): Try to allocate other reload pseudos
	before and after spilling.

From-SVN: r193588
This commit is contained in:
Vladimir Makarov 2012-11-17 17:59:35 +00:00 committed by Vladimir Makarov
parent e9e9638d47
commit 295d875ce0
2 changed files with 24 additions and 23 deletions

View File

@ -1,3 +1,9 @@
2012-11-17 Vladimir Makarov <vmakarov@redhat.com>
PR rtl-optimization/55342
* lra-assigns.c (spill_for): Try to allocate other reload pseudos
before and after spilling.
2012-11-16 Sandra Loosemore <sandra@codesourcery.com>
* doc/extend.texi: Various copy-edits to comply with GCC coding

View File

@ -795,9 +795,8 @@ spill_for (int regno, bitmap spilled_pseudo_bitmap)
{
int i, j, n, p, hard_regno, best_hard_regno, cost, best_cost, rclass_size;
int reload_hard_regno, reload_cost;
enum machine_mode mode, mode2;
enum machine_mode mode;
enum reg_class rclass;
HARD_REG_SET spilled_hard_regs;
unsigned int spill_regno, reload_regno, uid;
int insn_pseudos_num, best_insn_pseudos_num;
lra_live_range_t r;
@ -838,7 +837,6 @@ spill_for (int regno, bitmap spilled_pseudo_bitmap)
&try_hard_reg_pseudos[hard_regno + j]);
}
/* Spill pseudos. */
CLEAR_HARD_REG_SET (spilled_hard_regs);
EXECUTE_IF_SET_IN_BITMAP (&spill_pseudos_bitmap, 0, spill_regno, bi)
if ((int) spill_regno >= lra_constraint_new_regno_start
&& ! bitmap_bit_p (&lra_inheritance_pseudos, spill_regno)
@ -853,13 +851,6 @@ spill_for (int regno, bitmap spilled_pseudo_bitmap)
{
if (bitmap_bit_p (&insn_conflict_pseudos, spill_regno))
insn_pseudos_num++;
mode2 = PSEUDO_REGNO_MODE (spill_regno);
update_lives (spill_regno, true);
if (lra_dump_file != NULL)
fprintf (lra_dump_file, " spill %d(freq=%d)",
spill_regno, lra_reg_info[spill_regno].freq);
add_to_hard_reg_set (&spilled_hard_regs,
mode2, reg_renumber[spill_regno]);
for (r = lra_reg_info[spill_regno].live_ranges;
r != NULL;
r = r->next)
@ -877,19 +868,26 @@ spill_for (int regno, bitmap spilled_pseudo_bitmap)
}
}
}
n = 0;
EXECUTE_IF_SET_IN_SPARSESET (live_range_reload_inheritance_pseudos,
reload_regno)
if ((int) reload_regno != regno
&& (ira_reg_classes_intersect_p
[rclass][regno_allocno_class_array[reload_regno]])
&& live_pseudos_reg_renumber[reload_regno] < 0
&& find_hard_regno_for (reload_regno, &cost, -1) < 0)
sorted_reload_pseudos[n++] = reload_regno;
EXECUTE_IF_SET_IN_BITMAP (&spill_pseudos_bitmap, 0, spill_regno, bi)
{
update_lives (spill_regno, true);
if (lra_dump_file != NULL)
fprintf (lra_dump_file, " spill %d(freq=%d)",
spill_regno, lra_reg_info[spill_regno].freq);
}
hard_regno = find_hard_regno_for (regno, &cost, -1);
if (hard_regno >= 0)
{
assign_temporarily (regno, hard_regno);
n = 0;
EXECUTE_IF_SET_IN_SPARSESET (live_range_reload_inheritance_pseudos,
reload_regno)
if (live_pseudos_reg_renumber[reload_regno] < 0
&& (hard_reg_set_intersect_p
(reg_class_contents
[regno_allocno_class_array[reload_regno]],
spilled_hard_regs)))
sorted_reload_pseudos[n++] = reload_regno;
qsort (sorted_reload_pseudos, n, sizeof (int),
reload_pseudo_compare_func);
for (j = 0; j < n; j++)
@ -898,10 +896,7 @@ spill_for (int regno, bitmap spilled_pseudo_bitmap)
lra_assert (live_pseudos_reg_renumber[reload_regno] < 0);
if ((reload_hard_regno
= find_hard_regno_for (reload_regno,
&reload_cost, -1)) >= 0
&& (overlaps_hard_reg_set_p
(spilled_hard_regs,
PSEUDO_REGNO_MODE (reload_regno), reload_hard_regno)))
&reload_cost, -1)) >= 0)
{
if (lra_dump_file != NULL)
fprintf (lra_dump_file, " assign %d(cost=%d)",