In reload1.c:order_regs_for_reload() we calculate the cost of each
register so that we can select which ones are used for spills.
However, the calculations do not in any way account for the cost of
each use of each register.

For the m32c port, there are registers in the chip and registers in
memory.  The memory ones are more expensive.  I've done all I can with
constraint preferences, but it doesn't always work out because of the
composite classes that reload needs (like A_REGS | MEM_REGS =
A_MEM_REGS) so reload ends up using the expensive registers.  For
--mcpu=m32c, most on-chip registers need to be saved if they're used,
but the memory ones don't, which further complicates the cost logic.

What I'd like to do is add a target hook that's called at the end of
order_regs_for_reload, passing either spill_cost itself or calling it
once for each hard reg to obtain extra costs to add in (multiply by?).
In my case, simply incrementing the cost by one is sufficient to
prefer cpu regs over mem regs in simple tests.

Suggestions?  Comments?  Objections?  Is there some other existing
cost metric I could use here?

Reply via email to