aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndres Freund <andres@anarazel.de>2016-10-14 16:05:30 -0700
committerAndres Freund <andres@anarazel.de>2016-10-14 16:05:30 -0700
commitaa3ca5e3dd60bf0b992b74f955378f28e601292a (patch)
tree1a3c9caaa2d41d2caad31fc638976a299442ca4f /src
parent32fdf42cf546f613aab9ca98935c40a046187fa9 (diff)
downloadpostgresql-aa3ca5e3dd60bf0b992b74f955378f28e601292a.tar.gz
postgresql-aa3ca5e3dd60bf0b992b74f955378f28e601292a.zip
Add likely/unlikely() branch hint macros.
These are useful for very hot code paths. Because it's easy to guess wrongly about likelihood, and because such likelihoods change over time, they should be used sparingly. Past tests have shown it'd be a good idea to use them in some places, e.g. in error checks around ereports that ERROR out, but that's work for later. Discussion: <20160727004333.r3e2k2y6fvk2ntup@alap3.anarazel.de>
Diffstat (limited to 'src')
-rw-r--r--src/include/c.h16
1 files changed, 16 insertions, 0 deletions
diff --git a/src/include/c.h b/src/include/c.h
index 4ab3f8027a5..672e21e03ea 100644
--- a/src/include/c.h
+++ b/src/include/c.h
@@ -939,6 +939,22 @@ typedef NameData *Name;
#endif
+/*
+ * Hints to the compiler about the likelihood of a branch. Both likely() and
+ * unlikely() return the boolean value of the contained expression.
+ *
+ * These should only be used sparingly, in very hot code paths. It's very easy
+ * to mis-estimate likelihoods.
+ */
+#if __GNUC__ >= 3
+#define likely(x) __builtin_expect((x) != 0, 1)
+#define unlikely(x) __builtin_expect((x) != 0, 0)
+#else
+#define likely(x) ((x) != 0)
+#define unlikely(x) ((x) != 0)
+#endif
+
+
/* ----------------------------------------------------------------
* Section 8: random stuff
* ----------------------------------------------------------------