diff options
author | Paul Eggert <eggert@cs.ucla.edu> | 2020-05-26 15:47:59 -0700 |
---|---|---|
committer | Paul Eggert <eggert@cs.ucla.edu> | 2020-05-26 15:48:31 -0700 |
commit | 0fc4989f34bdaf1bc443d05ece886ea91e7bc9cc (patch) | |
tree | eb37822b28a5ffc655030c24c973572883fa4b0a | |
parent | 5467aac131fb49ff2af57ca21d7ec9cba7c19c82 (diff) | |
download | emacs-0fc4989f34bdaf1bc443d05ece886ea91e7bc9cc.tar.gz emacs-0fc4989f34bdaf1bc443d05ece886ea91e7bc9cc.tar.bz2 emacs-0fc4989f34bdaf1bc443d05ece886ea91e7bc9cc.zip |
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.
-rw-r--r-- | src/alloc.c | 21 |
1 files changed, 19 insertions, 2 deletions
diff --git a/src/alloc.c b/src/alloc.c index f8609398a3f..e241b9933a4 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 |