Problems with the way we calculate costs
Jeffrey A Law
law@cygnus.com
Mon Sep 11 09:50:00 GMT 2000
In message < Pine.LNX.4.21.0009111659510.6299-100000@mahatma.cygnus.co.uk >you
write:
> On Mon, 11 Sep 2000, Geoff Keating wrote:
>
> > > Date: Mon, 11 Sep 2000 10:15:25 +0100 (BST)
> > > From: Bernd Schmidt <bernds@redhat.co.uk>
> > > cc: gcc-patches@gcc.gnu.org
> > >
> > > On Mon, 11 Sep 2000, Geoff Keating wrote:
> > >
> > > > It'd probably be better if it worked like the original code; that is,
> > > > the cost of a non-fixed hard register is 2, compared to 1 for a
> > > > pseudo. This ensures a pseudo gets preference, which would be the
> > > > usual case because such hard registers should be copied into pseudos
> > > > immediately after they appear.
> > >
> > > The original code mixed up these register pressure considerations with
> > > the calculation of the cost of an operation. I still think this is a
> > > bad idea. It also won't reliably prevent lifetimes of hard registers
> > > from being lenghtened (think of computing the cost of a shift of a
> > > hardreg as opposed to multiplication of a pseudo).
> >
> > I don't mind hard register lifetimes being lengthened if it really
> > makes the program faster; what I was complaining about is when a
> > hardreg and a pseudo are equivalent and the hardreg gets preference.
>
> Hmm. OK. How about the patch below? I incorporated a few suggestions
> from other people as well (moved COSTS_N_INSNS into rtl.h and added a new
> macro MAX_COST). I've also changed COSTS_N_INSNS to (4 * N) to restore
> some of the old cost relationships we use to have in the compiler.
>
> > Probably the macro to consider is SMALL_REGISTER_CLASSES.
>
> With the patch, we'll either consider hard regs having a cost of 2 (for
> non-SRC machines), or forcing a return value of MAX_COST (for SRC).
>
> Bernd
>
> * cse.c (approx_reg_cost): If SMALL_REGISTER_CLASSES, return INT_MAX
> if a reference to non-fixed hardreg is seen. Otherwise, count hard
> regs with a higher cost.
> (preferrable): Deal with cases where either cost or regcost is
> MAX_COST.
> (cse_insn): Use MAX_COST rather than 10000. Always initialize
> regcost values.
> (COSTS_N_INSNS): Move definition...
> * rtl.h: ...here.
> (MAX_COST): New macro.
> * loop.c (init_loop): Use COSTS_N_INSNS macro instead of hardcoded
> constant.
This is fine. Please install this patch.
Thanks,
jeff
More information about the Gcc-patches
mailing list