Commit 165f639c by Vladimir Makarov Committed by Vladimir Makarov

ira-int.h (struct target_ira_int): Add member x_ira_uniform_class_p.

2012-06-04  Vladimir Makarov  <vmakarov@redhat.com>

	* ira-int.h (struct target_ira_int): Add member
	x_ira_uniform_class_p.
	(ira_uniform_class_p): New macro.

	* ira.c (setup_uniform_class_p): New function.
	(setup_allocno_and_important_classes): Call the function.
	(print_unform_and_important_classes): New function.
	(print_classes): Rename to print_translated_classes.
	(ira_debug_allocno_classes): Add call of
	print_unform_and_important_classes.

	* ira-costs.c (setup_regno_cost_classes_by_aclass): Use uniform
	classes instead of pressure classes.

From-SVN: r188199
parent 7496cd5b
2012-06-04 Vladimir Makarov <vmakarov@redhat.com>
* ira-int.h (struct target_ira_int): Add member
x_ira_uniform_class_p.
(ira_uniform_class_p): New macro.
* ira.c (setup_uniform_class_p): New function.
(setup_allocno_and_important_classes): Call the function.
(print_unform_and_important_classes): New function.
(print_classes): Rename to print_translated_classes.
(ira_debug_allocno_classes): Add call of
print_unform_and_important_classes.
* ira-costs.c (setup_regno_cost_classes_by_aclass): Use uniform
classes instead of pressure classes.
2012-06-04 Sterling Augustine <saugustine@google.com> 2012-06-04 Sterling Augustine <saugustine@google.com>
* gcc/c-family/c-pretty-print.h (pp_c_flag_gnu_v3): New enumerator. * gcc/c-family/c-pretty-print.h (pp_c_flag_gnu_v3): New enumerator.
......
...@@ -239,33 +239,19 @@ setup_regno_cost_classes_by_aclass (int regno, enum reg_class aclass) ...@@ -239,33 +239,19 @@ setup_regno_cost_classes_by_aclass (int regno, enum reg_class aclass)
COPY_HARD_REG_SET (temp, reg_class_contents[aclass]); COPY_HARD_REG_SET (temp, reg_class_contents[aclass]);
AND_COMPL_HARD_REG_SET (temp, ira_no_alloc_regs); AND_COMPL_HARD_REG_SET (temp, ira_no_alloc_regs);
/* We exclude classes from consideration which are subsets of /* We exclude classes from consideration which are subsets of
ACLASS only if ACLASS is a pressure class or subset of a ACLASS only if ACLASS is an uniform class. */
pressure class. It means by the definition of pressure classes exclude_p = ira_uniform_class_p[aclass];
that cost of moving between susbets of ACLASS is cheaper than
load or store. */
for (i = 0; i < ira_pressure_classes_num; i++)
{
cl = ira_pressure_classes[i];
if (cl == aclass)
break;
COPY_HARD_REG_SET (temp2, reg_class_contents[cl]);
AND_COMPL_HARD_REG_SET (temp2, ira_no_alloc_regs);
if (hard_reg_set_subset_p (temp, temp2))
break;
}
exclude_p = i < ira_pressure_classes_num;
classes.num = 0; classes.num = 0;
for (i = 0; i < ira_important_classes_num; i++) for (i = 0; i < ira_important_classes_num; i++)
{ {
cl = ira_important_classes[i]; cl = ira_important_classes[i];
if (exclude_p) if (exclude_p)
{ {
/* Exclude no-pressure classes which are subsets of /* Exclude non-uniform classes which are subsets of
ACLASS. */ ACLASS. */
COPY_HARD_REG_SET (temp2, reg_class_contents[cl]); COPY_HARD_REG_SET (temp2, reg_class_contents[cl]);
AND_COMPL_HARD_REG_SET (temp2, ira_no_alloc_regs); AND_COMPL_HARD_REG_SET (temp2, ira_no_alloc_regs);
if (! ira_reg_pressure_class_p[cl] if (hard_reg_set_subset_p (temp2, temp) && cl != aclass)
&& hard_reg_set_subset_p (temp2, temp) && cl != aclass)
continue; continue;
} }
classes.classes[classes.num++] = cl; classes.classes[classes.num++] = cl;
......
...@@ -828,6 +828,9 @@ struct target_ira_int { ...@@ -828,6 +828,9 @@ struct target_ira_int {
classes. */ classes. */
int x_ira_important_class_nums[N_REG_CLASSES]; int x_ira_important_class_nums[N_REG_CLASSES];
/* Map class->true if class is an uniform class, false otherwise. */
bool x_ira_uniform_class_p[N_REG_CLASSES];
/* The biggest important class inside of intersection of the two /* The biggest important class inside of intersection of the two
classes (that is calculated taking only hard registers available classes (that is calculated taking only hard registers available
for allocation into account;. If the both classes contain no hard for allocation into account;. If the both classes contain no hard
...@@ -905,6 +908,8 @@ extern struct target_ira_int *this_target_ira_int; ...@@ -905,6 +908,8 @@ extern struct target_ira_int *this_target_ira_int;
(this_target_ira_int->x_ira_important_classes) (this_target_ira_int->x_ira_important_classes)
#define ira_important_class_nums \ #define ira_important_class_nums \
(this_target_ira_int->x_ira_important_class_nums) (this_target_ira_int->x_ira_important_class_nums)
#define ira_uniform_class_p \
(this_target_ira_int->x_ira_uniform_class_p)
#define ira_reg_class_intersect \ #define ira_reg_class_intersect \
(this_target_ira_int->x_ira_reg_class_intersect) (this_target_ira_int->x_ira_reg_class_intersect)
#define ira_reg_classes_intersect_p \ #define ira_reg_classes_intersect_p \
......
...@@ -903,6 +903,45 @@ setup_pressure_classes (void) ...@@ -903,6 +903,45 @@ setup_pressure_classes (void)
setup_stack_reg_pressure_class (); setup_stack_reg_pressure_class ();
} }
/* Set up IRA_UNIFORM_CLASS_P. Uniform class is a register class
whose register move cost between any registers of the class is the
same as for all its subclasses. We use the data to speed up the
2nd pass of calculations of allocno costs. */
static void
setup_uniform_class_p (void)
{
int i, cl, cl2, m;
for (cl = 0; cl < N_REG_CLASSES; cl++)
{
ira_uniform_class_p[cl] = false;
if (ira_class_hard_regs_num[cl] == 0)
continue;
/* We can not use alloc_reg_class_subclasses here because move
cost hooks does not take into account that some registers are
unavailable for the subtarget. E.g. for i686, INT_SSE_REGS
is element of alloc_reg_class_subclasses for GENERAL_REGS
because SSE regs are unavailable. */
for (i = 0; (cl2 = reg_class_subclasses[cl][i]) != LIM_REG_CLASSES; i++)
{
if (ira_class_hard_regs_num[cl2] == 0)
continue;
for (m = 0; m < NUM_MACHINE_MODES; m++)
if (contains_reg_of_mode[cl][m] && contains_reg_of_mode[cl2][m])
{
ira_init_register_move_cost_if_necessary ((enum machine_mode) m);
if (ira_register_move_cost[m][cl][cl]
!= ira_register_move_cost[m][cl2][cl2])
break;
}
if (m < NUM_MACHINE_MODES)
break;
}
if (cl2 == LIM_REG_CLASSES)
ira_uniform_class_p[cl] = true;
}
}
/* Set up IRA_ALLOCNO_CLASSES, IRA_ALLOCNO_CLASSES_NUM, /* Set up IRA_ALLOCNO_CLASSES, IRA_ALLOCNO_CLASSES_NUM,
IRA_IMPORTANT_CLASSES, and IRA_IMPORTANT_CLASSES_NUM. IRA_IMPORTANT_CLASSES, and IRA_IMPORTANT_CLASSES_NUM.
...@@ -1008,6 +1047,7 @@ setup_allocno_and_important_classes (void) ...@@ -1008,6 +1047,7 @@ setup_allocno_and_important_classes (void)
for (j = 0; j < ira_allocno_classes_num; j++) for (j = 0; j < ira_allocno_classes_num; j++)
ira_reg_allocno_class_p[ira_allocno_classes[j]] = true; ira_reg_allocno_class_p[ira_allocno_classes[j]] = true;
setup_pressure_classes (); setup_pressure_classes ();
setup_uniform_class_p ();
} }
/* Setup translation in CLASS_TRANSLATE of all classes into a class /* Setup translation in CLASS_TRANSLATE of all classes into a class
...@@ -1292,10 +1332,27 @@ setup_reg_class_relations (void) ...@@ -1292,10 +1332,27 @@ setup_reg_class_relations (void)
} }
} }
/* Output all possible allocno classes and the translation map into /* Output all unifrom and important classes into file F. */
file F. */ static void
print_unform_and_important_classes (FILE *f)
{
static const char *const reg_class_names[] = REG_CLASS_NAMES;
int i, cl;
fprintf (f, "Uniform classes:\n");
for (cl = 0; cl < N_REG_CLASSES; cl++)
if (ira_uniform_class_p[cl])
fprintf (f, " %s", reg_class_names[cl]);
fprintf (f, "\nImportant classes:\n");
for (i = 0; i < ira_important_classes_num; i++)
fprintf (f, " %s", reg_class_names[ira_important_classes[i]]);
fprintf (f, "\n");
}
/* Output all possible allocno or pressure classes and their
translation map into file F. */
static void static void
print_classes (FILE *f, bool pressure_p) print_translated_classes (FILE *f, bool pressure_p)
{ {
int classes_num = (pressure_p int classes_num = (pressure_p
? ira_pressure_classes_num : ira_allocno_classes_num); ? ira_pressure_classes_num : ira_allocno_classes_num);
...@@ -1321,8 +1378,9 @@ print_classes (FILE *f, bool pressure_p) ...@@ -1321,8 +1378,9 @@ print_classes (FILE *f, bool pressure_p)
void void
ira_debug_allocno_classes (void) ira_debug_allocno_classes (void)
{ {
print_classes (stderr, false); print_unform_and_important_classes (stderr);
print_classes (stderr, true); print_translated_classes (stderr, false);
print_translated_classes (stderr, true);
} }
/* Set up different arrays concerning class subsets, allocno and /* Set up different arrays concerning class subsets, allocno and
......
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