ira: Add a target hook for callee-saved register cost scale

commit 3b9b8d6cfd
Author: Surya Kumari Jangala <jskumari@linux.ibm.com>
Date:   Tue Jun 25 08:37:49 2024 -0500

    ira: Scale save/restore costs of callee save registers with block frequency

scales the cost of saving/restoring a callee-save hard register in epilogue
and prologue with the entry block frequency, which, if not optimizing for
size, is 10000, for all targets.  As the result, callee-saved registers
may not be used to preserve local variable values across calls on some
targets, like x86.  Add a target hook for the callee-saved register cost
scale in epilogue and prologue used by IRA.  The default version of this
target hook returns 1 if optimizing for size, otherwise returns the entry
block frequency.  Add an x86 version of this target hook to restore the
old behavior prior to the above commit.

	PR rtl-optimization/111673
	PR rtl-optimization/115932
	PR rtl-optimization/116028
	PR rtl-optimization/117081
	PR rtl-optimization/117082
	PR rtl-optimization/118497
	* ira-color.cc (assign_hard_reg): Call the target hook for the
	callee-saved register cost scale in epilogue and prologue.
	* target.def (ira_callee_saved_register_cost_scale): New target
	hook.
	* targhooks.cc (default_ira_callee_saved_register_cost_scale):
	New.
	* targhooks.h (default_ira_callee_saved_register_cost_scale):
	Likewise.
	* config/i386/i386.cc (ix86_ira_callee_saved_register_cost_scale):
	New.
	(TARGET_IRA_CALLEE_SAVED_REGISTER_COST_SCALE): Likewise.
	* doc/tm.texi: Regenerated.
	* doc/tm.texi.in (TARGET_IRA_CALLEE_SAVED_REGISTER_COST_SCALE):
	New.

Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
This commit is contained in:
H.J. Lu 2025-02-02 07:10:55 +08:00
parent 5378627142
commit d3ff498c47
7 changed files with 43 additions and 2 deletions

View file

@ -20600,6 +20600,14 @@ ix86_class_likely_spilled_p (reg_class_t rclass)
return false;
}
/* Implement TARGET_IRA_CALLEE_SAVED_REGISTER_COST_SCALE. */
static int
ix86_ira_callee_saved_register_cost_scale (int)
{
return 1;
}
/* Return true if a set of DST by the expression SRC should be allowed.
This prevents complex sets of likely_spilled hard regs before split1. */
@ -27078,6 +27086,9 @@ ix86_libgcc_floating_mode_supported_p
#define TARGET_PREFERRED_OUTPUT_RELOAD_CLASS ix86_preferred_output_reload_class
#undef TARGET_CLASS_LIKELY_SPILLED_P
#define TARGET_CLASS_LIKELY_SPILLED_P ix86_class_likely_spilled_p
#undef TARGET_IRA_CALLEE_SAVED_REGISTER_COST_SCALE
#define TARGET_IRA_CALLEE_SAVED_REGISTER_COST_SCALE \
ix86_ira_callee_saved_register_cost_scale
#undef TARGET_VECTORIZE_BUILTIN_VECTORIZATION_COST
#define TARGET_VECTORIZE_BUILTIN_VECTORIZATION_COST \

View file

@ -3047,6 +3047,14 @@ A target hook which can change allocno class for given pseudo from
The default version of this target hook always returns given class.
@end deftypefn
@deftypefn {Target Hook} int TARGET_IRA_CALLEE_SAVED_REGISTER_COST_SCALE (int @var{hard_regno})
A target hook which returns the callee-saved register @var{hard_regno}
cost scale in epilogue and prologue used by IRA.
The default version of this target hook returns 1 if optimizing for
size, otherwise returns the entry block frequency.
@end deftypefn
@deftypefn {Target Hook} bool TARGET_LRA_P (void)
A target hook which returns true if we use LRA instead of reload pass.

View file

@ -2388,6 +2388,8 @@ in the reload pass.
@hook TARGET_IRA_CHANGE_PSEUDO_ALLOCNO_CLASS
@hook TARGET_IRA_CALLEE_SAVED_REGISTER_COST_SCALE
@hook TARGET_LRA_P
@hook TARGET_REGISTER_PRIORITY

View file

@ -2180,8 +2180,7 @@ assign_hard_reg (ira_allocno_t a, bool retry_p)
+ 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)));
* targetm.ira_callee_saved_register_cost_scale (hard_regno);
cost += add_cost;
full_cost += add_cost;
}

View file

@ -5714,6 +5714,18 @@ DEFHOOK
reg_class_t, (int, reg_class_t, reg_class_t),
default_ira_change_pseudo_allocno_class)
/* Scale of callee-saved register cost in epilogue and prologue used by
IRA. */
DEFHOOK
(ira_callee_saved_register_cost_scale,
"A target hook which returns the callee-saved register @var{hard_regno}\n\
cost scale in epilogue and prologue used by IRA.\n\
\n\
The default version of this target hook returns 1 if optimizing for\n\
size, otherwise returns the entry block frequency.",
int, (int hard_regno),
default_ira_callee_saved_register_cost_scale)
/* Return true if we use LRA instead of reload. */
DEFHOOK
(lra_p,

View file

@ -1305,6 +1305,14 @@ default_ira_change_pseudo_allocno_class (int regno ATTRIBUTE_UNUSED,
return cl;
}
int
default_ira_callee_saved_register_cost_scale (int)
{
return (optimize_size
? 1
: REG_FREQ_FROM_BB (ENTRY_BLOCK_PTR_FOR_FN (cfun)));
}
extern bool
default_lra_p (void)
{

View file

@ -173,6 +173,7 @@ extern void default_emit_call_builtin___clear_cache (rtx, rtx);
extern poly_int64 default_return_pops_args (tree, tree, poly_int64);
extern reg_class_t default_ira_change_pseudo_allocno_class (int, reg_class_t,
reg_class_t);
extern int default_ira_callee_saved_register_cost_scale (int);
extern bool default_lra_p (void);
extern int default_register_priority (int);
extern bool default_register_usage_leveling_p (void);