On 2022-01-06 09:48, Richard Sandiford wrote:
If an allocno A in an inner loop L spans a call, a parent allocno AP
can choose to handle a call-clobbered/caller-saved hard register R
in one of two ways:

(1) save R before each call in L and restore R after each call
(2) spill R to memory throughout L

(2) can be cheaper than (1) in some cases, particularly if L does
not reference A.

Before the patch we always did (1).  The patch adds support for
picking (2) instead, when it seems cheaper.  It builds on the
earlier support for not propagating conflicts to parent allocnos.
Another cost calculation improvement for calls would be taking into account that allocno can be saved and restored once for several subsequent calls (e.g. in one BB).
gcc/
        PR rtl-optimization/98782
        * ira-int.h (ira_caller_save_cost): New function.
        (ira_caller_save_loop_spill_p): Likewise.
        * ira-build.c (ira_propagate_hard_reg_costs): Test whether it is
        cheaper to spill a call-clobbered register throughout a loop rather
        than spill it around each individual call.  If so, treat all
        call-clobbered registers as conflicts and...
        (propagate_allocno_info): ...do not propagate call information
        from the child to the parent.
        * ira-color.c (move_spill_restore): Update accordingly.
        * ira-costs.c (ira_tune_allocno_costs): Use ira_caller_save_cost.

gcc/testsuite/
        * gcc.target/aarch64/reg-alloc-3.c: New test.
OK for me.  Thank you for the patch.

Reply via email to