← [ ABORT TO HUD ]
SEQ. 1
SEQ. 2
Eliminating Bounds Checks Safely & CPU PMU Profiling
The Cost of Runtime Bounds Checks
To guarantee memory safety, Rust automatically inserts bounds checks (if index >= len { panic!() }) on slice indexing operations (slice[i]). In tight mathematical and tokenization loops, these branch instructions prevent the compiler from auto-vectorizing with SIMD.
Idiomatic Ways to Eliminate Bounds Checks
- Iterators instead of manual indexing:
for item in slicegenerates zero bounds checks. - Iterator Chunking & Windows:
slice.chunks_exact(8)proves to the compiler that each chunk has exactly 8 elements. - Asserting Slices Upfront: Calling
assert!(slice.len() >= 1024);upfront allows LLVM to prove that subsequent indexes within that range cannot fail, eliminating all 1024 individual checks inside the loop!
// Hoisting bounds checks out of inner loops
pub fn process_tensor_slice(data: &mut [f32]) {
assert!(data.len() >= 4); // Single bounds check here
// LLVM recognizes data.len() >= 4 and strips bounds checks below!
data[0] *= 2.0;
data[1] *= 2.0;
data[2] *= 2.0;
data[3] *= 2.0;
}
SYNAPSE VERIFICATION
QUERY 1 // 1
How does placing an assert!(slice.len() >= N) upfront eliminate bounds checks inside an inner loop?
LLVM's Scalar Evolution (SCEV) pass uses the assertion condition to mathematically prove that loop indexes < N are always in-bounds, pruning the checks
It disables all safety checks across the entire file
It forces the slice to be copied to the GPU
It converts the loop into a macro