small GC optimisation
authorSimon Marlow <marlowsd@gmail.com>
Fri, 3 Apr 2009 08:37:08 +0000 (08:37 +0000)
committerSimon Marlow <marlowsd@gmail.com>
Fri, 3 Apr 2009 08:37:08 +0000 (08:37 +0000)
rts/sm/Evac.c
rts/sm/GCUtils.c

index 6325a12..5935f90 100644 (file)
@@ -74,10 +74,10 @@ alloc_for_copy (nat size, step *stp)
      * necessary.
      */
     to = ws->todo_free;
-    if (to + size > ws->todo_lim) {
+    ws->todo_free += size;
+    if (ws->todo_free > ws->todo_lim) {
        to = todo_block_full(size, ws);
     }
-    ws->todo_free = to + size;
     ASSERT(ws->todo_free >= ws->todo_bd->free && ws->todo_free <= ws->todo_lim);
 
     return to;
index 86d2282..57cede7 100644 (file)
@@ -149,8 +149,13 @@ push_scanned_block (bdescr *bd, step_workspace *ws)
 StgPtr
 todo_block_full (nat size, step_workspace *ws)
 {
+    StgPtr p;
     bdescr *bd;
 
+    // todo_free has been pre-incremented by Evac.c:alloc_for_copy().  We
+    // are expected to leave it bumped when we've finished here.
+    ws->todo_free -= size;
+
     bd = ws->todo_bd;
 
     ASSERT(bd != NULL);
@@ -167,7 +172,9 @@ todo_block_full (nat size, step_workspace *ws)
             ws->todo_lim = stg_min(bd->start + BLOCK_SIZE_W,
                                    ws->todo_lim + stg_max(WORK_UNIT_WORDS,size));
             debugTrace(DEBUG_gc, "increasing limit for %p to %p", bd->start, ws->todo_lim);
-            return ws->todo_free;
+            p = ws->todo_free;
+            ws->todo_free += size;
+            return p;
         }
     }
     
@@ -212,7 +219,9 @@ todo_block_full (nat size, step_workspace *ws)
 
     alloc_todo_block(ws, size);
 
-    return ws->todo_free;
+    p = ws->todo_free;
+    ws->todo_free += size;
+    return p;
 }
 
 StgPtr