mirror of
https://github.com/postgres/postgres.git
synced 2025-10-16 00:04:15 -04:00
Properly fix AVX-512 CRC calculation bug
The problem that led to the workaround in f83f14881c7 was not in fact a compiler bug, but a failure to zero the upper bits of the vector register containing the initial scalar CRC value. Fix that and revert the workaround. Diagnosed-by: Nathan Bossart <nathandbossart@gmail.com> Diagnosed-by: Raghuveer Devulapalli <raghuveer.devulapalli@intel.com> Tested-by: Andy Fan <zhihuifan1213@163.com> Tested-by: Soumyadeep Chakraborty <soumyadeep2007@gmail.com> Reviewed-by: Nathan Bossart <nathandbossart@gmail.com> Reviewed-by: Raghuveer Devulapalli <raghuveer.devulapalli@intel.com> Discussion: https://postgr.es/m/PH8PR11MB82866B07AA6758D12F699C00FB70A@PH8PR11MB8286.namprd11.prod.outlook.com
This commit is contained in:
parent
2c0d8b9508
commit
43da394304
@ -123,7 +123,7 @@ pg_comp_crc32c_avx512(pg_crc32c crc, const void *data, size_t len)
|
||||
__m512i k;
|
||||
|
||||
k = _mm512_broadcast_i32x4(_mm_setr_epi32(0x740eef02, 0, 0x9e4addf8, 0));
|
||||
x0 = _mm512_xor_si512(_mm512_castsi128_si512(_mm_cvtsi32_si128(crc0)), x0);
|
||||
x0 = _mm512_xor_si512(_mm512_zextsi128_si512(_mm_cvtsi32_si128(crc0)), x0);
|
||||
buf += 64;
|
||||
|
||||
/* Main loop. */
|
||||
|
@ -95,9 +95,7 @@ pg_comp_crc32c_choose(pg_crc32c crc, const void *data, size_t len)
|
||||
__cpuidex(exx, 7, 0);
|
||||
#endif
|
||||
|
||||
#if defined(__clang__) && !defined(__OPTIMIZE__)
|
||||
/* Some versions of clang are broken at -O0 */
|
||||
#elif defined(USE_AVX512_CRC32C_WITH_RUNTIME_CHECK)
|
||||
#ifdef USE_AVX512_CRC32C_WITH_RUNTIME_CHECK
|
||||
if (exx[2] & (1 << 10) && /* VPCLMULQDQ */
|
||||
exx[1] & (1 << 31)) /* AVX512-VL */
|
||||
pg_comp_crc32c = pg_comp_crc32c_avx512;
|
||||
|
Loading…
x
Reference in New Issue
Block a user