Version 9.3.4
October 18, 2026Release Notes
This release adds a native AArch64 NEON backend and tools for measuring bit-vector complexity, and fixes an XOR-assisted deserialization error with potential memory-safety implications.
Bug Fixes
-
Fixed a potential buffer overwrite in XOR-assisted
bm::bvector<>deserialization. When an XOR residual was decoded from two GAP blocks, the deserializer passed a GAP result length one word too large to the block manager. It now uses the result's actual terminal-boundary index. Applications that deserialize XOR-compressed bit-vectors should update. See the fix inbmserial.h. - Corrected SSE4.2 and AVX2 XOR complexity counts. The transition-count kernels now use the first bit of the XOR result, so run counts are correct when the input vectors have different initial bits. This affects XOR complexity estimates and reference selection, rather than Boolean XOR results. See the SIMD fix.
-
Fixed interval enumeration at the end of the logical address space.
Advancing an interval that ends just before the last addressable bit
now terminates correctly instead of risking index wraparound.
See
bmintervals.h.
Native ARM NEON
-
Added a native AArch64 SIMD backend in
bmneon.h, enabled by defining BMNEONOPT when compiling applications on compatible ARM64 systems, including Apple Silicon. The backend replaces the previous SSE2NEON translation path and covers bit-block Boolean operations, population and transition counts, indexed operations, GAP processing, and decoder paths. -
NEON allocations use 128-byte alignment.
See
bmalloc.h, the build configuration guide, and the NEON validation guide. ARM32 builds continue to use the scalar backend;BMNEONOPTis for AArch64. - Added reproducible SIMD benchmark options to the performance test driver, including kernel, dense bit-vector, and GAP workloads. Results depend on workload, CPU, and build settings.
Complexity analysis and example
-
New
bmcomplexity.hprovidesbm::calc_complexity()andbm::calc_complexity_xor(). They report population, one-runs, block classes, GAP storage estimates, and related structural statistics. Pairwise XOR analysis does not construct a resultbm::bvector<>. Newbvsample28demonstrates pairwise XOR complexity analysis and reference selection. Its score is a heuristic, not an exact serialized-size prediction; the sample also measures actual serialization for selected pairs.