diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2025-02-02 07:10:55 +0800 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2025-02-07 08:34:52 +0800 |
commit | d3ff498c478acefce35de04402f99171b4f64a1a (patch) | |
tree | 325bcbab93a464f79948c69555afa6de2f0de984 /gcc | |
parent | 5378627142fff79eea514ed7fb424c90ea94b75e (diff) | |
download | gcc-d3ff498c478acefce35de04402f99171b4f64a1a.zip gcc-d3ff498c478acefce35de04402f99171b4f64a1a.tar.gz gcc-d3ff498c478acefce35de04402f99171b4f64a1a.tar.bz2 |
ira: Add a target hook for callee-saved register cost scale
commit 3b9b8d6cfdf59337f4b7ce10ce92a98044b2657b
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>
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/config/i386/i386.cc | 11 | ||||
-rw-r--r-- | gcc/doc/tm.texi | 8 | ||||
-rw-r--r-- | gcc/doc/tm.texi.in | 2 | ||||
-rw-r--r-- | gcc/ira-color.cc | 3 | ||||
-rw-r--r-- | gcc/target.def | 12 | ||||
-rw-r--r-- | gcc/targhooks.cc | 8 | ||||
-rw-r--r-- | gcc/targhooks.h | 1 |
7 files changed, 43 insertions, 2 deletions
diff --git a/gcc/config/i386/i386.cc b/gcc/config/i386/i386.cc index f892016..3128973 100644 --- a/gcc/config/i386/i386.cc +++ b/gcc/config/i386/i386.cc @@ -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 \ diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi index 0de24ed..9f42913 100644 --- a/gcc/doc/tm.texi +++ b/gcc/doc/tm.texi @@ -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. diff --git a/gcc/doc/tm.texi.in b/gcc/doc/tm.texi.in index 631d041..6dbe225 100644 --- a/gcc/doc/tm.texi.in +++ b/gcc/doc/tm.texi.in @@ -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 diff --git a/gcc/ira-color.cc b/gcc/ira-color.cc index 0699b34..233060e 100644 --- a/gcc/ira-color.cc +++ b/gcc/ira-color.cc @@ -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; } diff --git a/gcc/target.def b/gcc/target.def index 4050b2e..c348b15 100644 --- a/gcc/target.def +++ b/gcc/target.def @@ -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, diff --git a/gcc/targhooks.cc b/gcc/targhooks.cc index f80dc8b..344075e 100644 --- a/gcc/targhooks.cc +++ b/gcc/targhooks.cc @@ -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) { diff --git a/gcc/targhooks.h b/gcc/targhooks.h index 7d15f63..8871e01 100644 --- a/gcc/targhooks.h +++ b/gcc/targhooks.h @@ -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); |