]> git.ipfire.org Git - thirdparty/zlib-ng.git/commitdiff
Disable MSVC optimizations for AVX512 GET_CHUNK_MAG #1883
authorNathan Moinvaziri <nathan@nathanm.com>
Fri, 7 Mar 2025 03:03:11 +0000 (19:03 -0800)
committerHans Kristian Rosbach <hk-github@circlestorm.org>
Wed, 26 Mar 2025 19:06:38 +0000 (20:06 +0100)
MSVC compiler (VS 17.11.x) incorrectly optimizes the GET_CHUNK_MAG code on
older versions. Appears to be resolved in VS 17.13.2. The compiler would
optimize the code in such a way that it would cause a decompression failure.
It only happens when /Os flag is set.

arch/x86/chunkset_avx512.c

index 9d28d33d5eccec65164cfedddc8ac5f9d5a5293e..db8c1eb25e6420db47c671cd23ef39e61898b900 100644 (file)
@@ -98,6 +98,10 @@ static inline uint8_t* CHUNKCOPY(uint8_t *out, uint8_t const *from, unsigned len
     return out;
 }
 
+/* MSVC compiler decompression bug when optimizing for size */
+#if defined(_MSC_VER) && _MSC_VER < 1943
+#  pragma optimize("", off)
+#endif
 static inline chunk_t GET_CHUNK_MAG(uint8_t *buf, uint32_t *chunk_rem, uint32_t dist) {
     lut_rem_pair lut_rem = perm_idx_lut[dist - 3];
     __m256i ret_vec;
@@ -128,6 +132,9 @@ static inline chunk_t GET_CHUNK_MAG(uint8_t *buf, uint32_t *chunk_rem, uint32_t
 
     return ret_vec;
 }
+#if defined(_MSC_VER) && _MSC_VER < 1943
+#  pragma optimize("", on)
+#endif
 
 static inline void storehalfchunk(uint8_t *out, halfchunk_t *chunk) {
     _mm_storeu_si128((__m128i *)out, *chunk);