From ae70342561b2544aa02a41bebaa9cf03300fb98e Mon Sep 17 00:00:00 2001 From: Usama Arif Date: Mon, 7 Sep 2026 09:56:35 -0700 Subject: [PATCH] compress: Elide long-offset path on 64-bit ZSTD_seqToCodes() only enables longOffsets on 32-bit builds because the 64-bit bitstream accumulator can hold every supported offset. However, ZSTD_encodeSequences_body() still tests the runtime flag for the first sequence and every sequence in its hot loop. Make the architecture condition explicit at both branches so 64-bit compilers can discard the unreachable path. Add an assertion documenting the invariant while preserving the existing 32-bit behavior. In five alternating GCC 11.5 fullbench runs encoding sequences for an 8 MiB, 50%-compressible level-3 sample, throughput increased from 1201.6 to 1213.4 MB/s on average (+1.0%) with identical 2,706,887-byte output. The fullbench text section also shrank by 512 bytes. Signed-off-by: Usama Arif --- lib/compress/zstd_compress_sequences.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/compress/zstd_compress_sequences.c b/lib/compress/zstd_compress_sequences.c index 7beb9daa603..d14ef9a8c5f 100644 --- a/lib/compress/zstd_compress_sequences.c +++ b/lib/compress/zstd_compress_sequences.c @@ -300,6 +300,7 @@ ZSTD_encodeSequences_body( FSE_CState_t stateOffsetBits; FSE_CState_t stateLitLength; + assert(MEM_32bits() || !longOffsets); RETURN_ERROR_IF( ERR_isError(BIT_initCStream(&blockStream, dst, dstCapacity)), dstSize_tooSmall, "not enough space remaining"); @@ -315,7 +316,7 @@ ZSTD_encodeSequences_body( if (MEM_32bits()) BIT_flushBits(&blockStream); BIT_addBits(&blockStream, sequences[nbSeq-1].mlBase, ML_bits[mlCodeTable[nbSeq-1]]); if (MEM_32bits()) BIT_flushBits(&blockStream); - if (longOffsets) { + if (MEM_32bits() && longOffsets) { U32 const ofBits = ofCodeTable[nbSeq-1]; unsigned const extraBits = ofBits - MIN(ofBits, STREAM_ACCUMULATOR_MIN-1); if (extraBits) { @@ -353,7 +354,7 @@ ZSTD_encodeSequences_body( if (MEM_32bits() && ((llBits+mlBits)>24)) BIT_flushBits(&blockStream); BIT_addBits(&blockStream, sequences[n].mlBase, mlBits); if (MEM_32bits() || (ofBits+mlBits+llBits > 56)) BIT_flushBits(&blockStream); - if (longOffsets) { + if (MEM_32bits() && longOffsets) { unsigned const extraBits = ofBits - MIN(ofBits, STREAM_ACCUMULATOR_MIN-1); if (extraBits) { BIT_addBits(&blockStream, sequences[n].offBase, extraBits);