On Wed, Jul 29, 2026 at 4:01 PM Jovan Dmitrovic
<[email protected]> wrote:
>
> The target_reg_cost plays a large part in the estimated cost for
> register pressure, but it should be the eventual spilling that
> has the most influence on the cost of storing/loading IV candidates and
> invariants.
>
> gcc/ChangeLog:
>
>         * tree-ssa-loop-ivopts.cc (ivopts_estimate_reg_pressure):
>         Remove target_reg_cost from the computation of register pressure.
>
> Signed-off-by: Jovan Dmitrović <[email protected]>
> ---
>  gcc/tree-ssa-loop-ivopts.cc | 11 +++--------
>  1 file changed, 3 insertions(+), 8 deletions(-)
>
> diff --git a/gcc/tree-ssa-loop-ivopts.cc b/gcc/tree-ssa-loop-ivopts.cc
> index 72f801a6fd89..ca06592190e0 100644
> --- a/gcc/tree-ssa-loop-ivopts.cc
> +++ b/gcc/tree-ssa-loop-ivopts.cc
> @@ -6093,22 +6093,17 @@ ivopts_estimate_reg_pressure (struct ivopts_data 
> *data, unsigned n_invs,
>      available_regs = available_regs - target_clobbered_regs;
>
>    /* If we have enough registers.  */
> -  if (regs_needed + target_res_regs < available_regs)
> +  if (regs_needed <= available_regs)
>      cost = 0;
> -  /* If close to running out of registers, try to preserve them.  */
> -  else if (regs_needed <= available_regs)
> -    cost = target_reg_cost [speed] * regs_needed;

So this already does two things - it changes "when we have enough registers",
excluding target_res_regs ("reserved for temporaries", constant 3(!)), and
the main part is that it does not cost "using a register" as cost.

I'm not sure why we factored in reg-reg move costs, so I think removing
makes sense.  If an addressing mode requires a fixed register to be
used then the AGU cost should include a move.

I think the patch is OK but please update the description and the
ChangeLog to mention you remove the target_res_regs "lose matching"
of having enough registers.  IMO for consistency, if we want to
preserve that, we should update 'regs_needed' with that.

Thanks,
Richard.

>    /* If we run out of available registers but the number of candidates
>       does not, we penalize extra registers using target_spill_cost.  */
>    else if (n_cands <= available_regs)
> -    cost = target_reg_cost [speed] * available_regs
> -          + target_spill_cost [speed] * (regs_needed - available_regs);
> +    cost = target_spill_cost [speed] * (regs_needed - available_regs);
>    /* If the number of candidates runs out available registers, we penalize
>       extra candidate registers using target_spill_cost * 2.  Because it is
>       more expensive to spill induction variable than invariant.  */
>    else
> -    cost = target_reg_cost [speed] * available_regs
> -          + target_spill_cost [speed] * (n_cands - available_regs) * 2
> +    cost = target_spill_cost [speed] * (n_cands - available_regs) * 2
>            + target_spill_cost [speed] * (regs_needed - n_cands);
>
>    return cost;
> --
> 2.34.1

Reply via email to