https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109443
Bug ID: 109443
Summary: missed optimization of std::vector access (Related to
issue 35269)
Product: gcc
Version: unknown
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: tree-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: hiraditya at msn dot com
Target Milestone: ---
here is slightly modified code example from issue #35269. Both accesses are
similar bug different code is generated. the function `h` has better codegen
than `g` for some reason.
$ g++ -O3 -std=c++20 -fno-exceptions
void f(int);
void g(std::vector<int> v)
{
for (std::vector<int>::size_type i = 0; i < v.size(); i++)
f( v[ i ] );
}
void h(std::vector<int> v)
{
for (std::vector<int>::const_iterator i = v.begin(); i != v.end(); ++i)
f( *i );
}
g(std::vector<int, std::allocator<int> >):
mov rdx, QWORD PTR [rdi]
cmp QWORD PTR [rdi+8], rdx
je .L6
push rbp
mov rbp, rdi
push rbx
xor ebx, ebx
sub rsp, 8
.L3:
mov edi, DWORD PTR [rdx+rbx*4]
add rbx, 1
call f(int)
mov rdx, QWORD PTR [rbp+0]
mov rax, QWORD PTR [rbp+8]
sub rax, rdx
sar rax, 2
cmp rbx, rax
jb .L3
add rsp, 8
pop rbx
pop rbp
ret
.L6:
ret
h(std::vector<int, std::allocator<int> >):
push rbp
push rbx
sub rsp, 8
mov rbx, QWORD PTR [rdi]
cmp rbx, QWORD PTR [rdi+8]
je .L10
mov rbp, rdi
.L12:
mov edi, DWORD PTR [rbx]
add rbx, 4
call f(int)
cmp QWORD PTR [rbp+8], rbx
jne .L12
.L10:
add rsp, 8
pop rbx
pop rbp
ret