From: stassats <sta...@us...> - 2013-08-31 03:30:06
|
The branch "master" has been updated in SBCL: via 35ab27e7aab71c94aa6be12da15603c7fd87fca8 (commit) from 1a0d7598f0cc35d107599fa577c22c92e2453c1f (commit) - Log ----------------------------------------------------------------- commit 35ab27e7aab71c94aa6be12da15603c7fd87fca8 Author: Stas Boukarev <sta...@gm...> Date: Sat Aug 31 07:29:06 2013 +0400 Micro-optimize gc scavenge. Instead of putting the amount by which to increment the pointer and then adding it at the end of the loop, increment the pointer directly. Makes it slightly faster when compiled with GCC. --- src/runtime/gc-common.c | 19 +++++++------------ 1 files changed, 7 insertions(+), 12 deletions(-) diff --git a/src/runtime/gc-common.c b/src/runtime/gc-common.c index 9dfc18f..490e4d1 100644 --- a/src/runtime/gc-common.c +++ b/src/runtime/gc-common.c @@ -121,12 +121,8 @@ scavenge(lispobj *start, sword_t n_words) { lispobj *end = start + n_words; lispobj *object_ptr; - sword_t n_words_scavenged; - - for (object_ptr = start; - object_ptr < end; - object_ptr += n_words_scavenged) { + for (object_ptr = start; object_ptr < end;) { lispobj object = *object_ptr; #ifdef LISP_FEATURE_GENCGC if (forwarding_pointer_p(object_ptr)) @@ -141,16 +137,16 @@ scavenge(lispobj *start, sword_t n_words) if (forwarding_pointer_p(ptr)) { /* Yes, there's a forwarding pointer. */ *object_ptr = LOW_WORD(forwarding_pointer_value(ptr)); - n_words_scavenged = 1; + object_ptr++; } else { /* Scavenge that pointer. */ - n_words_scavenged = + object_ptr += (scavtab[widetag_of(object)])(object_ptr, object); } } else { /* It points somewhere other than oldspace. Leave it * alone. */ - n_words_scavenged = 1; + object_ptr++; } } #if !defined(LISP_FEATURE_X86) && !defined(LISP_FEATURE_X86_64) @@ -166,7 +162,6 @@ scavenge(lispobj *start, sword_t n_words) checking a single word and it's anything other than a pointer, just hush it up */ int widetag = widetag_of(object); - n_words_scavenged = 1; if ((scavtab[widetag] == scav_lose) || (((sizetab[widetag])(object_ptr)) > 1)) { @@ -176,15 +171,15 @@ If you can reproduce this warning, please send a bug report\n\ (see manual page for details).\n", object, object_ptr); } + object_ptr++; } #endif else if (fixnump(object)) { /* It's a fixnum: really easy.. */ - n_words_scavenged = 1; + object_ptr++; } else { /* It's some sort of header object or another. */ - n_words_scavenged = - (scavtab[widetag_of(object)])(object_ptr, object); + object_ptr += (scavtab[widetag_of(object)])(object_ptr, object); } } gc_assert_verbose(object_ptr == end, "Final object pointer %p, start %p, end %p\n", ----------------------------------------------------------------------- hooks/post-receive -- SBCL |