re PR rtl-optimization/45912 (Patch for PR tree-optimization/44972 caused 2500+ FAILs on Solaris 2/SPARC)

PR rtl-optimization/45912
	* ira-costs.c (ira_tune_allocno_costs_and_cover_classes): Test the
	regno of registers instead of their index to compute the alignment.

From-SVN: r165437
This commit is contained in:
Eric Botcazou 2010-10-13 21:43:42 +00:00 committed by Eric Botcazou
parent 1e27129f2e
commit 8908df28a6
4 changed files with 55 additions and 10 deletions

View file

@ -1,3 +1,9 @@
2010-10-13 Eric Botcazou <ebotcazou@adacore.com>
PR rtl-optimization/45912
* ira-costs.c (ira_tune_allocno_costs_and_cover_classes): Test the
regno of registers instead of their index to compute the alignment.
2010-10-13 H.J. Lu <hongjiu.lu@intel.com>
* config/i386/i386.c (ix86_build_const_vector): Check vector

View file

@ -1789,15 +1789,14 @@ ira_tune_allocno_costs_and_cover_classes (void)
if (min_cost != INT_MAX)
ALLOCNO_COVER_CLASS_COST (a) = min_cost;
/* Some targets allow pseudos to be allocated to unaligned
sequences of hard registers. However, selecting an unaligned
sequence can unnecessarily restrict later allocations. So
increase the cost of unaligned hard regs to encourage the use
of aligned hard regs. */
/* Some targets allow pseudos to be allocated to unaligned sequences
of hard registers. However, selecting an unaligned sequence can
unnecessarily restrict later allocations. So increase the cost of
unaligned hard regs to encourage the use of aligned hard regs. */
{
int nregs, index;
const int nregs = ira_reg_class_nregs[cover_class][ALLOCNO_MODE (a)];
if ((nregs = ira_reg_class_nregs[cover_class][ALLOCNO_MODE (a)]) > 1)
if (nregs > 1)
{
ira_allocate_and_set_costs
(&ALLOCNO_HARD_REG_COSTS (a), cover_class,
@ -1805,10 +1804,10 @@ ira_tune_allocno_costs_and_cover_classes (void)
reg_costs = ALLOCNO_HARD_REG_COSTS (a);
for (j = n - 1; j >= 0; j--)
{
if (j % nregs != 0)
regno = ira_non_ordered_class_hard_regs[cover_class][j];
if ((regno % nregs) != 0)
{
regno = ira_non_ordered_class_hard_regs[cover_class][j];
index = ira_class_hard_reg_index[cover_class][regno];
int index = ira_class_hard_reg_index[cover_class][regno];
ira_assert (index != -1);
reg_costs[index] += ALLOCNO_FREQ (a);
}

View file

@ -1,3 +1,7 @@
2010-10-13 Eric Botcazou <ebotcazou@adacore.com>
* gcc.c-torture/execute/20101013-1.c: New test.
2010-10-13 Richard Guenther <rguenther@suse.de>
PR objc/45878

View file

@ -0,0 +1,36 @@
/* PR rtl-optimization/45912 */
extern void abort (void);
static void* __attribute__((noinline,noclone))
get_addr_base_and_unit_offset (void *base, long long *i)
{
*i = 0;
return base;
}
static void* __attribute__((noinline,noclone))
build_int_cst (void *base, long long offset)
{
if (offset != 4)
abort ();
return base;
}
static void* __attribute__((noinline,noclone))
build_ref_for_offset (void *base, long long offset)
{
long long base_offset;
base = get_addr_base_and_unit_offset (base, &base_offset);
return build_int_cst (base, base_offset + offset / 8);
}
int
main (void)
{
void *ret = build_ref_for_offset ((void *)0, 32);
if (ret != (void *)0)
abort ();
return 0;
}