Using gcc 4.4.0 20090226 with -Os on:

int f(int a)
{
        if (!a) {
                return 0;
        } else {
                volatile int vla[a];
                vla[0] = 0;
                return vla[0];
        }
}

gives:
_f:
        pushl   %ebp
        xorl    %eax, %eax
        movl    %esp, %ebp
        subl    $8, %esp
        movl    8(%ebp), %edx
        testl   %edx, %edx
        je      L3
        movl    %esp, %ecx
        leal    30(,%edx,4), %eax
        andl    $-16, %eax
        subl    %eax, %esp
        leal    15(%esp), %eax
        andl    $-16, %eax
        movl    $0, (%eax)
        movl    (%eax), %eax
        movl    %ecx, %esp
L3:
        leave
        ret

Adding -fomit-frame-pointer gives the exact same result. ebp shouldn't be saved
here, since esp is saved to and restored from ecx anyway, so it's not actually
used for anything.

This isn't just a problem for crazy asm - gcc errors if an asm clobbers ebp in
a function with VLAs- but also means that inlining a function with VLAs makes
generated code worse, since the entire function loses one register.


-- 
           Summary: x86 use of VLA disables -fomit-frame-pointer
           Product: gcc
           Version: 4.4.0
            Status: UNCONFIRMED
          Severity: enhancement
          Priority: P3
         Component: target
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: astrange at ithinksw dot com
 GCC build triplet: i?86-*-*
  GCC host triplet: i?86-*-*
GCC target triplet: i?86-*-*


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

Reply via email to