http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56807
Bug #: 56807 Summary: mingw32: Conflict between stack realignment and stack probe destroys function argument in EAX Classification: Unclassified Product: gcc Version: 4.7.2 Status: UNCONFIRMED Severity: normal Priority: P3 Component: target AssignedTo: unassig...@gcc.gnu.org ReportedBy: achurch+...@achurch.org When compiling for mingw32 with an incoming stack boundary less than the preferred stack boundary, if a non-leaf function with a large (>4000 bytes) stack size takes arguments in registers, the first argument may be destroyed depending on the actual stack alignment: 00000000 <_bar>: 0: 55 push %ebp 1: 89 e5 mov %esp,%ebp 3: 83 e4 f0 and $0xfffffff0,%esp 6: 50 push %eax 7: b8 1c 10 00 00 mov $0x101c,%eax c: e8 00 00 00 00 call 11 <_bar+0x11> d: DISP32 ___chkstk_ms 11: 29 c4 sub %eax,%esp 13: 8b 45 f4 mov -0xc(%ebp),%eax Note that the stack realignment (at 3) takes place after the frame pointer is saved (at 1) but before the first argument is pushed to the stack (at 6), so the offset from the frame pointer to the saved first argument is unknown, yet GCC tries to reload the argument using the frame pointer as a base (at 13). If the stack is not aligned to a multiple of 16 bytes before the function is called, the reload will get some random value from the stack instead of the first argument. Configure options: --prefix=/usr --bindir=/usr/i686-pc-linux-gnu/mingw32/gcc-bin/4.7.2 --includedir=/usr/lib/gcc/mingw32/4.7.2/include --datadir=/usr/share/gcc-data/mingw32/4.7.2 --mandir=/usr/share/gcc-data/mingw32/4.7.2/man --infodir=/usr/share/gcc-data/mingw32/4.7.2/info --with-gxx-include-dir=/usr/lib/gcc/mingw32/4.7.2/include/g++-v4 --host=i686-pc-linux-gnu --target=mingw32 --build=i686-pc-linux-gnu --disable-altivec --disable-fixed-point --without-ppl --without-cloog --enable-lto --disable-nls --with-system-zlib --enable-obsolete --disable-werror --enable-secureplt --disable-multilib --disable-libmudflap --disable-libssp --disable-libgomp --with-python-dir=/share/gcc-data/mingw32/4.7.2/python --enable-poison-system-directories --enable-checking=release --disable-libgcj --enable-libstdcxx-time --disable-libquadmath --enable-languages=c,c++ --with-sysroot=/usr/mingw32