This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH][AArch64] LR register not used in leaf functions


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)

       return false;
     }
+  else
+    {
+      /* If we decided that we didn't need a leaf frame pointer but
then used
+	 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?

Thanks,
Kugan


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]