This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: RFA: Another patch to fix performance degradation on SPECFP2000
On Sat, Sep 06, 2008 at 04:40:34PM -0700, H.J. Lu wrote:
> On Sat, Sep 6, 2008 at 9:40 AM, Vladimir Makarov <vmakarov@redhat.com> wrote:
> >
> > The patch has been successfully bootstrapped on x86_64.
> >
> > 2008-09-06 Vladimir Makarov <vmakarov@redhat.com>
> >
> > * ira-color.c (allocno_live_range_length): New function.
> > (allocno_spill_priority_compare): Use it.
> > (push_allocnos_to_stack): Ditto. Use double for priority
> > calculations.
> >
> >
>
> I got comparison failure on Linux/ia32.:
>
> make[5]: Leaving directory `/export/build/gnu/gcc-ira/build-i686-linux'
> Comparing stages 2 and 3
> warning: ./cc1plus-checksum.o differs
> warning: ./cc1-checksum.o differs
> warning: ./cc1obj-checksum.o differs
> Bootstrap comparison failure!
> ./tree-vect-transform.o differs
> ./var-tracking.o differs
> ./tree-ssa-loop-ivopts.o differs
> ./loop-unroll.o differs
> ./combine.o differs
> ./insn-emit.o differs
> ./print-tree.o differs
> ./gcse.o differs
> ./tree-tailcall.o differs
> ./haifa-sched.o differs
> ./cfgbuild.o differs
> ./i386.o differs
> ./tree-ssa-alias.o differs
> ./tree-ssa-ccp.o differs
> ./insn-attrtab.o differs
> ....
>
> It may have something to do with using "double".
>
Hi Vladimir,
This patch on top of yours allows gcc to bootstrap on Linux/ia32.
H.J.
---
2008-09-07 H.J. Lu <hongjiu.lu@intel.com>
* ira-color.c (allocno_spill_priority_compare): Use HOST_WIDEST_INT
for priority calculations.
(push_allocnos_to_stack): Likewise.
--- gcc/ira-color.c.double 2008-09-07 11:59:40.000000000 -0700
+++ gcc/ira-color.c 2008-09-07 12:05:40.000000000 -0700
@@ -950,15 +950,15 @@ allocno_live_range_length (ira_allocno_t
static int
allocno_spill_priority_compare (splay_tree_key k1, splay_tree_key k2)
{
- double pri1, pri2;
+ HOST_WIDEST_INT pri1, pri2;
int diff;
ira_allocno_t a1 = (ira_allocno_t) k1, a2 = (ira_allocno_t) k2;
- pri1 = ((double) IRA_ALLOCNO_TEMP (a1)
+ pri1 = ((HOST_WIDEST_INT) IRA_ALLOCNO_TEMP (a1)
/ (ALLOCNO_LEFT_CONFLICTS_NUM (a1)
* ira_reg_class_nregs[ALLOCNO_COVER_CLASS (a1)][ALLOCNO_MODE (a1)]
+ 1));
- pri2 = ((double) IRA_ALLOCNO_TEMP (a2)
+ pri2 = ((HOST_WIDEST_INT) IRA_ALLOCNO_TEMP (a2)
/ (ALLOCNO_LEFT_CONFLICTS_NUM (a2)
* ira_reg_class_nregs[ALLOCNO_COVER_CLASS (a2)][ALLOCNO_MODE (a2)]
+ 1));
@@ -1011,7 +1011,7 @@ push_allocnos_to_stack (void)
{
ira_allocno_t allocno, a, i_allocno, *allocno_vec;
enum reg_class cover_class, rclass;
- double allocno_pri, i_allocno_pri;
+ HOST_WIDEST_INT allocno_pri, i_allocno_pri;
int allocno_cost, i_allocno_cost, allocno_lr, i_allocno_lr;
int i, j, num, cover_class_allocnos_num[N_REG_CLASSES];
ira_allocno_t *cover_class_allocnos[N_REG_CLASSES];
@@ -1120,7 +1120,7 @@ push_allocnos_to_stack (void)
ira_assert (num > 0);
allocno_vec = cover_class_allocnos[cover_class];
allocno = NULL;
- allocno_pri = 0.0; allocno_cost = 0; allocno_lr = -1;
+ allocno_pri = 0; allocno_cost = 0; allocno_lr = -1;
/* Sort uncolorable allocno to find the one with the lowest
spill cost. */
for (i = 0, j = num - 1; i <= j;)
@@ -1154,7 +1154,7 @@ push_allocnos_to_stack (void)
}
i_allocno_cost = IRA_ALLOCNO_TEMP (i_allocno);
i_allocno_pri
- = ((double) i_allocno_cost
+ = ((HOST_WIDEST_INT) i_allocno_cost
/ (ALLOCNO_LEFT_CONFLICTS_NUM (i_allocno)
* ira_reg_class_nregs[ALLOCNO_COVER_CLASS
(i_allocno)]