mirror of
https://github.com/postgres/postgres.git
synced 2025-07-20 05:03:10 +03:00
Add pg_assume(expr) macro
This macro can be used to avoid compiler warnings, particularly when using -O3 and not using assertions, and to get the compiler to generate better code. A subsequent commit introduces a first user. Reviewed-by: Tom Lane <tgl@sss.pgh.pa.us> Discussion: https://postgr.es/m/3prdb6hkep3duglhsujrn52bkvnlkvhc54fzvph2emrsm4vodl@77yy6j4hkemb Discussion: https://postgr.es/m/20230316172818.x6375uvheom3ibt2%40awork3.anarazel.de Discussion: https://postgr.es/m/20240207203138.sknifhlppdtgtxnk%40awork3.anarazel.de
This commit is contained in:
@ -332,6 +332,36 @@
|
||||
#define pg_unreachable() abort()
|
||||
#endif
|
||||
|
||||
/*
|
||||
* pg_assume(expr) states that we assume `expr` to evaluate to true. In assert
|
||||
* enabled builds pg_assume() is turned into an assertion, in optimized builds
|
||||
* we try to clue the compiler into the fact that `expr` is true.
|
||||
*
|
||||
* This is useful for two purposes:
|
||||
*
|
||||
* 1) Avoid compiler warnings by telling the compiler about assumptions the
|
||||
* code makes. This is particularly useful when building with optimizations
|
||||
* and w/o assertions.
|
||||
*
|
||||
* 2) Help the compiler to generate more efficient code
|
||||
*
|
||||
* It is unspecified whether `expr` is evaluated, therefore it better be
|
||||
* side-effect free.
|
||||
*/
|
||||
#if defined(USE_ASSERT_CHECKING)
|
||||
#define pg_assume(expr) Assert(expr)
|
||||
#elif defined(HAVE__BUILTIN_UNREACHABLE)
|
||||
#define pg_assume(expr) \
|
||||
do { \
|
||||
if (!(expr)) \
|
||||
__builtin_unreachable(); \
|
||||
} while (0)
|
||||
#elif defined(_MSC_VER)
|
||||
#define pg_assume(expr) __assume(expr)
|
||||
#else
|
||||
#define pg_assume(expr) ((void) 0)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Hints to the compiler about the likelihood of a branch. Both likely() and
|
||||
* unlikely() return the boolean value of the contained expression.
|
||||
|
Reference in New Issue
Block a user