Fix for earger blackholing of thunks with no free variables (#6146)
authorSimon Marlow <marlowsd@gmail.com>
Thu, 7 Jun 2012 14:45:32 +0000 (15:45 +0100)
committerPaolo Capriotti <p.capriotti@gmail.com>
Fri, 8 Jun 2012 14:47:02 +0000 (15:47 +0100)
A thunk with no free variables was not getting blackholed when
-feager-blackholing was on, but we were nevertheless pushing the
stg_bh_upd_frame version of the update frame that expects to see a
black hole.

I fixed this twice for good measure:

 - we now call blackHoleOnEntry when pushing the update frame to check
   whether the closure was actually blackholed, and so that we use the
   same predicate in both places

 - we now black hole thunks even if they have no free variables.
   These only occur when optimisation is off, but presumably if you say
   -feager-blackholing then that's what you want to happen.

MERGED from commit 21a53a1cd5a9784aca7b78cc972f917e71938124

compiler/codeGen/CgClosure.lhs
compiler/codeGen/ClosureInfo.lhs
compiler/codeGen/StgCmmBind.hs
compiler/codeGen/StgCmmClosure.hs

index 96e6395..28d175b 100644 (file)
@@ -504,9 +504,10 @@ setupUpdate closure_info code
       else do
           tickyPushUpdateFrame
           dflags <- getDynFlags
-          if not opt_SccProfilingOn && dopt Opt_EagerBlackHoling dflags
-              then pushBHUpdateFrame (CmmReg nodeReg) code
-              else pushUpdateFrame   (CmmReg nodeReg) code
+          if blackHoleOnEntry closure_info &&
+             not opt_SccProfilingOn && dopt Opt_EagerBlackHoling dflags
+               then pushBHUpdateFrame (CmmReg nodeReg) code
+               else pushUpdateFrame   (CmmReg nodeReg) code
   
   | otherwise  -- A static closure
   = do         { tickyUpdateBhCaf closure_info
index e7ea5f9..0d15e1e 100644 (file)
@@ -725,7 +725,7 @@ blackHoleOnEntry cl_info
   = case closureLFInfo cl_info of
        LFReEntrant _ _ _ _       -> False
         LFLetNoEscape _           -> False
-        LFThunk _ no_fvs _updatable _ _ -> not no_fvs -- to plug space-leaks.
+        LFThunk _ _no_fvs _updatable _ _ -> True
         _other -> panic "blackHoleOnEntry"      -- Should never happen
 
 isKnownFun :: LambdaFormInfo -> Bool
index 9bf57b1..3ae25b4 100644 (file)
@@ -565,12 +565,15 @@ setupUpdate closure_info node body
       then do tickyUpdateFrameOmitted; body
       else do
           tickyPushUpdateFrame
-          --dflags <- getDynFlags
-          let es = [CmmReg (CmmLocal node), mkLblExpr mkUpdInfoLabel]
-          --if not opt_SccProfilingOn && dopt Opt_EagerBlackHoling dflags
-          --  then pushUpdateFrame es body -- XXX black hole
-          --  else pushUpdateFrame es body
-          pushUpdateFrame es body
+          dflags <- getDynFlags
+          let
+              bh = blackHoleOnEntry closure_info &&
+                   not opt_SccProfilingOn && dopt Opt_EagerBlackHoling dflags
+
+              lbl | bh        = mkBHUpdInfoLabel
+                  | otherwise = mkUpdInfoLabel
+
+          pushUpdateFrame [CmmReg (CmmLocal node), mkLblExpr lbl] body
 
   | otherwise  -- A static closure
   = do         { tickyUpdateBhCaf closure_info
@@ -579,7 +582,7 @@ setupUpdate closure_info node body
          then do       -- Blackhole the (updatable) CAF:
                 { upd_closure <- link_caf True
                ; pushUpdateFrame [CmmReg (CmmLocal upd_closure),
-                                     mkLblExpr mkUpdInfoLabel] body } -- XXX black hole
+                                   mkLblExpr mkBHUpdInfoLabel] body }
          else do {tickyUpdateFrameOmitted; body}
     }
 
index 5c0741a..b68ec81 100644 (file)
@@ -720,7 +720,7 @@ blackHoleOnEntry cl_info
   = case closureLFInfo cl_info of
        LFReEntrant _ _ _ _       -> False
        LFLetNoEscape             -> False
-        LFThunk _ no_fvs _updatable _ _ -> not no_fvs -- to plug space-leaks.
+        LFThunk _ _no_fvs _updatable _ _ -> True
         _other -> panic "blackHoleOnEntry"      -- Should never happen
 
 isStaticClosure :: ClosureInfo -> Bool