> > 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

Reply via email to