This is the mail archive of the
mailing list for the GCC project.
Re: [PATCH][AArch64] LR register not used in leaf functions
- From: Kugan <kugan dot vivekanandarajah at linaro dot org>
- To: Jiong Wang <jiong dot wang at arm dot com>, "gcc-patches at gcc dot gnu dot org" <gcc-patches at gcc dot gnu dot org>
- Cc: Marcus Shawcroft <Marcus dot Shawcroft at arm dot com>, Richard Earnshaw <Richard dot Earnshaw at arm dot com>
- Date: Wed, 01 Oct 2014 18:00:34 +1000
- Subject: Re: [PATCH][AArch64] LR register not used in leaf functions
- Authentication-results: sourceware.org; auth=none
- References: <54204387 dot 5090105 at linaro dot org> <54204727 dot 6080002 at arm dot com> <54272A2D dot 7030306 at linaro dot org> <542AC57A dot 20701 at arm dot com>
On 01/10/14 01:00, Jiong Wang wrote:
> On 27/09/14 22:20, Kugan wrote:
>> On 23/09/14 01:58, Jiong Wang wrote:
>>> On 22/09/14 16:43, Kugan wrote:
>>>> AArch64 has the same issue ARM had where the LR register was not
>>>> used in
>>>> leaf functions. This was reported in
>>>> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=42017. In AArch64, this
>>>> test-case need to be added with more live ranges for the need for the
>>>> LR_REGNUM. i.e test-case in the PR needs additional loops up to r31 for
>>>> the case AArch64 to see this.
>>>> The same fix (from the thread
>>>> https://gcc.gnu.org/ml/gcc-patches/2011-04/msg02191.html) which went
>>>> into ARM should apply to AArch64 as well. Regression tested on qemu for
>>>> aarch64-none-linux-gnu with no new regressions. Is this OK for trunk?
>>> This still be a partial fix. LR should be a caller-saved register free
>>> to use in case it's saved properly to across function call.
>> Indeed. This should be improved from the generic code. Right now, if a
>> hard register is used in EPILOGUE_USES, it conflicts with all the live
>> ranges till a call site kills. I think we should have this patch till
>> the generic code can be improved.
> below is my local patch. LR is treated as free register, and strictly
> following AArch64 ABI, frame should always be created, FP maintained
> properly if LR clobbered under -fno-omit-frame-pointer.
Thanks Jiong. Sorry I missed your point. As for the additions in your patch:
/* ... and any callee saved register that dataflow says is live. */
for (regno = R0_REGNUM; regno <= R30_REGNUM; regno++)
if (df_regs_ever_live_p (regno)
- && !call_used_regs[regno])
+ && (regno == R30_REGNUM
+ || !call_used_regs[regno]))
cfun->machine->frame.reg_offset[regno] = SLOT_REQUIRED;
AArch64 CALL_USED_REGISTERS defines R30_REGNUM to be zero. Therefore
shouldnât this be redundant?
for (regno = V0_REGNUM; regno <= V31_REGNUM; regno++)
@@ -4313,6 +4314,16 @@ aarch64_can_eliminate (const int from, const int to)
+ /* If we decided that we didn't need a leaf frame pointer but
+ LR in the function, then we'll want a frame pointer after all, so
+ prevent this elimination to ensure a frame pointer is used. */
+ if (to == STACK_POINTER_REGNUM
+ && flag_omit_leaf_frame_pointer
+ && df_regs_ever_live_p (LR_REGNUM))
+ return false;
aarch64_frame_pointer_required makes frame pointer needed when
flag_omit_leaf_frame_pointer and df_regs_ever_live_p (LR_REGNUM).
Is this addition still needed?