When calling gc, avoid saving node in static closures
authordias@eecs.tufts.edu <unknown>
Mon, 23 Mar 2009 20:47:44 +0000 (20:47 +0000)
committerdias@eecs.tufts.edu <unknown>
Mon, 23 Mar 2009 20:47:44 +0000 (20:47 +0000)
compiler/codeGen/StgCmmBind.hs
compiler/codeGen/StgCmmHeap.hs

index 5decdeb..dbeab2b 100644 (file)
@@ -403,7 +403,7 @@ closureCodeBody top_lvl bndr cl_info cc args arity body fv_details
                 ; granYield arg_regs node_points
 
                         -- Main payload
-                ; entryHeapCheck node arity arg_regs $ do
+                ; entryHeapCheck (if node_points then Just node else Nothing) arity arg_regs $ do
                 { enterCostCentre cl_info cc body
                 ; fv_bindings <- mapM bind_fv fv_details
                 -- Load free vars out of closure *after*
@@ -459,7 +459,7 @@ thunkCode cl_info fv_details cc node arity body
        ; granThunk node_points
 
         -- Heap overflow check
-       ; entryHeapCheck node arity [] $ do
+       ; entryHeapCheck (if node_points then Just node else Nothing) arity [] $ do
        {       -- Overwrite with black hole if necessary
                -- but *after* the heap-overflow check
          dflags <- getDynFlags
index ec60953..817a896 100644 (file)
@@ -334,7 +334,7 @@ These are used in the following circumstances
 --------------------------------------------------------------
 -- A heap/stack check at a function or thunk entry point.
 
-entryHeapCheck :: LocalReg     -- Function (closure environment)
+entryHeapCheck :: Maybe LocalReg -- Function (closure environment)
               -> Int           -- Arity -- not same as length args b/c of voids
               -> [LocalReg]    -- Non-void args (empty for thunk)
               -> FCode ()
@@ -344,7 +344,8 @@ entryHeapCheck fun arity args code
   = do updfr_sz <- getUpdFrameOff
        heapCheck True (gc_call updfr_sz) code   -- The 'fun' keeps relevant CAFs alive
   where
-    args'     = fun : args
+    args'     = case fun of Just f  -> f : args
+                            Nothing -> args
     arg_exprs = map (CmmReg . CmmLocal) args'
     gc_call updfr_sz
         | arity == 0 = mkJumpGC (CmmReg (CmmGlobal GCEnter1)) arg_exprs updfr_sz