Closed
Description
https://rust.godbolt.org/z/E1PnPj
const N: usize = 3;
const T = u8;
pub fn split_mutiple(slice: &[T]) -> (&[T], &[T]) {
let len = slice.len() / N;
slice.split_at(len * N)
}
results in the following assembly
example::split_mutiple:
push rax
mov r8, rdx
mov rcx, rdi
movabs rdx, -6148914691236517205
mov rax, r8
mul rdx
shr rdx
lea rdx, [rdx + 2*rdx]
mov rax, r8
sub rax, rdx
mov rdi, r8
sub rdi, rax
jb .LBB0_1 ; Note that this check can never be actually hit
mov qword ptr [rcx], rsi
add rsi, rdi
mov qword ptr [rcx + 8], rdi
mov qword ptr [rcx + 16], rsi
mov qword ptr [rcx + 24], rax
mov rax, rcx
pop rcx
ret
.LBB0_1:
lea rdx, [rip + .L__unnamed_1]
mov rsi, r8
call qword ptr [rip + core::slice::slice_index_len_fail@GOTPCREL]
ud2
When using const N: usize = 4
the check is correctly optimized away:
example::split_mutiple:
mov rax, rdi
mov rcx, rdx
and rcx, -4
and edx, 3
mov qword ptr [rdi], rsi
add rsi, rcx
mov qword ptr [rdi + 8], rcx
mov qword ptr [rdi + 16], rsi
mov qword ptr [rdi + 24], rdx
ret
This happens both on all stable versions I have tested and on the most recent nightly.
Metadata
Metadata
Assignees
Labels
Area: Code generation parts specific to LLVM. Both correctness bugs and optimization-related issues.Area: MIR optimizationsCategory: An issue proposing an enhancement or a PR with one.Category: An issue highlighting optimization opportunities or PRs implementing suchCall for participation: An issue has been fixed and does not reproduce, but no test has been added.Issue: Problems and improvements with respect to performance of generated code.Relevant to the compiler team, which will review and decide on the PR/issue.