Micro-optimize gc scavenge.
authorStas Boukarev <stassats@gmail.com>
Sat, 31 Aug 2013 03:29:06 +0000 (07:29 +0400)
committerStas Boukarev <stassats@gmail.com>
Sat, 31 Aug 2013 03:29:06 +0000 (07:29 +0400)
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

index 9dfc18f..490e4d1 100644 (file)
@@ -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",