ira.c (check_allocation): Correctly handle the case where an allocno with two objects was allocated to a...

* ira.c (check_allocation): Correctly handle the case where an allocno
	with two objects was allocated to a single reg.

From-SVN: r162432
This commit is contained in:
Bernd Schmidt 2010-07-22 22:34:11 +00:00 committed by Bernd Schmidt
parent 1a39adaec8
commit 8cfd82bf11
2 changed files with 20 additions and 10 deletions

View File

@ -1,3 +1,8 @@
2010-07-22 Bernd Schmidt <bernds@codesourcery.com>
* ira.c (check_allocation): Correctly handle the case where an allocno
with two objects was allocated to a single reg.
2010-07-22 Richard Sandiford <rdsandiford@googlemail.com>
* tree-ssa-math-opts.c (is_widening_mult_rhs_p): New function.

View File

@ -1624,11 +1624,14 @@ check_allocation (void)
|| (hard_regno = ALLOCNO_HARD_REGNO (a)) < 0)
continue;
nregs = hard_regno_nregs[hard_regno][ALLOCNO_MODE (a)];
if (n > 1)
{
gcc_assert (n == nregs);
nregs = 1;
}
if (nregs == 1)
/* We allocated a single hard register. */
n = 1;
else if (n > 1)
/* We allocated multiple hard registers, and we will test
conflicts in a granularity of single hard regs. */
nregs = 1;
for (i = 0; i < n; i++)
{
ira_object_t obj = ALLOCNO_OBJECT (a, i);
@ -1648,7 +1651,13 @@ check_allocation (void)
int conflict_hard_regno = ALLOCNO_HARD_REGNO (conflict_a);
if (conflict_hard_regno < 0)
continue;
if (ALLOCNO_NUM_OBJECTS (conflict_a) > 1)
conflict_nregs
= (hard_regno_nregs
[conflict_hard_regno][ALLOCNO_MODE (conflict_a)]);
if (ALLOCNO_NUM_OBJECTS (conflict_a) > 1
&& conflict_nregs == ALLOCNO_NUM_OBJECTS (conflict_a))
{
if (WORDS_BIG_ENDIAN)
conflict_hard_regno += (ALLOCNO_NUM_OBJECTS (conflict_a)
@ -1657,10 +1666,6 @@ check_allocation (void)
conflict_hard_regno += OBJECT_SUBWORD (conflict_obj);
conflict_nregs = 1;
}
else
conflict_nregs
= (hard_regno_nregs
[conflict_hard_regno][ALLOCNO_MODE (conflict_a)]);
if ((conflict_hard_regno <= this_regno
&& this_regno < conflict_hard_regno + conflict_nregs)