1
0
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:
Andres Freund
2025-07-09 18:38:05 -04:00
parent 4df477153a
commit d65eb5b1b8

View File

@ -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.