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?

-- 
H.J.

Reply via email to