Tom de Vries wrote:

>       * ira-costs.c (ira_tune_allocno_costs): Use
>       ALLOCNO_CROSSED_CALLS_CLOBBERED_REGS to adjust costs.

In debugging PR 53864 on s390x-linux, I ran into a weird change in behavior
that occurs when the following part of this patch was checked in:

> -           if (ira_hard_reg_set_intersection_p (regno, mode, 
> call_used_reg_set)
> -               || HARD_REGNO_CALL_PART_CLOBBERED (regno, mode))
> -             cost += (ALLOCNO_CALL_FREQ (a)
> -                      * (ira_memory_move_cost[mode][rclass][0]
> -                         + ira_memory_move_cost[mode][rclass][1]));
> +           crossed_calls_clobber_regs
> +             = &(ALLOCNO_CROSSED_CALLS_CLOBBERED_REGS (a));
> +           if (ira_hard_reg_set_intersection_p (regno, mode,
> +                                                *crossed_calls_clobber_regs))
> +             {
> +               if (ira_hard_reg_set_intersection_p (regno, mode,
> +                                                    call_used_reg_set)
> +                   || HARD_REGNO_CALL_PART_CLOBBERED (regno, mode))
> +                 cost += (ALLOCNO_CALL_FREQ (a)
> +                          * (ira_memory_move_cost[mode][rclass][0]
> +                             + ira_memory_move_cost[mode][rclass][1]));
>  #ifdef IRA_HARD_REGNO_ADD_COST_MULTIPLIER
> -           cost += ((ira_memory_move_cost[mode][rclass][0]
> -                     + ira_memory_move_cost[mode][rclass][1])
> -                    * ALLOCNO_FREQ (a)
> -                    * IRA_HARD_REGNO_ADD_COST_MULTIPLIER (regno) / 2);
> +               cost += ((ira_memory_move_cost[mode][rclass][0]
> +                         + ira_memory_move_cost[mode][rclass][1])
> +                        * ALLOCNO_FREQ (a)
> +                        * IRA_HARD_REGNO_ADD_COST_MULTIPLIER (regno) / 2);
>  #endif
> +             }

Before that patch, this code would penalize all call-clobbered registers
(if the alloca is used across a call), and it would penalize *all* registers
in a target-dependent way if IRA_HARD_REGNO_ADD_COST_MULTIPLIER is defined;
the latter is completely independent of the presence of any calls.

However, after that patch, the IRA_HARD_REGNO_ADD_COST_MULTIPLIER penalty
is only applied for registers clobbered by calls in this function.  This
seems a completely unrelated change, and looks just wrong to me ...

Was this done intentionally or is this just an oversight?

Bye,
Ulrich

-- 
  Dr. Ulrich Weigand
  GNU/Linux compilers and toolchain
  ulrich.weig...@de.ibm.com

Reply via email to