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?

Reply via email to