Open
Description
The following code:
#[inline(never)]
pub fn foo() -> Vec<u8> {
vec![0; 900]
}
compiles to
example::foo:
push rbp
mov rbp, rsp
push rbx
sub rsp, 40
mov rbx, rdi
lea rdx, [rbp - 32]
mov edi, 900
mov esi, 1
call __rust_alloc_zeroed@PLT
test rax, rax
je .LBB0_1
mov qword ptr [rbx], rax
mov qword ptr [rbx + 8], 900
mov qword ptr [rbx + 16], 900
mov rax, rbx
add rsp, 40
pop rbx
pop rbp
ret
.LBB0_1:
mov rax, qword ptr [rbp - 32]
movups xmm0, xmmword ptr [rbp - 24]
movaps xmmword ptr [rbp - 48], xmm0
mov qword ptr [rbp - 32], rax
movaps xmm0, xmmword ptr [rbp - 48]
movups xmmword ptr [rbp - 24], xmm0
lea rdi, [rbp - 32]
call __rust_oom@PLT
ud2
It would be a good code size improvement for the oom handling to be moved into __rust_alloc_zeroed when compiling with panic=abort. This will also make the branch on null better predicted because it's not duplicated all around the code base, but in just one spot.