]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: compiler: add a new "ASSUME" macro to help the compiler
authorWilly Tarreau <w@1wt.eu>
Thu, 7 Nov 2024 10:09:33 +0000 (11:09 +0100)
committerWilly Tarreau <w@1wt.eu>
Tue, 17 Dec 2024 15:46:46 +0000 (16:46 +0100)
This macro takes an expression, tests it and calls an unreachable
statement if false. This allows the compiler to know that such a
combination does not happen, and totally eliminate tests that would
be related to this condition. When the statement is not available
in the compiler, we just perform a break from a do {} while loop
so that the expression remains evaluated if needed (e.g. function
call).

include/haproxy/compiler.h

index 4b23d702d799ea767114e652f434d8e653fe53d7..dbafdac59eda99f8de66ce79e7ed6660be300f4d 100644 (file)
 #endif
 #endif
 
+/* By using an unreachable statement, we can tell the compiler that certain
+ * conditions are not expected to be met and let it arrange as it wants to
+ * optimize some checks away. The principle is to place a test on the condition
+ * and call unreachable upon a match. It may also help static code analyzers
+ * know that some conditions are not supposed to happen. This can only be used
+ * with compilers that support it, and we do not want to emit any static code
+ * for other ones, so we use a construct that the compiler should easily be
+ * able to optimize away.
+ */
+#if __has_builtin(__builtin_unreachable)
+# define ASSUME(expr) do { if (!(expr)) __builtin_unreachable(); } while (0)
+#else
+# define ASSUME(expr) do { if (!(expr)) break; } while (0)
+#endif
+
 /* This prevents the compiler from folding multiple identical code paths into a
  * single one, by adding a dependency on the line number in the path. This may
  * typically happen on function tails, or purposely placed abort() before an