Commit 61ad6db1 by Richard Sandiford Committed by Richard Sandiford

ira-costs.c (find_allocno_class_costs): Work out the maximum allocno_costs value…

ira-costs.c (find_allocno_class_costs): Work out the maximum allocno_costs value of the classees with the lowest...

gcc/
	* ira-costs.c (find_allocno_class_costs): Work out the maximum
	allocno_costs value of the classees with the lowest total_costs
	value.  Use this to set ALLOCNO_COVER_CLASS_COST here...
	(setup_allocno_cover_class_and_costs): ...rather than here.
	Use the ALLOCNO_COVER_CLASS_COST for all registers in the
	preferred class.

From-SVN: r142117
parent b6500984
2008-11-22 Richard Sandiford <rdsandiford@googlemail.com>
* ira-costs.c (find_allocno_class_costs): Work out the maximum
allocno_costs value of the classees with the lowest total_costs
value. Use this to set ALLOCNO_COVER_CLASS_COST here...
(setup_allocno_cover_class_and_costs): ...rather than here.
Use the ALLOCNO_COVER_CLASS_COST for all registers in the
preferred class.
2008-11-22 Jakub Jelinek <jakub@redhat.com> 2008-11-22 Jakub Jelinek <jakub@redhat.com>
PR middle-end/37323 PR middle-end/37323
......
...@@ -1172,7 +1172,7 @@ find_allocno_class_costs (void) ...@@ -1172,7 +1172,7 @@ find_allocno_class_costs (void)
ira_allocno_t a, parent_a; ira_allocno_t a, parent_a;
int rclass, a_num, parent_a_num; int rclass, a_num, parent_a_num;
ira_loop_tree_node_t parent; ira_loop_tree_node_t parent;
int best_cost; int best_cost, allocno_cost;
enum reg_class best, alt_class, common_class; enum reg_class best, alt_class, common_class;
#ifdef FORBIDDEN_INC_DEC_CLASSES #ifdef FORBIDDEN_INC_DEC_CLASSES
int inc_dec_p = false; int inc_dec_p = false;
...@@ -1278,6 +1278,7 @@ find_allocno_class_costs (void) ...@@ -1278,6 +1278,7 @@ find_allocno_class_costs (void)
/* Finding best class which is subset of the common /* Finding best class which is subset of the common
class. */ class. */
best_cost = (1 << (HOST_BITS_PER_INT - 2)) - 1; best_cost = (1 << (HOST_BITS_PER_INT - 2)) - 1;
allocno_cost = best_cost;
best = ALL_REGS; best = ALL_REGS;
for (k = 0; k < cost_classes_num; k++) for (k = 0; k < cost_classes_num; k++)
{ {
...@@ -1302,12 +1303,21 @@ find_allocno_class_costs (void) ...@@ -1302,12 +1303,21 @@ find_allocno_class_costs (void)
{ {
best_cost best_cost
= COSTS_OF_ALLOCNO (total_costs, a_num)->cost[k]; = COSTS_OF_ALLOCNO (total_costs, a_num)->cost[k];
allocno_cost
= COSTS_OF_ALLOCNO (allocno_costs, a_num)->cost[k];
best = (enum reg_class) rclass; best = (enum reg_class) rclass;
} }
else if (COSTS_OF_ALLOCNO (total_costs, a_num)->cost[k] else if (COSTS_OF_ALLOCNO (total_costs, a_num)->cost[k]
== best_cost) == best_cost)
best = ira_reg_class_union[best][rclass]; {
best = ira_reg_class_union[best][rclass];
allocno_cost
= MAX (allocno_cost,
COSTS_OF_ALLOCNO (allocno_costs,
a_num)->cost[k]);
}
} }
ALLOCNO_COVER_CLASS_COST (a) = allocno_cost;
} }
if (internal_flag_ira_verbose > 2 && ira_dump_file != NULL if (internal_flag_ira_verbose > 2 && ira_dump_file != NULL
&& (pass == 0 || allocno_pref[a_num] != best)) && (pass == 0 || allocno_pref[a_num] != best))
...@@ -1421,6 +1431,7 @@ setup_allocno_cover_class_and_costs (void) ...@@ -1421,6 +1431,7 @@ setup_allocno_cover_class_and_costs (void)
int *reg_costs; int *reg_costs;
enum reg_class cover_class, rclass; enum reg_class cover_class, rclass;
enum machine_mode mode; enum machine_mode mode;
HARD_REG_SET *pref;
ira_allocno_t a; ira_allocno_t a;
ira_allocno_iterator ai; ira_allocno_iterator ai;
...@@ -1435,10 +1446,7 @@ setup_allocno_cover_class_and_costs (void) ...@@ -1435,10 +1446,7 @@ setup_allocno_cover_class_and_costs (void)
if (cover_class == NO_REGS) if (cover_class == NO_REGS)
continue; continue;
ALLOCNO_AVAILABLE_REGS_NUM (a) = ira_available_class_regs[cover_class]; ALLOCNO_AVAILABLE_REGS_NUM (a) = ira_available_class_regs[cover_class];
num = cost_class_nums[allocno_pref[i]]; pref = &reg_class_contents[allocno_pref[i]];
ira_assert (num >= 0);
ALLOCNO_COVER_CLASS_COST (a)
= COSTS_OF_ALLOCNO (allocno_costs, i)->cost[num];
if (optimize && ALLOCNO_COVER_CLASS (a) != allocno_pref[i]) if (optimize && ALLOCNO_COVER_CLASS (a) != allocno_pref[i])
{ {
n = ira_class_hard_regs_num[cover_class]; n = ira_class_hard_regs_num[cover_class];
...@@ -1447,17 +1455,23 @@ setup_allocno_cover_class_and_costs (void) ...@@ -1447,17 +1455,23 @@ setup_allocno_cover_class_and_costs (void)
for (j = n - 1; j >= 0; j--) for (j = n - 1; j >= 0; j--)
{ {
regno = ira_class_hard_regs[cover_class][j]; regno = ira_class_hard_regs[cover_class][j];
rclass = REGNO_REG_CLASS (regno); if (TEST_HARD_REG_BIT (*pref, regno))
num = cost_class_nums[rclass]; reg_costs[j] = ALLOCNO_COVER_CLASS_COST (a);
if (num < 0) else
{ {
/* The hard register class is not a cover class or a rclass = REGNO_REG_CLASS (regno);
class not fully inside in a cover class -- use num = cost_class_nums[rclass];
the allocno cover class. */ if (num < 0)
ira_assert (ira_hard_regno_cover_class[regno] == cover_class); {
num = cost_class_nums[cover_class]; /* The hard register class is not a cover class or a
class not fully inside in a cover class -- use
the allocno cover class. */
ira_assert (ira_hard_regno_cover_class[regno]
== cover_class);
num = cost_class_nums[cover_class];
}
reg_costs[j] = COSTS_OF_ALLOCNO (allocno_costs, i)->cost[num];
} }
reg_costs[j] = COSTS_OF_ALLOCNO (allocno_costs, i)->cost[num];
} }
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment