aboutsummaryrefslogtreecommitdiff
path: root/gcc/regclass.c
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2001-02-12 17:30:08 +0100
committerJan Hubicka <hubicka@gcc.gnu.org>2001-02-12 16:30:08 +0000
commit7004b11bf0d1b4a58baccfd38bdbff9365f0e87b (patch)
tree5e807b64787ceb0dcd02fb57a9b08c9ab2fecc77 /gcc/regclass.c
parent45abaea89ceed7cbd6128a841605430da841064a (diff)
downloadgcc-7004b11bf0d1b4a58baccfd38bdbff9365f0e87b.zip
gcc-7004b11bf0d1b4a58baccfd38bdbff9365f0e87b.tar.gz
gcc-7004b11bf0d1b4a58baccfd38bdbff9365f0e87b.tar.bz2
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
Diffstat (limited to 'gcc/regclass.c')
-rw-r--r--gcc/regclass.c83
1 files changed, 56 insertions, 27 deletions
diff --git a/gcc/regclass.c b/gcc/regclass.c
index 610de28..da16edc 100644
--- a/gcc/regclass.c
+++ b/gcc/regclass.c
@@ -288,6 +288,8 @@ init_reg_sets_1 ()
{
register unsigned int i, j;
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
and the register classes to depend on target flags. */
@@ -423,44 +425,71 @@ init_reg_sets_1 ()
if (CLASS_LIKELY_SPILLED_P (REGNO_REG_CLASS (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
and take the maximum cost of moving any subset to any other. */
for (m = 0; m < MAX_MACHINE_MODE; m++)
- for (i = 0; i < N_REG_CLASSES; i++)
- for (j = 0; j < N_REG_CLASSES; j++)
- {
- int cost = i == j ? 2 : REGISTER_MOVE_COST (m, i, j);
- enum reg_class *p1, *p2;
+ if (allocatable_regs_of_mode [m])
+ for (i = 0; i < N_REG_CLASSES; i++)
+ if (contains_reg_of_mode [i][m])
+ for (j = 0; j < N_REG_CLASSES; j++)
+ {
+ int cost;
+ enum reg_class *p1, *p2;
- for (p2 = &reg_class_subclasses[j][0]; *p2 != LIM_REG_CLASSES; p2++)
- if (*p2 != i)
- cost = MAX (cost, REGISTER_MOVE_COST (m, i, *p2));
+ if (!contains_reg_of_mode [j][m])
+ {
+ 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++)
- {
- if (*p1 != j)
- cost = MAX (cost, REGISTER_MOVE_COST (m, *p1, j));
+ for (p2 = &reg_class_subclasses[j][0]; *p2 != LIM_REG_CLASSES;
+ p2++)
+ if (*p2 != i && contains_reg_of_mode [*p1][m])
+ cost = MAX (cost, move_cost [m][i][*p2]);
- for (p2 = &reg_class_subclasses[j][0];
- *p2 != LIM_REG_CLASSES; p2++)
- if (*p1 != *p2)
- cost = MAX (cost, REGISTER_MOVE_COST (m, *p1, *p2));
- }
+ for (p1 = &reg_class_subclasses[i][0]; *p1 != LIM_REG_CLASSES;
+ p1++)
+ if (*p1 != j && contains_reg_of_mode [*p1][m])
+ 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))
- may_move_in_cost[m][i][j] = 0;
- else
- may_move_in_cost[m][i][j] = cost;
+ if (reg_class_subset_p (i, j))
+ may_move_in_cost[m][i][j] = 0;
+ else
+ may_move_in_cost[m][i][j] = cost;
- if (reg_class_subset_p (j, i))
- may_move_out_cost[m][i][j] = 0;
- else
- may_move_out_cost[m][i][j] = cost;
- }
+ if (reg_class_subset_p (j, i))
+ may_move_out_cost[m][i][j] = 0;
+ else
+ 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
{