Skip to content

1.26.0 cannot optimize length of vector collected from a slice of known size #50925

Closed
@tspiteri

Description

@tspiteri

The code:

pub fn foo() {
    let a: Vec<_> = [1, 2, 3].iter().collect();
    assert!(a.len() == 3);
}

With rustc 1.25.0:

example::foo:
        push    rbp
        mov     rbp, rsp
        pop     rbp
        ret

With rustc 1.26.0:

;...
example::foo:
        push    rbp
        mov     rbp, rsp
        push    rbx
        sub     rsp, 88
        mov     qword ptr [rbp - 56], 8
        xorps   xmm0, xmm0
        movups  xmmword ptr [rbp - 48], xmm0
        lea     rdx, [rbp - 32]
        mov     edi, 24
        mov     esi, 8
        call    __rust_alloc@PLT
        test    rax, rax
        je      .LBB6_6
        mov     qword ptr [rbp - 56], rax
        mov     qword ptr [rbp - 48], 3
        jmp     .LBB6_2
.LBB6_6:
        movups  xmm0, xmmword ptr [rbp - 24]
        movaps  xmmword ptr [rbp - 96], xmm0
        mov     qword ptr [rbp - 32], 0
        movaps  xmm0, xmmword ptr [rbp - 96]
        movups  xmmword ptr [rbp - 24], xmm0
        lea     rdi, [rbp - 80]
        lea     rsi, [rbp - 32]
        call    <core::heap::CollectionAllocErr as core::convert::From<core::heap::AllocErr>>::from@PLT
        mov     rax, qword ptr [rbp - 80]
        cmp     rax, 3
        jne     .LBB6_9
        mov     eax, 8
.LBB6_2:
        xor     ecx, ecx
        test    cl, cl
        jne     .LBB6_4
        lea     rcx, [rip + .Lbyte_str.c]
        mov     qword ptr [rax], rcx
        lea     rcx, [rip + .Lbyte_str.c+4]
        mov     qword ptr [rax + 8], rcx
        lea     rcx, [rip + .Lbyte_str.c+8]
        mov     qword ptr [rax + 16], rcx
        mov     ecx, 3
.LBB6_4:
        mov     qword ptr [rbp - 40], rcx
        movups  xmm0, xmmword ptr [rbp - 56]
        movaps  xmmword ptr [rbp - 32], xmm0
        mov     qword ptr [rbp - 16], rcx
        cmp     qword ptr [rbp - 16], 3
        jne     .LBB6_5
        mov     rsi, qword ptr [rbp - 24]
        test    rsi, rsi
        je      .LBB6_15
        shl     rsi, 3
        mov     rdi, qword ptr [rbp - 32]
        mov     edx, 8
        call    __rust_dealloc@PLT
.LBB6_15:
        add     rsp, 88
        pop     rbx
        pop     rbp
        ret
.LBB6_5:
        call    std::panicking::begin_panic
        jmp     .LBB6_11
.LBB6_9:
        cmp     rax, 2
        jne     .LBB6_12
        lea     rdi, [rip + .Lbyte_str.6]
        call    core::panicking::panic@PLT
.LBB6_11:
        ud2
.LBB6_12:
        mov     rcx, qword ptr [rbp - 72]
        mov     rdx, qword ptr [rbp - 64]
        mov     qword ptr [rbp - 32], rax
        mov     qword ptr [rbp - 24], rcx
        mov     qword ptr [rbp - 16], rdx
        lea     rdi, [rbp - 32]
        call    <alloc::heap::Heap as core::heap::Alloc>::oom
        ud2
        mov     rbx, rax
        lea     rdi, [rbp - 32]
        jmp     .LBB6_18
        mov     rbx, rax
        lea     rdi, [rbp - 56]
.LBB6_18:
        call    core::ptr::drop_in_place
        mov     rdi, rbx
        call    _Unwind_Resume@PLT
        ud2
;...

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-codegenArea: Code generationT-libs-apiRelevant to the library API team, which will review and decide on the PR/issue.regression-from-stable-to-stablePerformance or correctness regression from one stable version to another.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions