When a variable length array is defined in a loop, and its size is
specified with a const variable, gcc -O3 (and -Os) produces a call of
alloca() without specifying the size argument (eax in my case). This
causes stack overflow.

$ cat test.c
int const n = 4096;
void g(int* p);
void f() { for(;;) { int a[n]; g(a); } }

$ gcc -S -O3 -o - test.c
(snip)
.globl _f
        .def    _f;     .scl    2;      .type   32;     .endef
_f:
        pushl   %ebp
        movl    %esp, %ebp
        pushl   %esi
        pushl   %ebx
        subl    $16, %esp
        .p2align 4,,7
L2:
        movl    %esp, %ebx
        call    __alloca
(snip)

$ gcc -v
Using built-in specs.
Target: i686-pc-cygwin
Configured with:
  /gnu/gcc/releases/packaging/4.3.4-3/gcc4-4.3.4-3/src/gcc-4.3.4/configure
  --srcdir=/gnu/gcc/releases/packaging/4.3.4-3/gcc4-4.3.4-3/src/gcc-4.3.4
  --prefix=/usr --exec-prefix=/usr --bindir=/usr/bin --sbindir=/usr/sbin
  --libexecdir=/usr/lib --datadir=/usr/share --localstatedir=/var
  --sysconfdir=/etc --infodir=/usr/share/info --mandir=/usr/share/man
  --datadir=/usr/share --infodir=/usr/share/info --mandir=/usr/share/man
  -v --with-gmp=/usr --with-mpfr=/usr --enable-bootstrap
  --enable-version-specific-runtime-libs --with-slibdir=/usr/bin
  --libexecdir=/usr/lib --enable-static --enable-shared
  --enable-shared-libgcc --disable-__cxa_atexit --with-gnu-ld
  --with-gnu-as --with-dwarf2 --disable-sjlj-exceptions
  --enable-languages=ada,c,c++,fortran,java,objc,obj-c++
  --disable-symvers --enable-libjava --program-suffix=-4
  --enable-libgomp --enable-libssp --enable-libada
  --enable-threads=posix --with-arch=i686 --with-tune=generic
  --enable-libgcj-sublibs CC=gcc-4 CXX=g++-4 CC_FOR_TARGET=gcc-4
  CXX_FOR_TARGET=g++-4 GNATMAKE_FOR_TARGET=gnatmake
  GNATBIND_FOR_TARGET=gnatbind AS=/opt/gcc-tools/bin/as.exe
  AS_FOR_TARGET=/opt/gcc-tools/bin/as.exe LD=/opt/gcc-tools/bin/ld.exe
  LD_FOR_TARGET=/opt/gcc-tools/bin/ld.exe
  --with-ecj-jar=/usr/share/java/ecj.jar
Thread model: posix
gcc version 4.3.4 20090804 (release) 1 (GCC)


-- 
           Summary: VLA in a loop with a const size causes wrong
                    optimization
           Product: gcc
           Version: 4.3.4
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: k_satoda at f2 dot dion dot ne dot jp


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

Reply via email to