ira-conflicts.c (process_regs_for_copy): Check insn to check that the cost is already taken into account in ira-costs.c

2008-09-04  Vladimir Makarov  <vmakarov@redhat.com>

	* ira-conflicts.c (process_regs_for_copy): Check insn to check
	that the cost is already taken into account in ira-costs.c

	* ira-int.h (ira_debug_copy, ira_debug_copies): New.

	* ira-build.c (print_copy, print_copies, ira_debug_copy,
	ira_debug_copies): New.
	(ira_bulid): Call print_copies.
	
	* doc/tm.texi (IRA_COVER_CLASSES): Fix the description.

From-SVN: r140014
This commit is contained in:
Vladimir Makarov 2008-09-04 23:35:03 +00:00 committed by Vladimir Makarov
parent 2f3b0d4ad6
commit 4cda38d572
5 changed files with 57 additions and 6 deletions

View File

@ -1,3 +1,16 @@
2008-09-04 Vladimir Makarov <vmakarov@redhat.com>
* ira-conflicts.c (process_regs_for_copy): Check insn to check
that the cost is already taken into account in ira-costs.c
* ira-int.h (ira_debug_copy, ira_debug_copies): New.
* ira-build.c (print_copy, print_copies, ira_debug_copy,
ira_debug_copies): New.
(ira_bulid): Call print_copies.
* doc/tm.texi (IRA_COVER_CLASSES): Fix the description.
2008-09-04 Samuel Tardieu <sam@rfc1149.net>
PR target/32783

View File

@ -2830,10 +2830,10 @@ as below:
The macro defines cover classes for the Integrated Register Allocator
(@acronym{IRA}). Cover classes are a set of non-intersecting register
classes covering all hard registers used for register allocation
purposes. Any move between two registers in the same cover class
should be cheaper than load or store of the registers. The macro
value should be the initializer for an array of register class values,
with @code{LIM_REG_CLASSES} used as the end marker.
purposes. If a move between two registers in the same cover class are
possible, it should be cheaper than a load or store of the registers.
The macro value should be the initializer for an array of register
class values, with @code{LIM_REG_CLASSES} used as the end marker.
You must define this macro in order to use the integrated register
allocator for the target.

View File

@ -1097,6 +1097,40 @@ ira_add_allocno_copy (ira_allocno_t first, ira_allocno_t second, int freq,
return cp;
}
/* Print info about copy CP into file F. */
static void
print_copy (FILE *f, ira_copy_t cp)
{
fprintf (f, " cp%d:a%d(r%d)<->a%d(r%d)@%d\n", cp->num,
ALLOCNO_NUM (cp->first), ALLOCNO_REGNO (cp->first),
ALLOCNO_NUM (cp->second), ALLOCNO_REGNO (cp->second), cp->freq);
}
/* Print info about copy CP into stderr. */
void
ira_debug_copy (ira_copy_t cp)
{
print_copy (stderr, cp);
}
/* Print info about all copies into file F. */
static void
print_copies (FILE *f)
{
ira_copy_t cp;
ira_copy_iterator ci;
FOR_EACH_COPY (cp, ci)
print_copy (f, cp);
}
/* Print info about all copies into stderr. */
void
ira_debug_copies (void)
{
print_copies (stderr);
}
/* Print info about copies involving allocno A into file F. */
static void
print_allocno_copies (FILE *f, ira_allocno_t a)
@ -2409,6 +2443,8 @@ ira_build (bool loops_p)
sort_conflict_id_allocno_map ();
setup_min_max_conflict_allocno_ids ();
ira_build_conflicts ();
if (internal_flag_ira_verbose > 2 && ira_dump_file != NULL)
print_copies (ira_dump_file);
if (internal_flag_ira_verbose > 0 && ira_dump_file != NULL)
{
int n, nr;

View File

@ -371,8 +371,8 @@ process_regs_for_copy (rtx reg1, rtx reg2, rtx insn, int freq)
cover_class = ALLOCNO_COVER_CLASS (a);
if (! ira_class_subset_p[rclass][cover_class])
return false;
if (reg_class_size[rclass] <= (unsigned) CLASS_MAX_NREGS (rclass, mode)
&& only_regs_p)
if (only_regs_p && insn != NULL_RTX
&& reg_class_size[rclass] <= (unsigned) CLASS_MAX_NREGS (rclass, mode))
/* It is already taken into account in ira-costs.c. */
return false;
index = ira_class_hard_reg_index[cover_class][hard_regno];

View File

@ -838,6 +838,8 @@ extern rtx *ira_reg_equiv_const;
extern ira_loop_tree_node_t ira_curr_loop_tree_node;
extern ira_allocno_t *ira_curr_regno_allocno_map;
extern void ira_debug_copy (ira_copy_t);
extern void ira_debug_copies (void);
extern void ira_debug_allocno_copies (ira_allocno_t);
extern void ira_traverse_loop_tree (bool, ira_loop_tree_node_t,