ira-build.c (update_conflict_hard_reg_costs): New.

* ira-build.c (update_conflict_hard_reg_costs): New.
        (ira_build): Call update_conflict_hard_reg_costs.

From-SVN: r159830
This commit is contained in:
Vladimir Makarov 2010-05-25 16:29:38 +00:00 committed by Jeff Law
parent bb9862c6d9
commit 4ac293e239
2 changed files with 45 additions and 1 deletions

View File

@ -1,3 +1,8 @@
2010-05-25 Vladimir Makarov <vmakarov@redhat.com>
* ira-build.c (update_conflict_hard_reg_costs): New.
(ira_build): Call update_conflict_hard_reg_costs.
2010-05-25 Jakub Jelinek <jakub@redhat.com>
PR debug/41371

View File

@ -1,5 +1,5 @@
/* Building internal representation for IRA.
Copyright (C) 2006, 2007, 2008, 2009
Copyright (C) 2006, 2007, 2008, 2009, 2010
Free Software Foundation, Inc.
Contributed by Vladimir Makarov <vmakarov@redhat.com>.
@ -2757,6 +2757,44 @@ check_allocno_creation (void)
}
#endif
/* Identify allocnos which prefer a register class with a single hard register.
Adjust ALLOCNO_CONFLICT_HARD_REG_COSTS so that conflicting allocnos are
less likely to use the preferred singleton register. */
static void
update_conflict_hard_reg_costs (void)
{
ira_allocno_t a;
ira_allocno_iterator ai;
int i, index, min;
FOR_EACH_ALLOCNO (a, ai)
{
enum reg_class cover_class = ALLOCNO_COVER_CLASS (a);
enum reg_class pref = reg_preferred_class (ALLOCNO_REGNO (a));
if (reg_class_size[pref] != 1)
continue;
index = (ira_class_hard_reg_index[cover_class]
[ira_class_hard_regs[pref][0]]);
if (index < 0)
continue;
if (ALLOCNO_CONFLICT_HARD_REG_COSTS (a) == NULL
|| ALLOCNO_HARD_REG_COSTS (a) == NULL)
continue;
min = INT_MAX;
for (i = ira_class_hard_regs_num[cover_class] - 1; i >= 0; i--)
if (ALLOCNO_HARD_REG_COSTS (a)[i] > ALLOCNO_COVER_CLASS_COST (a)
&& min > ALLOCNO_HARD_REG_COSTS (a)[i])
min = ALLOCNO_HARD_REG_COSTS (a)[i];
if (min == INT_MAX)
continue;
ira_allocate_and_set_costs (&ALLOCNO_CONFLICT_HARD_REG_COSTS (a),
cover_class, 0);
ALLOCNO_CONFLICT_HARD_REG_COSTS (a)[index]
-= min - ALLOCNO_COVER_CLASS_COST (a);
}
}
/* Create a internal representation (IR) for IRA (allocnos, copies,
loop tree nodes). If LOOPS_P is FALSE the nodes corresponding to
the loops (except the root which corresponds the all function) and
@ -2796,6 +2834,7 @@ ira_build (bool loops_p)
sort_conflict_id_allocno_map ();
setup_min_max_conflict_allocno_ids ();
ira_build_conflicts ();
update_conflict_hard_reg_costs ();
if (! ira_conflicts_p)
{
ira_allocno_t a;