From: Quentin Carbonneaux Date: Wed, 10 Feb 2021 15:16:54 +0000 (+0100) Subject: relocate large arrays from the stack to ldmState_t X-Git-Tag: v1.4.9^2~16^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=552efcac2d82e11165841eef80af0e09c76e934e;p=thirdparty%2Fzstd.git relocate large arrays from the stack to ldmState_t --- diff --git a/lib/compress/zstd_compress.c b/lib/compress/zstd_compress.c index c90fb320e..2e65a4da5 100644 --- a/lib/compress/zstd_compress.c +++ b/lib/compress/zstd_compress.c @@ -1627,7 +1627,6 @@ static size_t ZSTD_resetCCtx_internal(ZSTD_CCtx* zc, ZSTD_ldm_adjustParameters(¶ms.ldmParams, ¶ms.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)); diff --git a/lib/compress/zstd_compress_internal.h b/lib/compress/zstd_compress_internal.h index 10846ae50..57d3fa075 100644 --- a/lib/compress/zstd_compress_internal.h +++ b/lib/compress/zstd_compress_internal.h @@ -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 { diff --git a/lib/compress/zstd_ldm.c b/lib/compress/zstd_ldm.c index 314e4845f..fb4b8a0fd 100644 --- a/lib/compress/zstd_ldm.c +++ b/lib/compress/zstd_ldm.c @@ -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) diff --git a/lib/compress/zstdmt_compress.c b/lib/compress/zstdmt_compress.c index c3ead0878..7ad4f6543 100644 --- a/lib/compress/zstdmt_compress.c +++ b/lib/compress/zstdmt_compress.c @@ -472,8 +472,6 @@ ZSTDMT_serialState_reset(serialState_t* serialState, ZSTD_ldm_adjustParameters(¶ms.ldmParams, ¶ms.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(¶ms.ldmParams, 0, sizeof(params.ldmParams)); }