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