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
[email protected]