From 7a83c4f66cb945d43dcaf8c37f4af1334d34f501 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Tue, 26 May 2020 15:47:59 -0700 Subject: [PATCH] Tweak GC performance if !USE_LSB_TAG 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 | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/src/alloc.c b/src/alloc.c index f8609398a3..e241b9933a 100644 --- a/src/alloc.c +++ b/src/alloc.c @@ -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 -- 2.17.1