- Notifications
You must be signed in to change notification settings - Fork 13.9k
Open
Labels
C-bugCategory: This is a bug.Category: This is a bug.C-optimizationCategory: An issue highlighting optimization opportunities or PRs implementing suchCategory: An issue highlighting optimization opportunities or PRs implementing suchneeds-triageThis issue may need triage. Remove it if it has been sufficiently triaged.This issue may need triage. Remove it if it has been sufficiently triaged.
Description
While working on #147436, I noticed the following code has a panicking bounds check in the loop body that is removed when both slice lengths received from as_chunks are checked.
The slices are checked to be equal length at the start of the function, so the number of chunks and loop iterations is known to be equal.
I tried this code, which manually zips two instances of as_chunks array slices together with a while-loop:
#[inline(never)] pub const fn all_less_than(s: &[u8], other: &[u8]) -> bool { if s.len() != other.len() { return false; } const N: usize = 16; let (a, _) = s.as_chunks::<N>(); let (b, _) = other.as_chunks::<N>(); let mut i = 0; while i < a.len() { let mut less_than = true; let mut j = 0; while j < N { less_than &= a[i][j] < b[i][j]; j += 1; } if !less_than { return false; } i += 1; } true }I expected to not need to check the length for b since it's known to be equal.
When I change the loop condition from while i < a.len() to while i < a.len() && i < b.len(), the panic branch is removed.
https://rust.godbolt.org/z/azrbYq4Gv
while i < a.len() | while i < a.len() && i < b.len() |
.LBB0_4: sub r8, 1 jb .LBB0_8 movdqu xmm0, xmmword ptr [rdi + rcx] movdqu xmm1, xmmword ptr [rdx + rcx] pmaxub xmm1, xmm0 pcmpeqb xmm1, xmm0 pmovmskb eax, xmm1 test eax, eax sete al jne .LBB0_7 add rcx, 16 cmp r9, 1 mov r9, r8 jne .LBB0_4 | .LBB0_4: movdqu xmm0, xmmword ptr [rdi + rcx] movdqu xmm1, xmmword ptr [rdx + rcx] pmaxub xmm1, xmm0 pcmpeqb xmm1, xmm0 pmovmskb eax, xmm1 add rsi, -1 setb r8b test eax, eax sete al jne .LBB0_6 add rcx, 16 test r8b, r8b jne .LBB0_4 |
Meta
Playground nightly
Nightly channel Build using the Nightly version: 1.92.0-nightly (2025-10-20 4068bafedd8ba724e332) Metadata
Metadata
Assignees
Labels
C-bugCategory: This is a bug.Category: This is a bug.C-optimizationCategory: An issue highlighting optimization opportunities or PRs implementing suchCategory: An issue highlighting optimization opportunities or PRs implementing suchneeds-triageThis issue may need triage. Remove it if it has been sufficiently triaged.This issue may need triage. Remove it if it has been sufficiently triaged.