https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103252

--- Comment #14 from Hongtao.liu <crazylht at gmail dot com> ---
(In reply to Hongtao.liu from comment #13)
> > 
> > So for short live range reg, we may lose opportunity to allocate best
> > regclass, maybe add peephole2 to handle those cases instead of tune RA.
> No, r132 is also used as addr, but currently lra only add cost of movement
> from  mask to gpr, but we could possibly run out of gpr which means there
> will be an extra spill, and this is not counted by record_address_regs.
> 
> modified   gcc/ira-costs.c
> @@ -1226,7 +1226,7 @@ record_address_regs (machine_mode mode, addr_space_t
> as, rtx x,
>       struct costs *pp;
>       int *pp_costs;
>       enum reg_class i;
> -     int k, regno, add_cost;
> +     int k, regno, add_cost, potential_spill_cost;
>       cost_classes_t cost_classes_ptr;
>       enum reg_class *cost_classes;
>       move_table *move_in_cost;
> @@ -1239,6 +1239,7 @@ record_address_regs (machine_mode mode, addr_space_t
> as, rtx x,
>         ALLOCNO_BAD_SPILL_P (ira_curr_regno_allocno_map[regno]) = true;
>       pp = COSTS (costs, COST_INDEX (regno));
>       add_cost = (ira_memory_move_cost[Pmode][rclass][1] * scale) / 2;
> +     potential_spill_cost = add_cost / 5;
>       if (INT_MAX - add_cost < pp->mem_cost)
>         pp->mem_cost = INT_MAX;
>       else
> @@ -1252,6 +1253,10 @@ record_address_regs (machine_mode mode, addr_space_t
> as, rtx x,
>         {
>           i = cost_classes[k];
>           add_cost = (move_in_cost[i][rclass] * scale) / 2;
> +         /* If we run out of rclass regs, there could be an extra spill,
> +            Let's say 20% possibility.  */
> +         if (!ira_class_subset_p[i][rclass])
> +           add_cost += potential_spill_cost;
>           if (INT_MAX - add_cost < pp_costs[k])
>             pp_costs[k] = INT_MAX;

Increase cost will lose some spill to mask opportunity like testcase
https://gcc.godbolt.org/z/KG63ErzEr

Reply via email to