From 35ab27e7aab71c94aa6be12da15603c7fd87fca8 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Sat, 31 Aug 2013 07:29:06 +0400 Subject: [PATCH] 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 file 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", -- 1.7.10.4