https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92077
Bug ID: 92077
Summary: Multiple independent functions degrades optimizations
Product: gcc
Version: 10.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: stinkingmadgod at gmail dot com
Target Milestone: ---
#include<string>
auto f()
{
std::string s1 = "abcdefg";
std::string s2 = "12345678";
return (s1 + s2).size();
}
#ifdef G
auto g()
{
std::string s1 = "abcdefg";
std::string s2 = "1234567";
return (s1 + s2).size();
}
#endif
Discovered on godbolt.org/z/6BTbMk, with target x86_64-linux-gnu built on
20191011. The definition of g() heavily influences assembly for f(). I assume
that this shouldn't happen in any case, hence the report.
AFAIK the optimization on f() is dependent on SSO.
g++ -std=c++2a -O2 gives:
f():
mov eax, 15
ret
g++ -std=c++2a -O2 -DG gives:
f():
push r12
mov eax, 26213
push rbp
push rbx
sub rsp, 96
mov WORD PTR [rsp+20], ax
lea rbx, [rsp+16]
lea rbp, [rsp+48]
mov rsi, rsp
lea rdx, [rsp+32]
lea rdi, [rsp+64]
mov QWORD PTR [rsp], rbx
movabs rax, 4050765991979987505
mov DWORD PTR [rsp+16], 1684234849
mov BYTE PTR [rsp+22], 103
mov QWORD PTR [rsp+8], 7
mov BYTE PTR [rsp+23], 0
mov QWORD PTR [rsp+32], rbp
mov QWORD PTR [rsp+48], rax
mov QWORD PTR [rsp+40], 8
mov BYTE PTR [rsp+56], 0
call std::__cxx11::basic_string<char, std::char_traits<char>,
std::allocator<char> > std::operator+<char, std::char_traits<char>,
std::allocator<char> >(std::__cxx11::basic_string<char, std::char_traits<char>,
std::allocator<char> > const&, std::__cxx11::basic_string<char,
std::char_traits<char>, std::allocator<char> > const&)
mov rdi, QWORD PTR [rsp+64]
lea rax, [rsp+80]
mov r12, QWORD PTR [rsp+72]
cmp rdi, rax
je .L69
mov rax, QWORD PTR [rsp+80]
lea rsi, [rax+1]
call operator delete(void*, unsigned long)
.L69:
mov rdi, QWORD PTR [rsp+32]
cmp rdi, rbp
je .L70
mov rax, QWORD PTR [rsp+48]
lea rsi, [rax+1]
call operator delete(void*, unsigned long)
.L70:
mov rdi, QWORD PTR [rsp]
cmp rdi, rbx
je .L68
mov rax, QWORD PTR [rsp+16]
lea rsi, [rax+1]
call operator delete(void*, unsigned long)
.L68:
add rsp, 96
mov rax, r12
pop rbx
pop rbp
pop r12
ret
mov rbp, rax
jmp .L72