summaryrefslogtreecommitdiff
path: root/lib/verify.h
diff options
context:
space:
mode:
Diffstat (limited to 'lib/verify.h')
-rw-r--r--lib/verify.h45
1 files changed, 8 insertions, 37 deletions
diff --git a/lib/verify.h b/lib/verify.h
index ca2a1540736..fa1ed717d0e 100644
--- a/lib/verify.h
+++ b/lib/verify.h
@@ -246,13 +246,6 @@ template <int w>
/* @assert.h omit start@ */
-#if defined __has_builtin
-/* <https://clang.llvm.org/docs/LanguageExtensions.html#builtin-functions> */
-# define _GL_HAS_BUILTIN_ASSUME __has_builtin (__builtin_assume)
-#else
-# define _GL_HAS_BUILTIN_ASSUME 0
-#endif
-
#if 3 < __GNUC__ + (3 < __GNUC_MINOR__ + (4 <= __GNUC_PATCHLEVEL__))
# define _GL_HAS_BUILTIN_TRAP 1
#elif defined __has_builtin
@@ -312,36 +305,14 @@ template <int w>
Although assuming R can help a compiler generate better code or
diagnostics, performance can suffer if R uses hard-to-optimize
- features such as function calls not inlined by the compiler. */
-
-/* Use __builtin_assume in preference to __builtin_unreachable, because
- in clang versions 8.0.x and older, the definition based on
- __builtin_assume has an effect on optimizations, whereas the definition
- based on __builtin_unreachable does not. (GCC so far has only
- __builtin_unreachable.) */
-#if _GL_HAS_BUILTIN_ASSUME
-/* Use __builtin_constant_p to help clang's data-flow analysis for the case
- assume (0).
- Use a temporary variable, to avoid a clang warning
- "the argument to '__builtin_assume' has side effects that will be discarded"
- if R contains invocations of functions not marked as 'const'.
- The type of the temporary variable can't be __typeof__ (R), because that
- does not work on bit field expressions. Use '_Bool' or 'bool' as type
- instead. */
-# if defined __cplusplus
-# define assume(R) \
- (__builtin_constant_p (R) && !(R) \
- ? (void) __builtin_unreachable () \
- : (void) ({ bool _gl_verify_temp = (R); \
- __builtin_assume (_gl_verify_temp); }))
-# else
-# define assume(R) \
- (__builtin_constant_p (R) && !(R) \
- ? (void) __builtin_unreachable () \
- : (void) ({ _Bool _gl_verify_temp = (R); \
- __builtin_assume (_gl_verify_temp); }))
-# endif
-#elif _GL_HAS_BUILTIN_UNREACHABLE
+ features such as function calls not inlined by the compiler.
+
+ Avoid Clang's __builtin_assume, as it breaks GNU Emacs master
+ as of 2020-08-23T21:09:49Z!eggert@cs.ucla.edu; see
+ <https://bugs.gnu.org/43152#71>. It's not known whether this breakage
+ is a Clang bug or an Emacs bug; play it safe for now. */
+
+#if _GL_HAS_BUILTIN_UNREACHABLE
# define assume(R) ((R) ? (void) 0 : __builtin_unreachable ())
#elif 1200 <= _MSC_VER
# define assume(R) __assume (R)