From a1e6ee38e708ef2bdef4dfbb99473344bd56fa2f Mon Sep 17 00:00:00 2001
From: Richard Sandiford <richard.sandiford@arm.com>
Date: Mon, 30 Sep 2019 16:21:00 +0000
Subject: Remove global call sets: LRA

lra_reg has an actual_call_used_reg_set field that is only used during
inheritance.  This in turn required a special lra_create_live_ranges
pass for flag_ipa_ra to set up this field.  This patch instead makes
the inheritance code do its own live register tracking, using the
same ABI-mask-and-clobber-set pair as for IRA.

Tracking ABIs simplifies (and cheapens) the logic in lra-lives.c and
means we no longer need a separate path for -fipa-ra.  It also means
we can remove TARGET_RETURN_CALL_WITH_MAX_CLOBBERS.

The patch also strengthens the sanity check in lra_assigns so that
we check that reg_renumber is consistent with the whole conflict set,
not just the call-clobbered registers.

2019-09-30  Richard Sandiford  <richard.sandiford@arm.com>

gcc/
	* target.def (return_call_with_max_clobbers): Delete.
	* doc/tm.texi.in (TARGET_RETURN_CALL_WITH_MAX_CLOBBERS): Delete.
	* doc/tm.texi: Regenerate.
	* config/aarch64/aarch64.c (aarch64_return_call_with_max_clobbers)
	(TARGET_RETURN_CALL_WITH_MAX_CLOBBERS): Delete.
	* lra-int.h (lra_reg::actual_call_used_reg_set): Delete.
	(lra_reg::call_insn): Delete.
	* lra.c: Include function-abi.h.
	(initialize_lra_reg_info_element): Don't initialize the fields above.
	(lra): Use crtl->abi to test whether the current function needs to
	save a register in the prologue.  Remove special pre-inheritance
	lra_create_live_ranges pass for flag_ipa_ra.
	* lra-assigns.c: Include function-abi.h
	(find_hard_regno_for_1): Use crtl->abi to test whether the current
	function needs to save a register in the prologue.
	(lra_assign): Assert that registers aren't allocated to a
	conflicting register, rather than checking only for overlaps
	with call_used_or_fixed_regs.  Do this even for flag_ipa_ra,
	and for registers that are not live across a call.
	* lra-constraints.c (last_call_for_abi): New variable.
	(full_and_partial_call_clobbers): Likewise.
	(setup_next_usage_insn): Remove the register from
	full_and_partial_call_clobbers.
	(need_for_call_save_p): Use call_clobbered_in_region_p to test
	whether the register needs a caller save.
	(need_for_split_p): Use full_and_partial_reg_clobbers instead
	of call_used_or_fixed_regs.
	(inherit_in_ebb): Initialize and maintain last_call_for_abi and
	full_and_partial_call_clobbers.
	* lra-lives.c (check_pseudos_live_through_calls): Replace
	last_call_used_reg_set and call_insn arguments with an abi argument.
	Remove handling of lra_reg::call_insn.  Use function_abi::mode_clobbers
	as the set of conflicting registers.
	(calls_have_same_clobbers_p): Delete.
	(process_bb_lives): Track the ABI of the last call instead of an
	insn/HARD_REG_SET pair.  Update calls to
	check_pseudos_live_through_calls.  Use eh_edge_abi to calculate
	the set of registers that could be clobbered by an EH edge.
	Include partially-clobbered as well as fully-clobbered registers.
	(lra_create_live_ranges_1): Don't initialize lra_reg::call_insn.
	* lra-remat.c: Include function-abi.h.
	(call_used_regs_arr_len, call_used_regs_arr): Delete.
	(set_bb_regs): Use insn_callee_abi to get the set of call-clobbered
	registers and bitmap_view to combine them into dead_regs.
	(call_used_input_regno_present_p): Take a function_abi argument
	and use it to test whether a register is call-clobbered.
	(calculate_gen_cands): Use insn_callee_abi to get the ABI of the
	call insn target.  Update tje call to call_used_input_regno_present_p.
	(do_remat): Likewise.
	(lra_remat): Remove the initialization of call_used_regs_arr_len
	and call_used_regs_arr.

From-SVN: r276327
---
 gcc/target.def | 14 --------------
 1 file changed, 14 deletions(-)

(limited to 'gcc/target.def')

diff --git a/gcc/target.def b/gcc/target.def
index 3bdbb8d..1f011ed 100644
--- a/gcc/target.def
+++ b/gcc/target.def
@@ -5837,20 +5837,6 @@ for targets that don't have partly call-clobbered registers.",
  hook_bool_uint_uint_mode_false)
 
 DEFHOOK
-(return_call_with_max_clobbers,
- "This hook returns a pointer to the call that partially clobbers the\n\
-most registers.  If a platform supports multiple ABIs where the registers\n\
-that are partially clobbered may vary, this function compares two\n\
-calls and returns a pointer to the one that clobbers the most registers.\n\
-If both calls clobber the same registers, @var{call_1} must be returned.\n\
-\n\
-The registers clobbered in different ABIs must be a proper subset or\n\
-superset of all other ABIs.  @var{call_1} must always be a call insn,\n\
-call_2 may be NULL or a call insn.",
- rtx_insn *, (rtx_insn *call_1, rtx_insn *call_2),
- NULL)
-
-DEFHOOK
 (get_multilib_abi_name,
  "This hook returns name of multilib ABI name.",
  const char *, (void),
-- 
cgit v1.1

