]> git.ipfire.org Git - thirdparty/zstd.git/commitdiff
Remove bubbling down matches with longer offCode and same matchLen
authorsenhuang42 <senhuang96@fb.com>
Mon, 5 Oct 2020 01:48:39 +0000 (21:48 -0400)
committersenhuang42 <senhuang96@fb.com>
Wed, 7 Oct 2020 17:56:25 +0000 (13:56 -0400)
lib/compress/zstd_opt.c

index 07b30f5f96a6c707a960278a189811f50a08d344..b737d6bdd271877c95196d93768b28b09715cbd7 100644 (file)
@@ -882,36 +882,13 @@ static void ZSTD_opt_maybeAddLdm(ZSTD_match_t* matches, U32* nbMatches,
         matches[*nbMatches].off = candidateOffCode;
         (*nbMatches)++;
     } else if ((candidateMatchLength >= matches[*nbMatches-1].len) && *nbMatches < ZSTD_OPT_NUM) {
-        /* Maintain order of matches, which is firstly - increasing in matchlength, 
-         * and secondly - decreasing in offCode. Since matches from the ldm seq store are likely
-         * to be the longest match found, we simply start at the end of the array and bubble
-         * the ldm match down as necessary.
-         */
-        if (candidateMatchLength == matches[*nbMatches-1].len) {
-            U32 candidateMatchIdx;
-            if (candidateOffCode == matches[*nbMatches-1].off) {
-                /* No need to insert the match if it's the exact same */
-                return;
-            }
-            candidateMatchIdx = *nbMatches;
-            matches[*nbMatches].len = candidateMatchLength;
-            matches[*nbMatches].off = candidateOffCode;
-            if (candidateOffCode != matches[*nbMatches-1].off) {
-                while (candidateMatchIdx > 0 &&
-                       matches[candidateMatchIdx].off > matches[candidateMatchIdx - 1].off &&
-                       matches[candidateMatchIdx].len == matches[candidateMatchIdx - 1].len) {
-                    ZSTD_match_t tmp = matches[candidateMatchIdx - 1];
-                    matches[candidateMatchIdx - 1] = matches[candidateMatchIdx];
-                    matches[candidateMatchIdx] = tmp;
-                    --candidateMatchIdx;
-                }
-            }
-            (*nbMatches)++;
-        } else {
-            matches[*nbMatches].len = candidateMatchLength;
-            matches[*nbMatches].off = candidateOffCode;
-            (*nbMatches)++;
+        /* No need to insert the match if it's the exact same, or offCode is larger with same matchLen */
+        if (candidateMatchLength == matches[*nbMatches-1].len && candidateOffCode >= matches[*nbMatches-1].off) {
+            return;
         }
+        matches[*nbMatches].len = candidateMatchLength;
+        matches[*nbMatches].off = candidateOffCode;
+        (*nbMatches)++;
     }
 }