Re: [PATCH v3 3/3] ivopts: Adjust reg pressure estimate for spilling invariants compared to iv cands.

Richard Biener <[email protected]>
Newsgroups gmane.comp.gcc.patches
Message-ID <CAFiYyc2J+Ce-7JeZM+4FZrcAss3yT6frXsmnzKuWMdHcuDFGxg@mail.gmail.com>
On Wed, Jul 29, 2026 at 4:01 PM Jovan Dmitrovic
<[email protected]> wrote:
>
> Currently, ivopt calculates register pressure cost so that the cost of
> spilling induction variables is exactly double the cost of spilling
> loop invariants, which is not exactly right.
> When invariants are spilled, only loading the invariant back to
> registers should be taken into account, as we don't need to save them
> more than once. This isn't the case for IV candidates which have to
> be both loaded and stored for each iteration of the loop.

OK.

Thanks,
Richard.

> gcc/ChangeLog:
>
>         * tree-ssa-loop-ivopts.cc (ivopts_estimate_reg_pressure):
>         Change register pressure estimate in order to respect
>         the impact of spilling induction variables, compared
>         to spilling loop invariants.
>
> Co-authored-by: Radosav Krunić <[email protected]>
> Signed-off-by: Djordje Todorović <[email protected]>
> Signed-off-by: Chao-Ying Fu <[email protected]>
> Signed-off-by: Jovan Dmitrović <[email protected]>
> Signed-off-by: Radosav Krunić <[email protected]>
> ---
>  gcc/tree-ssa-loop-ivopts.cc | 16 +++++++++-------
>  1 file changed, 9 insertions(+), 7 deletions(-)
>
> diff --git a/gcc/tree-ssa-loop-ivopts.cc b/gcc/tree-ssa-loop-ivopts.cc
> index ca06592190e0..40413c46f1b2 100644
> --- a/gcc/tree-ssa-loop-ivopts.cc
> +++ b/gcc/tree-ssa-loop-ivopts.cc
> @@ -6096,15 +6096,17 @@ ivopts_estimate_reg_pressure (struct ivopts_data *data, unsigned n_invs,
>    if (regs_needed <= available_regs)
>      cost = 0;
>    /* If we run out of available registers but the number of candidates
> -     does not, we penalize extra registers using target_spill_cost.  */
> +     does not, we penalize extra registers using target_spill_cost.
> +     As we tend to spill invariants here, only take loading the
> +     invariant into account, because the invariant won't change for the
> +     duration of the loop and storing it every iteration is unnecessary. */
>    else if (n_cands <= 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.  */
> +    cost = target_spill_cost [speed] * (regs_needed - available_regs) / 2;
> +  /* If both IV cands and invariants spill, calculate additional cost for
> +     having to store spilled candidates. */
>    else
> -    cost = target_spill_cost [speed] * (n_cands - available_regs) * 2
> -          + target_spill_cost [speed] * (regs_needed - n_cands);
> +    cost = target_spill_cost [speed] * (regs_needed - available_regs) / 2;
> +               + target_spill_cost[speed] * (n_cands - available_regs) / 2;
>
>    return cost;
>  }
> --
> 2.34.1
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.