diff options
author | Richard Sandiford <richard.sandiford@arm.com> | 2023-11-11 17:28:58 +0000 |
---|---|---|
committer | Richard Sandiford <richard.sandiford@arm.com> | 2023-11-11 17:28:58 +0000 |
commit | 29d3e1892ebec8abce784077d1f1a3e21d763218 (patch) | |
tree | 1af3eb0dee38cebde16257775b58d33cace18489 /gcc/config/epiphany | |
parent | 4b803fbf839439b1deca660e32d5ced211111dfa (diff) | |
download | gcc-29d3e1892ebec8abce784077d1f1a3e21d763218.zip gcc-29d3e1892ebec8abce784077d1f1a3e21d763218.tar.gz gcc-29d3e1892ebec8abce784077d1f1a3e21d763218.tar.bz2 |
mode-switching: Pass set of live registers to the needed hook
The emit hook already takes the set of live hard registers as input.
This patch passes it to the needed hook too. SME uses this to
optimise the mode choice based on whether state is live or dead.
The main caller already had access to the required info, but the
special handling of return values did not.
gcc/
* target.def (mode_switching.needed): Add a regs_live parameter.
* doc/tm.texi: Regenerate.
* config/epiphany/epiphany-protos.h (epiphany_mode_needed): Update
accordingly.
* config/epiphany/epiphany.cc (epiphany_mode_needed): Likewise.
* config/epiphany/mode-switch-use.cc (insert_uses): Likewise.
* config/i386/i386.cc (ix86_mode_needed): Likewise.
* config/riscv/riscv.cc (riscv_mode_needed): Likewise.
* config/sh/sh.cc (sh_mode_needed): Likewise.
* mode-switching.cc (optimize_mode_switching): Likewise.
(create_pre_exit): Likewise, using the DF simulate functions
to calculate the required information.
Diffstat (limited to 'gcc/config/epiphany')
-rw-r--r-- | gcc/config/epiphany/epiphany-protos.h | 4 | ||||
-rw-r--r-- | gcc/config/epiphany/epiphany.cc | 2 | ||||
-rw-r--r-- | gcc/config/epiphany/mode-switch-use.cc | 2 |
3 files changed, 5 insertions, 3 deletions
diff --git a/gcc/config/epiphany/epiphany-protos.h b/gcc/config/epiphany/epiphany-protos.h index 72c141c..ef49a1e 100644 --- a/gcc/config/epiphany/epiphany-protos.h +++ b/gcc/config/epiphany/epiphany-protos.h @@ -44,7 +44,9 @@ extern void emit_set_fp_mode (int entity, int mode, int prev_mode, #endif extern void epiphany_insert_mode_switch_use (rtx_insn *insn, int, int); extern void epiphany_expand_set_fp_mode (rtx *operands); -extern int epiphany_mode_needed (int entity, rtx_insn *insn); +#ifdef HARD_CONST +extern int epiphany_mode_needed (int entity, rtx_insn *insn, HARD_REG_SET); +#endif extern int epiphany_mode_after (int entity, int last_mode, rtx_insn *insn); extern bool epiphany_epilogue_uses (int regno); extern bool epiphany_optimize_mode_switching (int entity); diff --git a/gcc/config/epiphany/epiphany.cc b/gcc/config/epiphany/epiphany.cc index a5460db..60a9b49 100644 --- a/gcc/config/epiphany/epiphany.cc +++ b/gcc/config/epiphany/epiphany.cc @@ -2400,7 +2400,7 @@ epiphany_mode_priority (int entity, int priority) } int -epiphany_mode_needed (int entity, rtx_insn *insn) +epiphany_mode_needed (int entity, rtx_insn *insn, HARD_REG_SET) { enum attr_fp_mode mode; diff --git a/gcc/config/epiphany/mode-switch-use.cc b/gcc/config/epiphany/mode-switch-use.cc index 7153061..183b9b7 100644 --- a/gcc/config/epiphany/mode-switch-use.cc +++ b/gcc/config/epiphany/mode-switch-use.cc @@ -58,7 +58,7 @@ insert_uses (void) { if (!INSN_P (insn)) continue; - mode = epiphany_mode_needed (e, insn); + mode = epiphany_mode_needed (e, insn, {}); if (mode == no_mode) continue; if (target_insert_mode_switch_use) |