https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78936
Bug ID: 78936 Summary: Interprocedural constant propagation miscompiles C++ methods on i686 Windows Product: gcc Version: unknown Status: UNCONFIRMED Severity: normal Priority: P3 Component: target Assignee: unassigned at gcc dot gnu.org Reporter: rnk at google dot com Target Milestone: --- The following test case has an issue where some interprocedural optimziation in GCC 6.2.0 appears to have mixed up the calling convention of a C++ thiscall method: https://drive.google.com/open?id=0B5-KodWdXF4YZ1pVczVQX0tiOGM When I compile the linked file like so, I get the following assembly snippets, which seem to corrupt the stack pointer: $ g++ -O2 llvm-subtarget-emitter.cpp -S -o t.s $ c++filt < t.s | less ... (anonymous namespace)::SubtargetEmitter::EmitProcessorProp(llvm::raw_ostream&, llvm::Record const*, llvm::StringRef, char) [clone .constprop.544]: ... addl $28, %esp .cfi_remember_state .cfi_def_cfa_offset 20 popl %ebx .cfi_restore 3 .cfi_def_cfa_offset 16 popl %esi .cfi_restore 6 .cfi_def_cfa_offset 12 popl %edi .cfi_restore 7 .cfi_def_cfa_offset 8 popl %ebp .cfi_restore 5 .cfi_def_cfa_offset 4 ret .p2align 4,,10 ... (anonymous namespace)::SubtargetEmitter::EmitSchedModel(llvm::raw_ostream&): ... call (anonymous namespace)::SubtargetEmitter::EmitProcessorProp(llvm::raw_ostream&, llvm::Record const*, llvm::StringRef, char) [clone .constprop.544] movl 28(%edi), %edx movl 8(%ebp), %eax subl $8, %esp movl $LC170, (%esp) movl $17, 4(%esp) call (anonymous namespace)::SubtargetEmitter::EmitProcessorProp(llvm::raw_ostream&, llvm::Record const*, llvm::StringRef, char) [clone .constprop.544] movl 28(%edi), %edx movl 8(%ebp), %eax subl $8, %esp ... Note that the "ret" instruction doesn't match the "sub $8, %esp" instructions after the call sites of SubtargetEmitter::EmitProcessorProp. The callee-cleanup property of the EmitProcessorProp clone seems to have been lost, or the call site hasn't been updated to treat it as a caller cleanup call. This issue was encountered while building LLVM with the latest GCC provided by mingw-w64: http://lists.llvm.org/pipermail/cfe-dev/2016-December/051980.html $ g++ --version g++.exe (i686-posix-dwarf-rev1, Built by MinGW-W64 project) 6.2.0 Copyright (C) 2016 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.