mirror of
https://github.com/official-stockfish/Stockfish.git
synced 2026-07-22 12:47:08 +00:00
Fix Strict Aliasing Violation
Even though this failed with non regression bounds on fishtest, merging
it as is to improve the current situation.
Failed Non Regression:
https://tests.stockfishchess.org/tests/view/6988814db0f3ca5200aafb50
LLR: -2.94 (-2.94,2.94) <-1.75,0.25>
Total: 185792 W: 48109 L: 48565 D: 89118
Ptnml(0-2): 553, 21228, 49811, 20730, 574
Previously we had code similar to this
```
alignas(64) std::uint8_t foo[1024];
const auto* int_ptr = reinterpret_cast<const std::int32_t*>(foo);
```
Which is a strict aliasing violation once we dereference int_ptr, which
invokes UB and causes newer gcc version to emit incorrect code.
fixes https://github.com/official-stockfish/Stockfish/issues/6598
fixes https://github.com/official-stockfish/Stockfish/issues/4932
This violation was introduced in PR #3287 and merged in commit 23c385e.
Due to aggressive compiler optimizations, users may need to include
CXXFLAGS=-fno-strict-aliasing as a build argument to ensure a correctly
functioning binary.
Also thanks to @anematode for writing parts of this and realizing this
strict aliasing violation.
closes https://github.com/official-stockfish/Stockfish/pull/6599
Bench: 2668754
Co-Authored-By: Timothy Herchen <timothy.herchen@gmail.com>
This commit is contained in:
co-authored by
Timothy Herchen
parent
fac506bdf3
commit
bfeb36eb3d
+11
-5
@@ -181,11 +181,17 @@ inline __m128i vec_convert_8_16(uint64_t x) {
|
||||
#define MaxChunkSize 16
|
||||
|
||||
#elif USE_NEON
|
||||
using vec_t = int16x8_t;
|
||||
using vec_i8_t = int8x16_t;
|
||||
using psqt_vec_t = int32x4_t;
|
||||
using vec128_t = uint16x8_t;
|
||||
using vec_uint_t = uint32x4_t;
|
||||
using vec_i8x8_t __attribute__((may_alias)) = int8x8_t;
|
||||
using vec_i16x8_t __attribute__((may_alias)) = int16x8_t;
|
||||
using vec_i8x16_t __attribute__((may_alias)) = int8x16_t;
|
||||
using vec_u16x8_t __attribute__((may_alias)) = uint16x8_t;
|
||||
using vec_i32x4_t __attribute__((may_alias)) = int32x4_t;
|
||||
|
||||
using vec_t __attribute__((may_alias)) = int16x8_t;
|
||||
using vec_i8_t __attribute__((may_alias)) = int8x16_t;
|
||||
using psqt_vec_t __attribute__((may_alias)) = int32x4_t;
|
||||
using vec128_t __attribute__((may_alias)) = uint16x8_t;
|
||||
using vec_uint_t __attribute__((may_alias)) = uint32x4_t;
|
||||
#define vec_load(a) (*(a))
|
||||
#define vec_store(a, b) *(a) = (b)
|
||||
#define vec_add_16(a, b) vaddq_s16(a, b)
|
||||
|
||||
Reference in New Issue
Block a user