]> git.ipfire.org Git - thirdparty/zstd.git/commitdiff
relocate large arrays from the stack to ldmState_t 2483/head
authorQuentin Carbonneaux <quentin@c9x.me>
Wed, 10 Feb 2021 15:16:54 +0000 (16:16 +0100)
committerQuentin Carbonneaux <quentin@c9x.me>
Wed, 10 Feb 2021 15:16:54 +0000 (16:16 +0100)
lib/compress/zstd_compress.c
lib/compress/zstd_compress_internal.h
lib/compress/zstd_ldm.c
lib/compress/zstdmt_compress.c

index c90fb320e612b3e6c9a78fa73e18951fd84d937e..2e65a4da5fbbf9ccc42def321dd5337b747f2d6c 100644 (file)
@@ -1627,7 +1627,6 @@ static size_t ZSTD_resetCCtx_internal(ZSTD_CCtx* zc,
         ZSTD_ldm_adjustParameters(&params.ldmParams, &params.cParams);
         assert(params.ldmParams.hashLog >= params.ldmParams.bucketSizeLog);
         assert(params.ldmParams.hashRateLog < 32);
-        zc->ldmState.hashPower = ZSTD_rollingHash_primePower(params.ldmParams.minMatchLength);
     }
 
     {   size_t const windowSize = MAX(1, (size_t)MIN(((U64)1 << params.cParams.windowLog), pledgedSrcSize));
index 10846ae503ccd89cb41a37deb45afddcd1ec7463..57d3fa075266bf8efba0d36392088d01afa94f52 100644 (file)
@@ -183,13 +183,22 @@ typedef struct {
     U32 checksum;
 } ldmEntry_t;
 
+typedef struct {
+    BYTE const* split;
+    U32 hash;
+    U32 checksum;
+    ldmEntry_t* bucket;
+} ldmMatchCandidate_t;
+
+#define LDM_BATCH_SIZE 64
+
 typedef struct {
     ZSTD_window_t window;   /* State for the window round buffer management */
     ldmEntry_t* hashTable;
     U32 loadedDictEnd;
     BYTE* bucketOffsets;    /* Next position in bucket to insert entry */
-    U64 hashPower;          /* Used to compute the rolling hash.
-                             * Depends on ldmParams.minMatchLength */
+    size_t splitIndices[LDM_BATCH_SIZE];
+    ldmMatchCandidate_t matchCandidates[LDM_BATCH_SIZE];
 } ldmState_t;
 
 typedef struct {
index 314e4845fbd6056b163e0b89101a93492696c63b..fb4b8a0fd0c390cae3a6e813ab4033a46c5f2827 100644 (file)
@@ -19,7 +19,6 @@
 #define LDM_BUCKET_SIZE_LOG 3
 #define LDM_MIN_MATCH_LENGTH 64
 #define LDM_HASH_RLOG 7
-#define LDM_LOOKAHEAD_SPLITS 64
 
 typedef struct {
     U64 rolling;
@@ -62,8 +61,8 @@ static void ZSTD_ldm_gear_init(ldmRollingHashState_t* state, ldmParams_t const*
  *
  * Registers in the splits array all the split points found in the first
  * size bytes following the data pointer. This function terminates when
- * either all the data has been processed or LDM_LOOKAHEAD_SPLITS splits
- * are present in the splits array.
+ * either all the data has been processed or LDM_BATCH_SIZE splits are
+ * present in the splits array.
  *
  * Precondition: The splits array must not be full.
  * Returns: The number of bytes processed. */
@@ -84,7 +83,7 @@ static size_t ZSTD_ldm_gear_feed(ldmRollingHashState_t* state,
         if (UNLIKELY((hash & mask) == 0)) { \
             splits[*numSplits] = n; \
             *numSplits += 1; \
-            if (*numSplits == LDM_LOOKAHEAD_SPLITS) \
+            if (*numSplits == LDM_BATCH_SIZE) \
                 goto done; \
         } \
     } while (0)
@@ -247,7 +246,7 @@ void ZSTD_ldm_fillHashTable(
     BYTE const* const base = ldmState->window.base;
     BYTE const* const istart = ip;
     ldmRollingHashState_t hashState;
-    size_t splits[LDM_LOOKAHEAD_SPLITS];
+    size_t* const splits = ldmState->splitIndices;
     unsigned numSplits;
 
     DEBUGLOG(5, "ZSTD_ldm_fillHashTable");
@@ -319,13 +318,8 @@ static size_t ZSTD_ldm_generateSequences_internal(
     /* Rolling hash state */
     ldmRollingHashState_t hashState;
     /* Arrays for staged-processing */
-    size_t splits[LDM_LOOKAHEAD_SPLITS];
-    struct {
-        BYTE const* split;
-        U32 hash;
-        U32 checksum;
-        ldmEntry_t* bucket;
-    } candidates[LDM_LOOKAHEAD_SPLITS];
+    size_t* const splits = ldmState->splitIndices;
+    ldmMatchCandidate_t* const candidates = ldmState->matchCandidates;
     unsigned numSplits;
 
     if (srcSize < minMatchLength)
index c3ead0878dbd3ec09701aabeed42cef95ba665f3..7ad4f65430a63d7355895d534c5443c7bafad7a2 100644 (file)
@@ -472,8 +472,6 @@ ZSTDMT_serialState_reset(serialState_t* serialState,
         ZSTD_ldm_adjustParameters(&params.ldmParams, &params.cParams);
         assert(params.ldmParams.hashLog >= params.ldmParams.bucketSizeLog);
         assert(params.ldmParams.hashRateLog < 32);
-        serialState->ldmState.hashPower =
-                ZSTD_rollingHash_primePower(params.ldmParams.minMatchLength);
     } else {
         ZSTD_memset(&params.ldmParams, 0, sizeof(params.ldmParams));
     }