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.