Commit 7004b11b by Jan Hubicka Committed by Jan Hubicka

regclass.c (init_reg_sets_1): Optimize calculation of move_cost arrays.


	* regclass.c (init_reg_sets_1): Optimize calculation of move_cost
	arrays.

From-SVN: r39606
parent 45abaea8
Mon Feb 12 17:28:48 CET 2001 Jan Hubicka <jh@suse.cz>
* regclass.c (init_reg_sets_1): Optimize calculation of move_cost
arrays.
2001-02-12 Nathan Sidwell <nathan@codesourcery.com> 2001-02-12 Nathan Sidwell <nathan@codesourcery.com>
* extend.texi (Deprecated): Deprecate new initializer lists. * extend.texi (Deprecated): Deprecate new initializer lists.
......
...@@ -288,6 +288,8 @@ init_reg_sets_1 () ...@@ -288,6 +288,8 @@ init_reg_sets_1 ()
{ {
register unsigned int i, j; register unsigned int i, j;
register unsigned int /* enum machine_mode */ m; register unsigned int /* enum machine_mode */ m;
char contains_reg_of_mode [LIM_REG_CLASSES] [MAX_MACHINE_MODE];
char allocatable_regs_of_mode [MAX_MACHINE_MODE];
/* This macro allows the fixed or call-used registers /* This macro allows the fixed or call-used registers
and the register classes to depend on target flags. */ and the register classes to depend on target flags. */
...@@ -423,44 +425,71 @@ init_reg_sets_1 () ...@@ -423,44 +425,71 @@ init_reg_sets_1 ()
if (CLASS_LIKELY_SPILLED_P (REGNO_REG_CLASS (i))) if (CLASS_LIKELY_SPILLED_P (REGNO_REG_CLASS (i)))
SET_HARD_REG_BIT (losing_caller_save_reg_set, i); SET_HARD_REG_BIT (losing_caller_save_reg_set, i);
} }
memset (contains_reg_of_mode, 0, sizeof (contains_reg_of_mode));
memset (allocatable_regs_of_mode, 0, sizeof (allocatable_regs_of_mode));
for (m = 0; m < MAX_MACHINE_MODE; m++)
for (i = 0; i < N_REG_CLASSES; i++)
for (j = 0; j < FIRST_PSEUDO_REGISTER; j++)
if (!fixed_regs [j] && TEST_HARD_REG_BIT (reg_class_contents[i], j)
&& HARD_REGNO_MODE_OK (j, m))
{
contains_reg_of_mode [i][m] = 1;
allocatable_regs_of_mode [m] = 1;
break;
}
/* Initialize the move cost table. Find every subset of each class /* Initialize the move cost table. Find every subset of each class
and take the maximum cost of moving any subset to any other. */ and take the maximum cost of moving any subset to any other. */
for (m = 0; m < MAX_MACHINE_MODE; m++) for (m = 0; m < MAX_MACHINE_MODE; m++)
for (i = 0; i < N_REG_CLASSES; i++) if (allocatable_regs_of_mode [m])
for (j = 0; j < N_REG_CLASSES; j++) for (i = 0; i < N_REG_CLASSES; i++)
{ if (contains_reg_of_mode [i][m])
int cost = i == j ? 2 : REGISTER_MOVE_COST (m, i, j); for (j = 0; j < N_REG_CLASSES; j++)
enum reg_class *p1, *p2; {
int cost;
enum reg_class *p1, *p2;
for (p2 = &reg_class_subclasses[j][0]; *p2 != LIM_REG_CLASSES; p2++) if (!contains_reg_of_mode [j][m])
if (*p2 != i) {
cost = MAX (cost, REGISTER_MOVE_COST (m, i, *p2)); move_cost[m][i][j] = 65536;
may_move_in_cost[m][i][j] = 65536;
may_move_out_cost[m][i][j] = 65536;
}
else
{
cost = i == j ? 2 : REGISTER_MOVE_COST (m, i, j);
for (p1 = &reg_class_subclasses[i][0]; *p1 != LIM_REG_CLASSES; p1++) for (p2 = &reg_class_subclasses[j][0]; *p2 != LIM_REG_CLASSES;
{ p2++)
if (*p1 != j) if (*p2 != i && contains_reg_of_mode [*p1][m])
cost = MAX (cost, REGISTER_MOVE_COST (m, *p1, j)); cost = MAX (cost, move_cost [m][i][*p2]);
for (p2 = &reg_class_subclasses[j][0]; for (p1 = &reg_class_subclasses[i][0]; *p1 != LIM_REG_CLASSES;
*p2 != LIM_REG_CLASSES; p2++) p1++)
if (*p1 != *p2) if (*p1 != j && contains_reg_of_mode [*p1][m])
cost = MAX (cost, REGISTER_MOVE_COST (m, *p1, *p2)); cost = MAX (cost, move_cost [m][*p1][j]);
}
move_cost[m][i][j] = cost; move_cost[m][i][j] = cost;
if (reg_class_subset_p (i, j)) if (reg_class_subset_p (i, j))
may_move_in_cost[m][i][j] = 0; may_move_in_cost[m][i][j] = 0;
else else
may_move_in_cost[m][i][j] = cost; may_move_in_cost[m][i][j] = cost;
if (reg_class_subset_p (j, i)) if (reg_class_subset_p (j, i))
may_move_out_cost[m][i][j] = 0; may_move_out_cost[m][i][j] = 0;
else else
may_move_out_cost[m][i][j] = cost; may_move_out_cost[m][i][j] = cost;
} }
}
else
for (j = 0; j < N_REG_CLASSES; j++)
{
move_cost[m][i][j] = 65536;
may_move_in_cost[m][i][j] = 65536;
may_move_out_cost[m][i][j] = 65536;
}
#ifdef CLASS_CANNOT_CHANGE_MODE #ifdef CLASS_CANNOT_CHANGE_MODE
{ {
......
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