[Bug rtl-optimization/47581] New: [4.6 regression] Unnecessary adjustments to stack pointer

tony.poppleton at gmail dot com gcc-bugzilla@gcc.gnu.org
Tue Feb 1 21:27:00 GMT 2011


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

           Summary: [4.6 regression] Unnecessary adjustments to stack
                    pointer
           Product: gcc
           Version: 4.6.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: rtl-optimization
        AssignedTo: unassigned@gcc.gnu.org
        ReportedBy: tony.poppleton@gmail.com


Whilst investigating PR4079 (which affects PPC), I found some strange
adjustments to the stack pointer when compiling with 4.6.0 (20110129) on x86.

For reference, the C code from that PR is:

unsigned mulh(unsigned a, unsigned b)
{
        return ((unsigned long long)a * (unsigned long long)b) >> 32;
}

On 4.5.2 using "-O2 -m32 -fomit-frame-pointer", this produced the following
succinct code:
mulh:
        movl    8(%esp), %eax
        mull    4(%esp)
        movl    %edx, %eax
        ret
        .size   mulh, .-mulh
        .ident  "GCC: (GNU) 4.5.2"

However on 4.6.0 with the same arguments:
mulh:
.LFB0:
        .cfi_startproc
        subl    $4, %esp           <== isn't this unnecessary?
        .cfi_def_cfa_offset 8
        movl    12(%esp), %eax     <== this could just be 8(%esp)
        mull    8(%esp)            <== this could just be 4(%esp)
        addl    $4, %esp           <== isn't this unnecessary?
        .cfi_def_cfa_offset 4
        movl    %edx, %eax
        ret
        .cfi_endproc
.LFE0:
        .size   mulh, .-mulh
        .ident  "GCC: (GNU) 4.6.0 20110129 (experimental)"



More information about the Gcc-bugs mailing list