Use __assume(0) for unreachable code path in msvc

msvc will optimize away the condition check.
This commit is contained in:
Ma Lin
2021-09-27 19:23:57 +08:00
parent e5ba858270
commit ae986fcdb8
6 changed files with 113 additions and 32 deletions
+7 -1
View File
@@ -145,8 +145,14 @@ MEM_STATIC unsigned BIT_highbit32 (U32 val)
# if STATIC_BMI2 == 1 # if STATIC_BMI2 == 1
return _lzcnt_u32(val) ^ 31; return _lzcnt_u32(val) ^ 31;
# else # else
if (val != 0) {
unsigned long r; unsigned long r;
return _BitScanReverse(&r, val) ? (unsigned)r : 0; _BitScanReverse(&r, val);
return (unsigned)r;
} else {
/* Should not reach this code path */
__assume(0);
}
# endif # endif
# elif defined(__GNUC__) && (__GNUC__ >= 3) /* Use GCC Intrinsic */ # elif defined(__GNUC__) && (__GNUC__ >= 3) /* Use GCC Intrinsic */
return __builtin_clz (val) ^ 31; return __builtin_clz (val) ^ 31;
+7 -1
View File
@@ -43,8 +43,14 @@ static U32 FSE_ctz(U32 val)
assert(val != 0); assert(val != 0);
{ {
# if defined(_MSC_VER) /* Visual */ # if defined(_MSC_VER) /* Visual */
if (val != 0) {
unsigned long r; unsigned long r;
return _BitScanForward(&r, val) ? (unsigned)r : 0; _BitScanForward(&r, val);
return (unsigned)r;
} else {
/* Should not reach this code path */
__assume(0);
}
# elif defined(__GNUC__) && (__GNUC__ >= 3) /* GCC Intrinsic */ # elif defined(__GNUC__) && (__GNUC__ >= 3) /* GCC Intrinsic */
return __builtin_ctz(val); return __builtin_ctz(val);
# elif defined(__ICCARM__) /* IAR Intrinsic */ # elif defined(__ICCARM__) /* IAR Intrinsic */
+21 -3
View File
@@ -358,8 +358,14 @@ MEM_STATIC U32 ZSTD_highbit32(U32 val) /* compress, dictBuilder, decodeCorpus
# if STATIC_BMI2 == 1 # if STATIC_BMI2 == 1
return _lzcnt_u32(val)^31; return _lzcnt_u32(val)^31;
# else # else
if (val != 0) {
unsigned long r; unsigned long r;
return _BitScanReverse(&r, val) ? (unsigned)r : 0; _BitScanReverse(&r, val);
return (unsigned)r;
} else {
/* Should not reach this code path */
__assume(0);
}
# endif # endif
# elif defined(__GNUC__) && (__GNUC__ >= 3) /* GCC Intrinsic */ # elif defined(__GNUC__) && (__GNUC__ >= 3) /* GCC Intrinsic */
return __builtin_clz (val) ^ 31; return __builtin_clz (val) ^ 31;
@@ -391,8 +397,14 @@ MEM_STATIC unsigned ZSTD_countTrailingZeros(size_t val)
# if STATIC_BMI2 # if STATIC_BMI2
return _tzcnt_u64(val); return _tzcnt_u64(val);
# else # else
if (val != 0) {
unsigned long r; unsigned long r;
return _BitScanForward64( &r, (U64)val ) ? (unsigned)(r >> 3) : 0; _BitScanForward64(&r, (U64)val);
return (unsigned)(r >> 3);
} else {
/* Should not reach this code path */
__assume(0);
}
# endif # endif
# elif defined(__GNUC__) && (__GNUC__ >= 4) # elif defined(__GNUC__) && (__GNUC__ >= 4)
return __builtin_ctzll((U64)val); return __builtin_ctzll((U64)val);
@@ -409,8 +421,14 @@ MEM_STATIC unsigned ZSTD_countTrailingZeros(size_t val)
# endif # endif
} else { /* 32 bits */ } else { /* 32 bits */
# if defined(_MSC_VER) # if defined(_MSC_VER)
if (val != 0) {
unsigned long r; unsigned long r;
return _BitScanForward( &r, (U32)val ) ? (unsigned)(r >> 3) : 0; _BitScanForward(&r, (U32)val);
return (unsigned)(r >> 3);
} else {
/* Should not reach this code path */
__assume(0);
}
# elif defined(__GNUC__) && (__GNUC__ >= 3) # elif defined(__GNUC__) && (__GNUC__ >= 3)
return (__builtin_ctz((U32)val) >> 3); return (__builtin_ctz((U32)val) >> 3);
# else # else
+28 -4
View File
@@ -672,8 +672,14 @@ static unsigned ZSTD_NbCommonBytes (size_t val)
# if STATIC_BMI2 # if STATIC_BMI2
return _tzcnt_u64(val) >> 3; return _tzcnt_u64(val) >> 3;
# else # else
if (val != 0) {
unsigned long r; unsigned long r;
return _BitScanForward64( &r, (U64)val ) ? (unsigned)(r >> 3) : 0; _BitScanForward64(&r, (U64)val);
return (unsigned)(r >> 3);
} else {
/* Should not reach this code path */
__assume(0);
}
# endif # endif
# elif defined(__GNUC__) && (__GNUC__ >= 4) # elif defined(__GNUC__) && (__GNUC__ >= 4)
return (__builtin_ctzll((U64)val) >> 3); return (__builtin_ctzll((U64)val) >> 3);
@@ -690,8 +696,14 @@ static unsigned ZSTD_NbCommonBytes (size_t val)
# endif # endif
} else { /* 32 bits */ } else { /* 32 bits */
# if defined(_MSC_VER) # if defined(_MSC_VER)
if (val != 0) {
unsigned long r; unsigned long r;
return _BitScanForward( &r, (U32)val ) ? (unsigned)(r >> 3) : 0; _BitScanForward(&r, (U32)val);
return (unsigned)(r >> 3);
} else {
/* Should not reach this code path */
__assume(0);
}
# elif defined(__GNUC__) && (__GNUC__ >= 3) # elif defined(__GNUC__) && (__GNUC__ >= 3)
return (__builtin_ctz((U32)val) >> 3); return (__builtin_ctz((U32)val) >> 3);
# else # else
@@ -708,8 +720,14 @@ static unsigned ZSTD_NbCommonBytes (size_t val)
# if STATIC_BMI2 # if STATIC_BMI2
return _lzcnt_u64(val) >> 3; return _lzcnt_u64(val) >> 3;
# else # else
if (val != 0) {
unsigned long r; unsigned long r;
return _BitScanReverse64(&r, (U64)val) ? (unsigned)(r >> 3) : 0; _BitScanReverse64(&r, (U64)val);
return (unsigned)(r >> 3);
} else {
/* Should not reach this code path */
__assume(0);
}
# endif # endif
# elif defined(__GNUC__) && (__GNUC__ >= 4) # elif defined(__GNUC__) && (__GNUC__ >= 4)
return (__builtin_clzll(val) >> 3); return (__builtin_clzll(val) >> 3);
@@ -723,8 +741,14 @@ static unsigned ZSTD_NbCommonBytes (size_t val)
# endif # endif
} else { /* 32 bits */ } else { /* 32 bits */
# if defined(_MSC_VER) # if defined(_MSC_VER)
if (val != 0) {
unsigned long r; unsigned long r;
return _BitScanReverse( &r, (unsigned long)val ) ? (unsigned)(r >> 3) : 0; _BitScanReverse(&r, (unsigned long)val);
return (unsigned)(r >> 3);
} else {
/* Should not reach this code path */
__assume(0);
}
# elif defined(__GNUC__) && (__GNUC__ >= 3) # elif defined(__GNUC__) && (__GNUC__ >= 3)
return (__builtin_clz((U32)val) >> 3); return (__builtin_clz((U32)val) >> 3);
# else # else
+6 -3
View File
@@ -881,10 +881,13 @@ typedef U64 ZSTD_VecMask; /* Clarifies when we are interacting with a U64 repr
static U32 ZSTD_VecMask_next(ZSTD_VecMask val) { static U32 ZSTD_VecMask_next(ZSTD_VecMask val) {
assert(val != 0); assert(val != 0);
# if defined(_MSC_VER) && defined(_WIN64) # if defined(_MSC_VER) && defined(_WIN64)
{ if (val != 0) {
unsigned long r; unsigned long r;
/* _BitScanForward64 is not defined outside of x64 */ _BitScanForward64(&r, val);
return _BitScanForward64(&r, val) ? (U32)r : 0; return (U32)(r);
} else {
/* Should not reach this code path */
__assume(0);
} }
# elif (defined(__GNUC__) && ((__GNUC__ > 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 4)))) # elif (defined(__GNUC__) && ((__GNUC__ > 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 4))))
if (sizeof(size_t) == 4) { if (sizeof(size_t) == 4) {
+28 -4
View File
@@ -135,8 +135,14 @@ static unsigned ZDICT_NbCommonBytes (size_t val)
if (MEM_isLittleEndian()) { if (MEM_isLittleEndian()) {
if (MEM_64bits()) { if (MEM_64bits()) {
# if defined(_MSC_VER) && defined(_WIN64) # if defined(_MSC_VER) && defined(_WIN64)
if (val != 0) {
unsigned long r; unsigned long r;
return _BitScanForward64(&r, (U64)val) ? (unsigned)(r >> 3) : 0; _BitScanForward64(&r, (U64)val);
return (unsigned)(r >> 3);
} else {
/* Should not reach this code path */
__assume(0);
}
# elif defined(__GNUC__) && (__GNUC__ >= 3) # elif defined(__GNUC__) && (__GNUC__ >= 3)
return (unsigned)(__builtin_ctzll((U64)val) >> 3); return (unsigned)(__builtin_ctzll((U64)val) >> 3);
# else # else
@@ -145,8 +151,14 @@ static unsigned ZDICT_NbCommonBytes (size_t val)
# endif # endif
} else { /* 32 bits */ } else { /* 32 bits */
# if defined(_MSC_VER) # if defined(_MSC_VER)
if (val != 0) {
unsigned long r; unsigned long r;
return _BitScanForward(&r, (U32)val) ? (unsigned)(r >> 3) : 0; _BitScanForward(&r, (U32)val);
return (unsigned)(r >> 3);
} else {
/* Should not reach this code path */
__assume(0);
}
# elif defined(__GNUC__) && (__GNUC__ >= 3) # elif defined(__GNUC__) && (__GNUC__ >= 3)
return (unsigned)(__builtin_ctz((U32)val) >> 3); return (unsigned)(__builtin_ctz((U32)val) >> 3);
# else # else
@@ -157,8 +169,14 @@ static unsigned ZDICT_NbCommonBytes (size_t val)
} else { /* Big Endian CPU */ } else { /* Big Endian CPU */
if (MEM_64bits()) { if (MEM_64bits()) {
# if defined(_MSC_VER) && defined(_WIN64) # if defined(_MSC_VER) && defined(_WIN64)
if (val != 0) {
unsigned long r; unsigned long r;
return _BitScanReverse64(&r, val) ? (unsigned)(r >> 3) : 0; _BitScanReverse64(&r, val);
return (unsigned)(r >> 3);
} else {
/* Should not reach this code path */
__assume(0);
}
# elif defined(__GNUC__) && (__GNUC__ >= 3) # elif defined(__GNUC__) && (__GNUC__ >= 3)
return (unsigned)(__builtin_clzll(val) >> 3); return (unsigned)(__builtin_clzll(val) >> 3);
# else # else
@@ -171,8 +189,14 @@ static unsigned ZDICT_NbCommonBytes (size_t val)
# endif # endif
} else { /* 32 bits */ } else { /* 32 bits */
# if defined(_MSC_VER) # if defined(_MSC_VER)
if (val != 0) {
unsigned long r; unsigned long r;
return _BitScanReverse(&r, (unsigned long)val) ? (unsigned)(r >> 3) : 0; _BitScanReverse(&r, (unsigned long)val);
return (unsigned)(r >> 3);
} else {
/* Should not reach this code path */
__assume(0);
}
# elif defined(__GNUC__) && (__GNUC__ >= 3) # elif defined(__GNUC__) && (__GNUC__ >= 3)
return (unsigned)(__builtin_clz((U32)val) >> 3); return (unsigned)(__builtin_clz((U32)val) >> 3);
# else # else