From: Stas Boukarev Date: Sat, 31 Aug 2013 03:29:06 +0000 (+0400) Subject: Micro-optimize gc scavenge. X-Git-Url: http://repo.macrolet.net/gitweb/?a=commitdiff_plain;h=35ab27e7aab71c94aa6be12da15603c7fd87fca8;p=sbcl.git 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. --- 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",