http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55672



H.J. Lu <hjl.tools at gmail dot com> changed:



           What    |Removed                     |Added

----------------------------------------------------------------------------

          Component|target                      |rtl-optimization



--- Comment #8 from H.J. Lu <hjl.tools at gmail dot com> 2012-12-18 20:35:17 
UTC ---

(In reply to comment #4)

> If stack_realign_p is true, frame_pointer_needed is also true.   So we can use

> fp to eliminate frame but i386.c::x86_can_eliminate prohibits it.  The code

> looks strange:

> 

> 

>  if (stack_realign_fp)

>     return ((from == ARG_POINTER_REGNUM

>              && to == HARD_FRAME_POINTER_REGNUM)

>             || (from == FRAME_POINTER_REGNUM

>                 && to == STACK_POINTER_REGNUM));

> 

> So we permit to change argument pointer but not frame pointer to FP which 
> again

> is strange IMHO.   Changing the code to

> 

>  if (stack_realign_fp)

>     return ((from == ARG_POINTER_REGNUM

>              && to == HARD_FRAME_POINTER_REGNUM)

>             || (from == FRAME_POINTER_REGNUM

>                 && to == STACK_POINTER_REGNUM)

>             || (from == FRAME_POINTER_REGNUM

>                 && to == HARD_FRAME_POINTER_REGNUM));

> 

> solves the problem.



It fixes ICE, but generates questionable code:



main:

.LFB0:

    .cfi_startproc

    pushl    %ebp

    .cfi_def_cfa_offset 8

    .cfi_offset 5, -8

    movl    %esp, %ebp

    .cfi_def_cfa_register 5

    andl    $-16, %esp

    subl    $8236, %esp

    orl    $0, (%esp)

    addl    $8204, %esp

    cmpl    $4, -40(%ebp)

    je    .L2

    call    abort

.L2:

    movl    $0, %eax

    leave

    .cfi_restore 5

    .cfi_def_cfa 4, 4

    ret



Without LRA, we got



main:

.LFB0:

    .cfi_startproc

    pushl    %ebp

    .cfi_def_cfa_offset 8

    .cfi_offset 5, -8

    movl    %esp, %ebp

    .cfi_def_cfa_register 5

    andl    $-16, %esp

    subl    $8236, %esp

    orl    $0, (%esp)

    addl    $8204, %esp

    cmpl    $4, (%esp)

    je    .L2

    call    abort

.L2:

    movl    $0, %eax

    leave

    .cfi_restore 5

    .cfi_def_cfa 4, 4

    ret



The difference is



--- x.s    2012-12-18 12:24:17.072888139 -0800

+++ no-lra.s    2012-12-18 12:30:11.419157548 -0800

@@ -14,7 +14,7 @@ main:

     subl    $8236, %esp

     orl    $0, (%esp)

     addl    $8204, %esp

-    cmpl    $4, -40(%ebp)

+    cmpl    $4, (%esp)

     je    .L2

     call    abort

 .L2:



I think LRA generated code is wrong.  The reason we don't allow

converting software frame pointer to hardware frame pointer is

when stack alignment is needed, hardware frame pointer is used

to save stack pointer.  We can no longer use it for software

frame pointer.

Reply via email to