]> code.delx.au - gnu-emacs/commitdiff
Use __builtin_assume_aligned on untagged Lisp vals
authorPaul Eggert <eggert@cs.ucla.edu>
Tue, 7 Jun 2016 22:41:51 +0000 (15:41 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Tue, 7 Jun 2016 22:44:15 +0000 (15:44 -0700)
* src/conf_post.h (__has_builtin, __builtin_assume_aligned):
New macros, for compilers not already defining them.
(__has_builtin___builtin_assume_aligned): New macro.
* src/lisp.h (lisp_h_XUNTAG): Use __builtin_assume_aligned.
This shrinks text space by 0.2% on x86-64 with GCC 6.1.

src/conf_post.h
src/lisp.h

index bea2a8a587f2ae3864d14c37b48087fcd420f3cb..762aa7727fd5f1ead4b572c0df21b75050dd24a0 100644 (file)
@@ -64,6 +64,15 @@ typedef bool bool_bf;
     (4 < __GNUC__ + (8 <= __GNUC_MINOR__))
 #endif
 
+/* Simulate __has_builtin on compilers that lack it.  It is used only
+   on arguments like __builtin_assume_aligned that are handled in this
+   simulation.  */
+#ifndef __has_builtin
+# define __has_builtin(a) __has_builtin_##a
+# define __has_builtin___builtin_assume_aligned \
+    (4 < __GNUC__ + (7 <= __GNUC_MINOR__))
+#endif
+
 /* Simulate __has_feature on compilers that lack it.  It is used only
    to define ADDRESS_SANITIZER below.  */
 #ifndef __has_feature
@@ -77,6 +86,11 @@ typedef bool bool_bf;
 # define ADDRESS_SANITIZER false
 #endif
 
+/* Yield PTR, which must be aligned to ALIGNMENT.  */
+#if ! __has_builtin (__builtin_assume_aligned)
+# define __builtin_assume_aligned(ptr, alignment, ...) ((void *) (ptr))
+#endif
+
 #ifdef DARWIN_OS
 #ifdef emacs
 #define malloc unexec_malloc
index 1fc6130be0b1fc4f899ab31523e2d280e12fbcd5..4042f4decb13017bb00e6bdb75c5b1c0d5461c10 100644 (file)
@@ -341,7 +341,9 @@ error !;
      (struct Lisp_Symbol *) ((intptr_t) XLI (a) - Lisp_Symbol \
                             + (char *) lispsym))
 # define lisp_h_XTYPE(a) ((enum Lisp_Type) (XLI (a) & ~VALMASK))
-# define lisp_h_XUNTAG(a, type) ((void *) (intptr_t) (XLI (a) - (type)))
+# define lisp_h_XUNTAG(a, type) \
+    __builtin_assume_aligned ((void *) (intptr_t) (XLI (a) - (type)), \
+                             GCALIGNMENT)
 #endif
 
 /* When compiling via gcc -O0, define the key operations as macros, as