Command line: gcc -fschedule-insns vararg-1.c && ./a.out Testcase can be further reduced to: ----------- testcase.c ----------- int foo(int i, ...) { return i; } int main() { return foo(0, 0.0); } ---------------------------------- I am not sure the testcase is valid, but I can't find any proof it isn't. "If access to the varying arguments is desired, the called function shall declare an object (...) having type va_list." is the most related sentence in the C99 TC3 draft, but it doesn't say what to do when 'access to varying arguments isn't desired'.
Tested revisions: r157965 - crash 4.4.3 - crash 4.3.4, 4.2.4, 4.1.2, 3.4.6, 3.3.6 - OK Output: $ gcc-4.5.0-alpha20100401 -fschedule-insns testcase.c && ./a.out Segmentation fault The problem is unaligned access with movaps: foo: pushq %rbp # movq %rsp, %rbp #, pushq %rbx # subq $64, %rsp #, movzbl %al, %eax #, tmp61 leaq -9(%rbp), %rbx #, tmp62 ... movaps %xmm0, -127(%rbx) #, access is aligned to 8-byte boundary, not 16-byte when -fschedule-insns is not used, "leaq -9(%rbp), %rbx" is changed to "leaq -1(%rbp), %rdx", and the access is aligned correctly -- Summary: -fschedule-insns causes FAIL: gcc.target/i386/vararg-1.c execution test Product: gcc Version: 4.5.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: target AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: zsojka at seznam dot cz GCC host triplet: x86_64-pc-linux-gnu GCC target triplet: x86_64-pc-linux-gnu http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43668