]> git.eshelyaron.com Git - emacs.git/commitdiff
Tweak GC performance if !USE_LSB_TAG
authorPaul Eggert <eggert@cs.ucla.edu>
Tue, 26 May 2020 22:47:59 +0000 (15:47 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Tue, 26 May 2020 22:48:31 +0000 (15:48 -0700)
Performance issue reported by Eli Zaretskii (Bug#41321#149).
* src/alloc.c (GC_OBJECT_ALIGNMENT_MINIMUM): New constant.
(maybe_lisp_pointer): Use it instead of GCALIGNMENT.

src/alloc.c

index f8609398a3f4098fa8777e1b2d4e3da29fee92c9..e241b9933a4474cac7353cb471944d6499c98993 100644 (file)
@@ -4687,16 +4687,33 @@ mark_maybe_objects (Lisp_Object const *array, ptrdiff_t nelts)
     mark_maybe_object (*array);
 }
 
+/* A lower bound on the alignment of Lisp objects that need marking.
+   Although 1 is safe, higher values speed up mark_maybe_pointer.
+   If USE_LSB_TAG, this value is typically GCALIGNMENT; otherwise,
+   it's determined by the natural alignment of Lisp structs.
+   All vectorlike objects have alignment at least that of union
+   vectorlike_header and it's unlikely they all have alignment greater,
+   so use the union as a safe and likely-accurate standin for
+   vectorlike objects.  */
+
+enum { GC_OBJECT_ALIGNMENT_MINIMUM
+         = max (GCALIGNMENT,
+               min (alignof (union vectorlike_header),
+                    min (min (alignof (struct Lisp_Cons),
+                              alignof (struct Lisp_Float)),
+                         min (alignof (struct Lisp_String),
+                              alignof (struct Lisp_Symbol))))) };
+
 /* Return true if P might point to Lisp data that can be garbage
    collected, and false otherwise (i.e., false if it is easy to see
    that P cannot point to Lisp data that can be garbage collected).
    Symbols are implemented via offsets not pointers, but the offsets
-   are also multiples of GCALIGNMENT.  */
+   are also multiples of GC_OBJECT_ALIGNMENT_MINIMUM.  */
 
 static bool
 maybe_lisp_pointer (void *p)
 {
-  return (uintptr_t) p % GCALIGNMENT == 0;
+  return (uintptr_t) p % GC_OBJECT_ALIGNMENT_MINIMUM == 0;
 }
 
 /* If P points to Lisp data, mark that as live if it isn't already