https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109443
--- Comment #17 from AK <hiraditya at msn dot com> --- Even after vector::size() is hoisted, the codegen is sub-optimal compared to iterator version. ``` void use_idx_const_size(std::vector<int> v) { auto s = v.size(); for (std::vector<int>::size_type i = 0; i < s; i++) f(v[i]); } ``` $ g++ -O3 use_idx_const_size(std::vector<int, std::allocator<int> >): push r12 push rbp push rbx mov rdx, QWORD PTR [rdi+8] mov rax, QWORD PTR [rdi] mov r12, rdx sub r12, rax sar r12, 2 cmp rax, rdx je .L1 mov rbp, rdi xor ebx, ebx jmp .L3 .L6: mov rax, QWORD PTR [rbp+0] .L3: mov edi, DWORD PTR [rax+rbx*4] add rbx, 1 call f(int) cmp rbx, r12 jb .L6 .L1: pop rbx pop rbp pop r12 ret It seems compiler is assuming that vector `v` is not loop-invariant?