On Fri, Mar 7, 2025 at 8:42 PM Jan Hubicka <hubi...@ucw.cz> wrote:
>
> > > This is OK.  In general, I think we could also go with assert on
> > > mem_cost <= 2, since that is kind of bogus setting (I don't think we
> > > will ever need to support x86 CPU with memory stores being as cheap as
> > > reg-reg moves), but current form is good.
> >
> > Unless the loading/storing integer costs in x86-tune-costs.h are unrelated,
> > there are tons of tunings which have cost 2:
> >
> > grep 
> > '\(processor_costs\|2.*cost.of.loading.integer\|2.*cost.of.storing.integer\)'
> >  x86-tune-costs.h
> > struct processor_costs ix86_size_cost = {/* costs for tuning for size */
> >   {2, 2, 2},                          /* cost of loading integer registers
> >   {2, 2, 2},                          /* cost of storing integer registers 
> > */
> >   {2, 2, 2},                          /* cost of loading integer registers
> >   {2, 2, 2},                          /* cost of storing integer registers 
> > */
> > struct processor_costs i386_cost = {  /* 386 specific costs */
> >   {2, 4, 2},                          /* cost of loading integer registers
> >   {2, 4, 2},                          /* cost of storing integer registers 
> > */
> >   {2, 4, 2},                          /* cost of loading integer registers
> >   {2, 4, 2},                          /* cost of storing integer registers 
> > */
> > struct processor_costs i486_cost = {  /* 486 specific costs */
> >   {2, 4, 2},                          /* cost of loading integer registers
> >   {2, 4, 2},                          /* cost of storing integer registers 
> > */
> >   {2, 4, 2},                          /* cost of loading integer registers
> >   {2, 4, 2},                          /* cost of storing integer registers 
> > */
> > struct processor_costs pentium_cost = {
> >   {2, 4, 2},                          /* cost of loading integer registers
> >   {2, 4, 2},                          /* cost of storing integer registers 
> > */
> >   {2, 4, 2},                          /* cost of loading integer registers
> >   {2, 4, 2},                          /* cost of storing integer registers 
> > */
> > struct processor_costs lakemont_cost = {
> >   {2, 4, 2},                          /* cost of loading integer registers
> >   {2, 4, 2},                          /* cost of storing integer registers 
> > */
> >   {2, 4, 2},                          /* cost of loading integer registers
> >   {2, 4, 2},                          /* cost of storing integer registers 
> > */
> > struct processor_costs pentiumpro_cost = {
> >   {2, 2, 2},                          /* cost of storing integer registers 
> > */
> >   {2, 2, 2},                          /* cost of storing integer registers 
> > */
> > struct processor_costs geode_cost = {
> >   {2, 2, 2},                          /* cost of loading integer registers
> >   {2, 2, 2},                          /* cost of storing integer registers 
> > */
> >   {2, 2, 2},                          /* cost of loading integer registers
> >   {2, 2, 2},                          /* cost of storing integer registers 
> > */
> > struct processor_costs k6_cost = {
> >   {2, 3, 2},                          /* cost of storing integer registers 
> > */
> >   {2, 3, 2},                          /* cost of storing integer registers 
> > */
>
> Hmm, this is bit odd, indeed.  ix86_register_move_cost return 2 for
> integer-integer and all costs should be relative to that to get
> meaningful register class preferences.
>
> This is even documented:
>
>   /* Start of register allocator costs.  integer->integer move cost is 2. */
>   4,                                 /* cost for loading QImode using movzbl 
> */
>   {2, 4, 2},                            /* cost of loading integer registers
>                                            in QImode, HImode and SImode.
>                                            Relative to reg-reg move (2).  */
>   {2, 4, 2},                            /* cost of storing integer registers 
> */
>
>
> Thus I think all loads/stores should be more expensive than that (at
> least by 1 since they are longer).  I can not claim it predates me since
> I added k6_cost.
>
>
> I will see how changing those costs to something more realistic changes
> the codegeon.  these costs were tuned for old RA and I do not think
> (possibly except for lakemont) they were retuned for IRA. But even old
> RA was comparing relative cost of a spill to reg-reg move...
>
> So the patch is OK without an assert.
> Honza

I will check it in tomorrow.

Thanks.

-- 
H.J.

Reply via email to