-   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.