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()
|
#define pg_unreachable() abort()
|
||||||
#endif
|
#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
|
* Hints to the compiler about the likelihood of a branch. Both likely() and
|
||||||
* unlikely() return the boolean value of the contained expression.
|
* unlikely() return the boolean value of the contained expression.
|
||||||
|
Reference in New Issue
Block a user