From: W. Felix Handte Date: Tue, 10 May 2022 21:29:39 +0000 (-0700) Subject: ZSTD_fast_noDict: Minimize Checks When Writing Hash Table for ip1 X-Git-Tag: v1.5.4^2~213^2~3 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=040986a4f4a2ba64a3ad9dc76646d8fab4472b37;p=thirdparty%2Fzstd.git ZSTD_fast_noDict: Minimize Checks When Writing Hash Table for ip1 This commit avoids checking whether a hashtable write is safe in two of the three match-found paths in `ZSTD_compressBlock_fast_noDict_generic`. This pro- duces a ~0.5% speed-up in compression. A comment in the code describes why we can skip this check in the other two paths (the repcode check and the first match check in the unrolled loop). A downside is that in the new position where we make this check, we have not yet computed `mLength`. We therefore have to avoid writing *possibly* dangerous positions, rather than the old check which only avoids writing *actually* dangerous positions. This leads to a miniscule loss in ratio (remember that this scenario can only been triggered in very negative levels or under incomp- ressibility acceleration). --- diff --git a/lib/compress/zstd_fast.c b/lib/compress/zstd_fast.c index 198ccaee3..f2028ef35 100644 --- a/lib/compress/zstd_fast.c +++ b/lib/compress/zstd_fast.c @@ -224,6 +224,23 @@ _start: /* Requires: ip0 */ /* check match at ip[0] */ if (MEM_read32(ip0) == mval) { /* found a match! */ + if (step > 4) { + /* We need to avoid writing an index into the hash table >= the + * position at which we will pick up our searching after we've + * taken this match. + * + * The minimum possible match has length 4, so the earliest ip0 + * can be after we take this match will be the current ip0 + 4. + * ip1 is ip0 + step - 1. If ip1 is >= ip0 + 4, we can't safely + * write this position. The expedient thing to do is just to + * write a bad position. + * + * We perform this check here, separate from the write, because + * this is the only match path where this can occur. (In rep- + * code and the first match checks, ip1 == ip0 + 1.) + */ + ip1 = base; + } goto _offset; } @@ -288,9 +305,7 @@ _match: /* Requires: ip0, match0, offcode */ anchor = ip0; /* write next hash table entry */ - if (ip1 < ip0) { - hashTable[hash1] = (U32)(ip1 - base); - } + hashTable[hash1] = (U32)(ip1 - base); /* Fill table and check for immediate repcode. */ if (ip0 <= ilimit) {