ira: Consider modelling caller-save allocations as loop spills
authorRichard Sandiford <richard.sandiford@arm.com>
Mon, 10 Jan 2022 14:47:08 +0000 (14:47 +0000)
committerRichard Sandiford <richard.sandiford@arm.com>
Mon, 10 Jan 2022 14:47:08 +0000 (14:47 +0000)
commit01f3e6a40e7202310abbeb41c345d325bd69554f
tree6d8f6b63a55b2760ea02c3cb0eccc5cf6fc86d58
parent8e7a23728f66d2da88b47e34224410457fdefbf5
ira: Consider modelling caller-save allocations as loop spills

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.

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.
gcc/ira-build.c
gcc/ira-color.c
gcc/ira-costs.c
gcc/ira-int.h
gcc/testsuite/gcc.target/aarch64/reg-alloc-3.c [new file with mode: 0644]