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.