http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50898
Bug #: 50898 Summary: Register allocation depends on function return expression on x86 32-bits Classification: Unclassified Product: gcc Version: 4.7.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: rtl-optimization AssignedTo: unassig...@gcc.gnu.org ReportedBy: izamya...@gmail.com Created attachment 25643 --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=25643 Testcase This problem has been noticed during investigation for PR50164. For attached test case allocator's assignment of registers in some piece of code depends on how return expression looks like. And it seems that there are no reasons for this. For attached case we have following code snippet obtained by fresh compiler: .L13: movzbl (%esi), %ecx leal 3(%esi), %ebp movb %cl, 48(%esp) notb 48(%esp) movzbl 1(%esi), %ecx movzbl 2(%esi), %ebx notl %ecx notl %ebx cmpb %cl, 48(%esp) movl %ebp, %esi movb %bl, 32(%esp) jb .L18 cmpb %cl, 32(%esp) movzbl 32(%esp), %ebx cmova %ecx, %ebx movl %ebx, %edi jmp .L10 But if return expression turn to "return 0" we will see following code which is actually more optimal: .L13: movzbl (%esi), %edx <--- edx is used instead of ecx leal 3(%esi), %ebp movzbl 1(%esi), %ecx notl %edx movzbl 2(%esi), %ebx notl %ecx notl %ebx cmpb %cl, %dl movl %ebp, %esi movb %dl, 48(%esp) movb %bl, 32(%esp) jb .L18 cmpb %cl, 32(%esp) movzbl 32(%esp), %ebx cmova %ecx, %ebx movl %ebx, %edi jmp .L10 So for some reasons in the first case edx is not used and code contains more memory instructions. gcc -v: Using built-in specs. COLLECT_GCC=/export/users/izamyati/compiler/build/bin/gcc COLLECT_LTO_WRAPPER=/export/users/izamyati/compiler/build/libexec/gcc/x86_64-unknown-linux-gnu/4.7.0/lto-wrapper Target: x86_64-unknown-linux-gnu Configured with: ../configure --disable-bootstrap --enable-languages=c,c++ --prefix=/export/users/izamyati/compiler/build/ Thread model: posix gcc version 4.7.0 20111026 (experimental) (GCC) Options for slow code: " -m32 -march=atom -O2 -c" Options for fast code: " -m32 -march=atom -O2 -DGOOD -c"