aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndres Freund <andres@anarazel.de>2018-03-28 12:45:32 -0700
committerAndres Freund <andres@anarazel.de>2018-03-28 13:12:15 -0700
commit8a934d6778331f2ac04a40f4f22178a56a232315 (patch)
tree25444959b242ffa5bf7c501b333844a52a371b80
parent266b6acb312fc440c1c1a2036aa9da94916beac6 (diff)
downloadpostgresql-8a934d6778331f2ac04a40f4f22178a56a232315.tar.gz
postgresql-8a934d6778331f2ac04a40f4f22178a56a232315.zip
Use isinf builtin for clang, for performance.
When compiling with clang glibc's definition of isinf() ends up leading to and external libc function call. That's because there was a bug in the builtin in an old gcc version, and clang claims compatibility with an older version. That causes clang to be measurably slower for floating point heavy workloads than gcc. To fix simply redirect isinf when using clang and clang confirms it has __builtin_isinf().
-rw-r--r--src/include/port.h15
1 files changed, 14 insertions, 1 deletions
diff --git a/src/include/port.h b/src/include/port.h
index 3e528fa1725..a514ab758b5 100644
--- a/src/include/port.h
+++ b/src/include/port.h
@@ -343,7 +343,20 @@ extern int getpeereid(int sock, uid_t *uid, gid_t *gid);
#ifndef HAVE_ISINF
extern int isinf(double x);
-#endif
+#else
+/*
+ * Glibc doesn't use the builtin for clang due to a *gcc* bug in a version
+ * newer than the gcc compatibility clang claims to have. This would cause a
+ * *lot* of superflous function calls, therefore revert when using clang.
+ */
+#ifdef __clang__
+/* needs to be separate to not confuse other compilers */
+#if __has_builtin(__builtin_isinf)
+#undef isinf
+#define isinf __builtin_isinf
+#endif /* __has_builtin(isinf) */
+#endif /* __clang__ */
+#endif /* !HAVE_ISINF */
#ifndef HAVE_MKDTEMP
extern char *mkdtemp(char *path);