diff --git a/rts/sm/GCUtils.c b/rts/sm/GCUtils.c
index f491fdd992a97a5e4e8a938eea0a0b0a2f327201..30ed8e62597e3e9cfc197501c6cba6846fb09174 100644
--- a/rts/sm/GCUtils.c
+++ b/rts/sm/GCUtils.c
@@ -341,7 +341,7 @@ alloc_todo_block (gen_workspace *ws, uint32_t size)
     ws->todo_bd = bd;
     ws->todo_free = bdescr_free(bd);
     ws->todo_lim  = stg_min(bdescr_start(bd) + bd->blocks * BLOCK_SIZE_W,
-                            bdescr_free(bd) + stg_max(WORK_UNIT_WORDS,size));
+                            ws->todo_free + stg_max(WORK_UNIT_WORDS,size));
                      // See Note [big objects]
 
     debugTrace(DEBUG_gc, "alloc new todo block %p for gen  %d",
diff --git a/rts/sm/Scav.c b/rts/sm/Scav.c
index 86dd58bbb44a7adbfa31e3015da02f203319321d..13ed14673ab56e4c7677a2886dd5de7369de403c 100644
--- a/rts/sm/Scav.c
+++ b/rts/sm/Scav.c
@@ -838,11 +838,11 @@ scavenge_block (bdescr *bd)
   }
 
   debugTrace(DEBUG_gc, "   scavenged %ld bytes",
-             (unsigned long)((bdescr_free(bd) - bd->u.scan) * sizeof(W_)));
+             (unsigned long)((free - bd->u.scan) * sizeof(W_)));
 
   // update stats: this is a block that has been scavenged
-  gct->scanned += bdescr_free(bd) - bd->u.scan;
-  bd->u.scan = bdescr_free(bd);
+  gct->scanned += free - bd->u.scan;
+  bd->u.scan = free;
 
   if (bd != ws->todo_bd) {
       // we're not going to evac any more objects into