This is the mail archive of the
mailing list for the GCC project.
Re: RFC: lra-constraints.c and TARGET_HARD_REGNO_CALL_PART_CLOBBERED question/patch
- From: Jeff Law <law at redhat dot com>
- To: sellcey at cavium dot com, gcc-patches <gcc-patches at gcc dot gnu dot org>
- Date: Wed, 11 Jul 2018 15:54:32 -0600
- Subject: Re: RFC: lra-constraints.c and TARGET_HARD_REGNO_CALL_PART_CLOBBERED question/patch
- References: <firstname.lastname@example.org>
On 07/11/2018 02:07 PM, Steve Ellcey wrote:
> I have a reload/register allocation question and possible patch. While
> working on the Aarch64 SIMD ABI I ran into a problem where GCC was
> saving and restoring registers that it did not need to. I tracked it
> down to lra-constraints.c and its use of
> targetm.hard_regno_call_part_clobbered on instructions that are not
> calls. Specifically need_for_call_save_p would check this macro even
> when the instruction in question (unknown to need_for_call_save_p)
> was not a call instruction.
> This seems wrong to me and I was wondering if anyone more familiar
> with the register allocator and reload could look at this patch and
> tell me if it seems reasonable or not. It passed bootstrap and I
> am running tests now. I am just wondering if there is any reason why
> this target function would need to be called on non-call instructions
> or if doing so is just an oversight/bug.
> Steve Ellcey
>  https://gcc.gnu.org/ml/gcc/2018-07/msg00012.html
> 2018-07-11 Steve Ellcey <email@example.com>
> * lra-constraints.c (need_for_call_save_p): Add insn argument
> and only check targetm.hard_regno_call_part_clobbered on calls.
> (need_for_split_p): Add insn argument, pass to need_for_call_save_p.
> (split_reg): Pass insn to need_for_call_save_p.
> (split_if_necessary): Pass curr_insn to need_for_split_p.
> (inherit_in_ebb): Ditto.
Various target have calls which are exposed as INSNs rather than as
CALL_INSNs. So we need to check that hook on all insns.
You can probably see this in action with the TLS insns on aarch64.