Closed
Description
I tried this code:
pub fn foo(v: &mut Vec<MaybeUninit<u8>>, size: usize)-> Option<&mut [MaybeUninit<u8>]> {
if v.len() > max(1, size) {
let start = v.len() - size;
Some(&mut v[start..])
} else {
None
}
}
Generates:
example::foo:
push rax
mov rcx, qword ptr [rdi + 16]
test rsi, rsi
mov eax, 1
cmovne rax, rsi
cmp rcx, rax
jbe .LBB0_1
mov rax, rcx
sub rax, rsi
jb .LBB0_5
add rax, qword ptr [rdi]
jmp .LBB0_4
.LBB0_1:
xor eax, eax
.LBB0_4:
mov rdx, rsi
pop rcx
ret
.LBB0_5:
lea rdx, [rip + .L__unnamed_1]
mov rdi, rax
mov rsi, rcx
call qword ptr [rip + core::slice::index::slice_start_index_len_fail@GOTPCREL]
ud2
.L__unnamed_2:
.ascii "/app/example.rs"
.L__unnamed_1:
.quad .L__unnamed_2
.asciz "\017\000\000\000\000\000\000\000\020\000\000\000\023\000\000"
But
pub fn foo(v: &mut Vec<MaybeUninit<u8>>, size: usize)-> Option<&mut [MaybeUninit<u8>]> {
if v.len() > 1 && v.len() > size {
let start = v.len() - size;
Some(&mut v[start..])
} else {
None
}
}
generates super clean assembly:
example::foo:
mov rdx, rsi
mov rcx, qword ptr [rdi + 16]
mov rax, rcx
sub rax, rsi
add rax, qword ptr [rdi]
xor esi, esi
cmp rcx, rdx
cmovbe rax, rsi
cmp rcx, 2
cmovb rax, rsi
ret
Meta
rustc --version --verbose
:
rustc 1.73.0-nightly (1065d876c 2023-07-09)