On Wed, Aug 29, 2018 at 5:43 PM, H.J. Lu <hjl.to...@gmail.com> wrote:
> On Wed, Aug 29, 2018 at 2:17 PM, Jason Merrill <ja...@redhat.com> wrote:
>> On Wed, Aug 29, 2018 at 3:38 PM, H.J. Lu <hjl.to...@gmail.com> wrote:
>>> On Wed, Aug 29, 2018 at 12:32 PM, Jason Merrill <ja...@redhat.com> wrote:
>>>> On Wed, Aug 29, 2018 at 2:59 PM, H.J. Lu <hjl.to...@gmail.com> wrote:
>>>>> On Wed, Aug 29, 2018 at 11:33 AM, Jason Merrill <ja...@redhat.com> wrote:
>>>>>> On Wed, Aug 29, 2018 at 8:47 AM, H.J. Lu <hjl.to...@gmail.com> wrote:
>>>>>>> On Wed, Aug 8, 2018 at 6:32 AM, H.J. Lu <hjl.to...@gmail.com> wrote:
>>>>>>>> Assert for SUPPORTS_STACK_ALIGNMENT was added for dynamic stack
>>>>>>>> alignment.  At the time, arg_pointer_rtx would only be eliminated
>>>>>>>> by either hard_frame_pointer_rtx or stack_pointer_rtx only when
>>>>>>>> dynamic stack alignment is supported.  With
>>>>>>>>
>>>>>>>> commit cd557ff63f388ad27c376d0a225e74d3594a6f9d
>>>>>>>> Author: hjl <hjl@138bc75d-0d04-0410-961f-82ee72b054a4>
>>>>>>>> Date:   Thu Aug 10 15:29:05 2017 +0000
>>>>>>>>
>>>>>>>>     i386: Don't use frame pointer without stack access
>>>>>>>>
>>>>>>>>     When there is no stack access, there is no need to use frame 
>>>>>>>> pointer
>>>>>>>>     even if -fno-omit-frame-pointer is used and caller's frame pointer 
>>>>>>>> is
>>>>>>>>     unchanged.
>>>>>>>>
>>>>>>>> this can happen when there is no dynamic stack alignment.  This patch
>>>>>>>> relaxes SUPPORTS_STACK_ALIGNMENT with !crtl->stack_realign_tried to
>>>>>>>> allow arg_pointer_rtx to be eliminated by either hard_frame_pointer_rtx
>>>>>>>> or stack_pointer_rtx when there is no dynamic stack alignment at all.
>>>>>>>>
>>>>>>>> gcc/
>>>>>>>>
>>>>>>>>         PR debug/86593
>>>>>>>>         * dwarf2out.c (based_loc_descr): Replace 
>>>>>>>> SUPPORTS_STACK_ALIGNMENT
>>>>>>>>         with (SUPPORTS_STACK_ALIGNMENT || !crtl->stack_realign_tried).
>>>>>>>>         (compute_frame_pointer_to_fb_displacement): Likewise.
>>>>>>>>
>>>>>>>> gcc/testsuite/
>>>>>>>>
>>>>>>>>         PR debug/86593
>>>>>>>>         * g++.dg/pr86593.C: New test.
>>>>>>>>
>>>>>>>
>>>>>>> PING:
>>>>>>>
>>>>>>> https://gcc.gnu.org/ml/gcc-patches/2018-08/msg00559.html
>>>>>>
>>>>>> It looks like crtl->stack_realign_tried is only ever set if
>>>>>> SUPPORTS_STACK_ALIGNMENT, so (SUPPORTS_STACK_ALIGNMENT ||
>>>>>> !crtl->stack_realign_tried) is always true.
>>>>>>
>>>>>> If you don't need to use the frame pointer, then frame_pointer_needed
>>>>>> should be false, so the assert should already allow elimination to the
>>>>>
>>>>> frame_pointer_needed is false:
>>>>>
>>>>> (gdb) p elim
>>>>> $1 = (rtx) 0x7fffeadd0390
>>>>> (gdb) call debug_rtx (elim)
>>>>> (reg/f:DI 6 bp)
>>>>> (gdb) call debug_rtx (reg)
>>>>> (reg/f:DI 16 argp)
>>>>> (gdb) p x_rtl.frame_pointer_needed
>>>>> $2 = false
>>>>> (gdb)
>>>>>
>>>>>> stack pointer.  Are we trying to eliminate to the hard frame pointer
>>>>>> even though we've decided we don't need it?  Why?
>>>>>
>>>>> In this case, we are trying to eliminate argp to the hard frame pointer.
>>>>
>>>> Right, but why are we trying to do that when frame_pointer_needed is false?
>>>
>>> With
>>>
>>> commit cd557ff63f388ad27c376d0a225e74d3594a6f9d
>>> Author: hjl <hjl@138bc75d-0d04-0410-961f-82ee72b054a4>
>>> Date:   Thu Aug 10 15:29:05 2017 +0000
>>>
>>>     i386: Don't use frame pointer without stack access
>>>
>>>     When there is no stack access, there is no need to use frame pointer
>>>     even if -fno-omit-frame-pointer is used and caller's frame pointer is
>>>     unchanged.
>>>
>>> we may skip frame pointer when there is no stack access even if
>>> -fno-omit-frame-pointer is used.  Here argp is only referenced
>>> in debug info, not in the function body.  In this case, what else
>>> can argp be eliminated to in debug info?
>>
>> SP or CFA?
>>
>> If the function body doesn't set the hard frame pointer register, then
>> we can't rely on it having a useful value, so we shouldn't refer to it
>> in debug info.
>
> There are:
>
>                     (SUPPORTS_STACK_ALIGNMENT
>                        && (elim == hard_frame_pointer_rtx
>                            || elim == stack_pointer_rtx))
>
> When there is no stack realignment, SUPPORTS_STACK_ALIGNMENT
> isn't relevant.  Why can't elim be hard_frame_pointer_rtx?

That change (by you, in r138335) looks to have been made to allow
eliminating to SP even when frame_pointer_needed, which is the
opposite of the current situation.  And which could be expressed as

gcc_assert (elim == stack_pointer_rtx || (frame_pointer_needed && elim
== hard_frame_pointer_rtx));

so as not to allow eliminating to an uninitialized FP.

Jason

Reply via email to