summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2020-05-26 15:47:59 -0700
committerPaul Eggert <eggert@cs.ucla.edu>2020-05-26 15:48:31 -0700
commit0fc4989f34bdaf1bc443d05ece886ea91e7bc9cc (patch)
treeeb37822b28a5ffc655030c24c973572883fa4b0a
parent5467aac131fb49ff2af57ca21d7ec9cba7c19c82 (diff)
downloademacs-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.c21
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