diff mbox

[AARCH64] Enable fuse-caller-save for AARCH64

Message ID 53A48438.6090101@mentor.com
State New
Headers show

Commit Message

Tom de Vries June 20, 2014, 6:58 p.m. UTC
On 19-06-14 20:41, Richard Henderson wrote:
> On 06/19/2014 11:25 AM, Tom de Vries wrote:
>> On 19-06-14 05:53, Richard Henderson wrote:
>>> On 06/01/2014 03:00 AM, Tom de Vries wrote:
>>>>> +aarch64_emit_call_insn (rtx pat)
>>>>> +{
>>>>> +  rtx insn = emit_call_insn (pat);
>>>>> +
>>>>> +  rtx *fusage = &CALL_INSN_FUNCTION_USAGE (insn);
>>>>> +  clobber_reg (fusage, gen_rtx_REG (word_mode, IP0_REGNUM));
>>>>> +  clobber_reg (fusage, gen_rtx_REG (word_mode, IP1_REGNUM));
>>> Actually, I'd like to know more about how this is supposed to work.
>>>
>>> Why are you only marking the two registers that would be used by a PLT entry,
>>> but not those clobbered by the ld.so trampoline, or indeed the unknown function
>>> that would be called from the PLT.
>>>
>>> Oh, I see, looking at the code we do actually follow the cgraph and make sure
>>> it is a direct call with a known destination.  So, in fact, it's only the
>>> registers that could be clobbered by ld branch islands (so these two are still
>>> correct for aarch64).
>>>
>>> This means the documentation is actually wrong when it mentions PLTs at all.
>>
>> Yes, if we go from the point of view that the
>> TARGET_CALL_FUSAGE_CONTAINS_NON_CALLEE_CLOBBERS hooks sole purpose is to enable
>> the fuse-caller-save optimization.
>>
>> How about this updated definition ? OK for trunk if re-testing on arm succeeds ?
>
> I did like the doc including mention of "stubs", because they're easy to
> forget.  How about
>
> Set to true if each call that binds to a local definition explicitly clobbers
> or sets all non-fixed registers modified by performing the call.  That is, by
> the call pattern itself, or by code that might be inserted by the linker
> (e.g. stubs, veneers, branch islands), but not including those modifiable by
> the callee.  The affected registers may be mentioned explicitly in the
> call pattern, or included as clobbers in CALL_INSN_FUNCTION_USAGE.
> The default version of this hook is set to false.  The purpose of this hook
> is to enable the fuse-caller-save optimization.
>
>

Looks good to me.  Bootstrapped and committed as attached.

Thanks,
- Tom
diff mbox

Patch

2014-06-20  Tom de Vries  <tom@codesourcery.com>

	* target.def (call_fusage_contains_non_callee_clobbers): Update
	definition.
	* doc/tm.texi: Regenerate.

diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi
index c272630..45281ae 100644
--- a/gcc/doc/tm.texi
+++ b/gcc/doc/tm.texi
@@ -4884,14 +4884,14 @@  Whether this target supports splitting the stack when the options described in @
 @cindex miscellaneous register hooks
 
 @deftypevr {Target Hook} bool TARGET_CALL_FUSAGE_CONTAINS_NON_CALLEE_CLOBBERS
-set to true if all the calls in the current function contain clobbers in
-CALL_INSN_FUNCTION_USAGE for the registers that are clobbered by the call
-rather than by the callee, and are not already set or clobbered in the call
-pattern.  Examples of such registers are registers used in PLTs and stubs,
-and temporary registers used in the call instruction but not present in the
-rtl pattern.  Another way to formulate it is the registers not present in the
-rtl pattern that are clobbered by the call assuming the callee does not
-clobber any register.  The default version of this hook is set to false.
+Set to true if each call that binds to a local definition explicitly
+clobbers or sets all non-fixed registers modified by performing the call.
+That is, by the call pattern itself, or by code that might be inserted by the
+linker (e.g. stubs, veneers, branch islands), but not including those
+modifiable by the callee.  The affected registers may be mentioned explicitly
+in the call pattern, or included as clobbers in CALL_INSN_FUNCTION_USAGE.
+The default version of this hook is set to false.  The purpose of this hook
+is to enable the fuse-caller-save optimization.
 @end deftypevr
 
 @node Varargs
diff --git a/gcc/target.def b/gcc/target.def
index e455211..ee250e6 100644
--- a/gcc/target.def
+++ b/gcc/target.def
@@ -5128,18 +5128,18 @@  FRAME_POINTER_REGNUM, ARG_POINTER_REGNUM, and the PIC_OFFSET_TABLE_REGNUM.",
  hook_void_bitmap)
 
 /* Targets should define this target hook to mark that non-callee clobbers are
-   present in CALL_INSN_FUNCTION_USAGE for all the calls in the current
-   function.  */
+   present in CALL_INSN_FUNCTION_USAGE for all the calls that bind to a local
+   definition.  */
 DEFHOOKPOD
 (call_fusage_contains_non_callee_clobbers,
- "set to true if all the calls in the current function contain clobbers in\n\
-CALL_INSN_FUNCTION_USAGE for the registers that are clobbered by the call\n\
-rather than by the callee, and are not already set or clobbered in the call\n\
-pattern.  Examples of such registers are registers used in PLTs and stubs,\n\
-and temporary registers used in the call instruction but not present in the\n\
-rtl pattern.  Another way to formulate it is the registers not present in the\n\
-rtl pattern that are clobbered by the call assuming the callee does not\n\
-clobber any register.  The default version of this hook is set to false.",
+ "Set to true if each call that binds to a local definition explicitly\n\
+clobbers or sets all non-fixed registers modified by performing the call.\n\
+That is, by the call pattern itself, or by code that might be inserted by the\n\
+linker (e.g. stubs, veneers, branch islands), but not including those\n\
+modifiable by the callee.  The affected registers may be mentioned explicitly\n\
+in the call pattern, or included as clobbers in CALL_INSN_FUNCTION_USAGE.\n\
+The default version of this hook is set to false.  The purpose of this hook\n\
+is to enable the fuse-caller-save optimization.",
  bool, 
  false)
 
-- 
1.9.1