Don't increase callee-saved register cost by 1000x, which leads to that callee-saved registers aren't used to preserve local variable values across calls, by capping the scale to 300.
PR rtl-optimization/111673 PR rtl-optimization/115932 PR rtl-optimization/116028 PR rtl-optimization/117081 PR rtl-optimization/118497 * ira-color.cc (assign_hard_reg): Cap callee-saved register cost scale to 300. Signed-off-by: H.J. Lu <hjl.to...@gmail.com> --- gcc/ira-color.cc | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/gcc/ira-color.cc b/gcc/ira-color.cc index 0699b349a1a..707ff188250 100644 --- a/gcc/ira-color.cc +++ b/gcc/ira-color.cc @@ -2175,13 +2175,25 @@ assign_hard_reg (ira_allocno_t a, bool retry_p) /* We need to save/restore the hard register in epilogue/prologue. Therefore we increase the cost. */ { + int scale; + if (optimize_size) + scale = 1; + else + { + scale = REG_FREQ_FROM_BB (ENTRY_BLOCK_PTR_FOR_FN (cfun)); + /* Don't increase callee-saved register cost by 1000x, + which leads to that callee-saved registers aren't + used to preserve local variable values across calls, + by capping the scale to 300. */ + if (REG_FREQ_MAX == 1000 && scale == REG_FREQ_MAX) + scale = 300; + } rclass = REGNO_REG_CLASS (hard_regno); add_cost = ((ira_memory_move_cost[mode][rclass][0] + ira_memory_move_cost[mode][rclass][1]) * saved_nregs / hard_regno_nregs (hard_regno, mode) - 1) - * (optimize_size ? 1 : - REG_FREQ_FROM_BB (ENTRY_BLOCK_PTR_FOR_FN (cfun))); + * scale; cost += add_cost; full_cost += add_cost; } -- 2.48.1