Haskell Program Coverage
[ghc-hetmet.git] / compiler / stgSyn / CoreToStg.lhs
1 %
2 % (c) The GRASP/AQUA Project, Glasgow University, 1993-1998
3 %
4 \section[CoreToStg]{Converts Core to STG Syntax}
5
6 And, as we have the info in hand, we may convert some lets to
7 let-no-escapes.
8
9 \begin{code}
10 module CoreToStg ( coreToStg, coreExprToStg ) where
11
12 #include "HsVersions.h"
13
14 import CoreSyn
15 import CoreUtils        ( rhsIsStatic, manifestArity, exprType, findDefault )
16 import StgSyn
17
18 import Type
19 import Coercion         ( mkUnsafeCoercion )
20 import TyCon            ( isAlgTyCon )
21 import Id
22 import Var              ( Var, globalIdDetails, idType )
23 import TyCon            ( isUnboxedTupleTyCon, isPrimTyCon, isFunTyCon, isHiBootTyCon )
24 import IdInfo
25 import DataCon
26 import CostCentre       ( noCCS )
27 import VarSet
28 import VarEnv
29 import Maybes           ( maybeToBool )
30 import Name             ( getOccName, isExternalName, nameOccName )
31 import OccName          ( occNameString, occNameFS )
32 import BasicTypes       ( Arity )
33 import StaticFlags      ( opt_RuntimeTypes )
34 import PackageConfig    ( PackageId )
35 import Outputable
36
37 infixr 9 `thenLne`
38 \end{code}
39
40 %************************************************************************
41 %*                                                                      *
42 \subsection[live-vs-free-doc]{Documentation}
43 %*                                                                      *
44 %************************************************************************
45
46 (There is other relevant documentation in codeGen/CgLetNoEscape.)
47
48 The actual Stg datatype is decorated with {\em live variable}
49 information, as well as {\em free variable} information.  The two are
50 {\em not} the same.  Liveness is an operational property rather than a
51 semantic one.  A variable is live at a particular execution point if
52 it can be referred to {\em directly} again.  In particular, a dead
53 variable's stack slot (if it has one):
54 \begin{enumerate}
55 \item
56 should be stubbed to avoid space leaks, and
57 \item
58 may be reused for something else.
59 \end{enumerate}
60
61 There ought to be a better way to say this.  Here are some examples:
62 \begin{verbatim}
63         let v = [q] \[x] -> e
64         in
65         ...v...  (but no q's)
66 \end{verbatim}
67
68 Just after the `in', v is live, but q is dead.  If the whole of that
69 let expression was enclosed in a case expression, thus:
70 \begin{verbatim}
71         case (let v = [q] \[x] -> e in ...v...) of
72                 alts[...q...]
73 \end{verbatim}
74 (ie @alts@ mention @q@), then @q@ is live even after the `in'; because
75 we'll return later to the @alts@ and need it.
76
77 Let-no-escapes make this a bit more interesting:
78 \begin{verbatim}
79         let-no-escape v = [q] \ [x] -> e
80         in
81         ...v...
82 \end{verbatim}
83 Here, @q@ is still live at the `in', because @v@ is represented not by
84 a closure but by the current stack state.  In other words, if @v@ is
85 live then so is @q@.  Furthermore, if @e@ mentions an enclosing
86 let-no-escaped variable, then {\em its} free variables are also live
87 if @v@ is.
88
89 %************************************************************************
90 %*                                                                      *
91 \subsection[caf-info]{Collecting live CAF info}
92 %*                                                                      *
93 %************************************************************************
94
95 In this pass we also collect information on which CAFs are live for 
96 constructing SRTs (see SRT.lhs).  
97
98 A top-level Id has CafInfo, which is
99
100         - MayHaveCafRefs, if it may refer indirectly to
101           one or more CAFs, or
102         - NoCafRefs if it definitely doesn't
103
104 The CafInfo has already been calculated during the CoreTidy pass.
105
106 During CoreToStg, we then pin onto each binding and case expression, a
107 list of Ids which represents the "live" CAFs at that point.  The meaning
108 of "live" here is the same as for live variables, see above (which is
109 why it's convenient to collect CAF information here rather than elsewhere).
110
111 The later SRT pass takes these lists of Ids and uses them to construct
112 the actual nested SRTs, and replaces the lists of Ids with (offset,length)
113 pairs.
114
115
116 Interaction of let-no-escape with SRTs   [Sept 01]
117 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
118 Consider
119
120         let-no-escape x = ...caf1...caf2...
121         in
122         ...x...x...x...
123
124 where caf1,caf2 are CAFs.  Since x doesn't have a closure, we 
125 build SRTs just as if x's defn was inlined at each call site, and
126 that means that x's CAF refs get duplicated in the overall SRT.
127
128 This is unlike ordinary lets, in which the CAF refs are not duplicated.
129
130 We could fix this loss of (static) sharing by making a sort of pseudo-closure
131 for x, solely to put in the SRTs lower down.
132
133
134 %************************************************************************
135 %*                                                                      *
136 \subsection[binds-StgVarInfo]{Setting variable info: top-level, binds, RHSs}
137 %*                                                                      *
138 %************************************************************************
139
140 \begin{code}
141 coreToStg :: PackageId -> [CoreBind] -> IO [StgBinding]
142 coreToStg this_pkg pgm
143   = return pgm'
144   where (_, _, pgm') = coreTopBindsToStg this_pkg emptyVarEnv pgm
145
146 coreExprToStg :: CoreExpr -> StgExpr
147 coreExprToStg expr 
148   = new_expr where (new_expr,_,_) = initLne emptyVarEnv (coreToStgExpr expr)
149
150
151 coreTopBindsToStg
152     :: PackageId
153     -> IdEnv HowBound           -- environment for the bindings
154     -> [CoreBind]
155     -> (IdEnv HowBound, FreeVarsInfo, [StgBinding])
156
157 coreTopBindsToStg this_pkg env [] = (env, emptyFVInfo, [])
158 coreTopBindsToStg this_pkg env (b:bs)
159   = (env2, fvs2, b':bs')
160   where
161         -- env accumulates down the list of binds, fvs accumulates upwards
162         (env1, fvs2, b' ) = coreTopBindToStg this_pkg env fvs1 b
163         (env2, fvs1, bs') = coreTopBindsToStg this_pkg env1 bs
164
165
166 coreTopBindToStg
167         :: PackageId
168         -> IdEnv HowBound
169         -> FreeVarsInfo         -- Info about the body
170         -> CoreBind
171         -> (IdEnv HowBound, FreeVarsInfo, StgBinding)
172
173 coreTopBindToStg this_pkg env body_fvs (NonRec id rhs)
174   = let 
175         env'      = extendVarEnv env id how_bound
176         how_bound = LetBound TopLet $! manifestArity rhs
177
178         (stg_rhs, fvs') = 
179             initLne env (
180               coreToTopStgRhs this_pkg body_fvs (id,rhs)        `thenLne` \ (stg_rhs, fvs') ->
181               returnLne (stg_rhs, fvs')
182            )
183         
184         bind = StgNonRec id stg_rhs
185     in
186     ASSERT2(manifestArity rhs == stgRhsArity stg_rhs, ppr id $$ (ptext SLIT("rhs:")) <+> ppr rhs $$ (ptext SLIT("stg_rhs:"))<+> ppr stg_rhs $$ (ptext SLIT("Manifest:")) <+> (ppr $ manifestArity rhs) $$ (ptext SLIT("STG:")) <+>(ppr $ stgRhsArity stg_rhs) )
187     ASSERT2(consistentCafInfo id bind, ppr id)
188 --    WARN(not (consistent caf_info bind), ppr id <+> ppr cafs <+> ppCafInfo caf_info)
189     (env', fvs' `unionFVInfo` body_fvs, bind)
190
191 coreTopBindToStg this_pkg env body_fvs (Rec pairs)
192   = let 
193         (binders, rhss) = unzip pairs
194
195         extra_env' = [ (b, LetBound TopLet $! manifestArity rhs)
196                      | (b, rhs) <- pairs ]
197         env' = extendVarEnvList env extra_env'
198
199         (stg_rhss, fvs')
200           = initLne env' (
201                mapAndUnzipLne (coreToTopStgRhs this_pkg body_fvs) pairs
202                                                 `thenLne` \ (stg_rhss, fvss') ->
203                let fvs' = unionFVInfos fvss' in
204                returnLne (stg_rhss, fvs')
205            )
206
207         bind = StgRec (zip binders stg_rhss)
208     in
209     ASSERT2(and [manifestArity rhs == stgRhsArity stg_rhs | (rhs,stg_rhs) <- rhss `zip` stg_rhss], ppr binders)
210     ASSERT2(consistentCafInfo (head binders) bind, ppr binders)
211     (env', fvs' `unionFVInfo` body_fvs, bind)
212
213 #ifdef DEBUG
214 -- Assertion helper: this checks that the CafInfo on the Id matches
215 -- what CoreToStg has figured out about the binding's SRT.  The
216 -- CafInfo will be exact in all cases except when CorePrep has
217 -- floated out a binding, in which case it will be approximate.
218 consistentCafInfo id bind
219   | occNameFS (nameOccName (idName id)) == FSLIT("sat")
220   = safe
221   | otherwise
222   = WARN (not exact, ppr id) safe
223   where
224         safe  = id_marked_caffy || not binding_is_caffy
225         exact = id_marked_caffy == binding_is_caffy
226         id_marked_caffy  = mayHaveCafRefs (idCafInfo id)
227         binding_is_caffy = stgBindHasCafRefs bind
228 #endif
229 \end{code}
230
231 \begin{code}
232 coreToTopStgRhs
233         :: PackageId
234         -> FreeVarsInfo         -- Free var info for the scope of the binding
235         -> (Id,CoreExpr)
236         -> LneM (StgRhs, FreeVarsInfo)
237
238 coreToTopStgRhs this_pkg scope_fv_info (bndr, rhs)
239   = coreToStgExpr rhs           `thenLne` \ (new_rhs, rhs_fvs, _) ->
240     freeVarsToLiveVars rhs_fvs  `thenLne` \ lv_info ->
241     returnLne (mkTopStgRhs is_static rhs_fvs (mkSRT lv_info) bndr_info new_rhs, rhs_fvs)
242   where
243     bndr_info = lookupFVInfo scope_fv_info bndr
244     is_static = rhsIsStatic this_pkg rhs
245
246 mkTopStgRhs :: Bool -> FreeVarsInfo -> SRT -> StgBinderInfo -> StgExpr
247         -> StgRhs
248
249 mkTopStgRhs is_static rhs_fvs srt binder_info (StgLam _ bndrs body)
250   = ASSERT( is_static )
251     StgRhsClosure noCCS binder_info
252                   (getFVs rhs_fvs)               
253                   ReEntrant
254                   srt
255                   bndrs body
256         
257 mkTopStgRhs is_static rhs_fvs srt binder_info (StgConApp con args)
258   | is_static    -- StgConApps can be updatable (see isCrossDllConApp)
259   = StgRhsCon noCCS con args
260
261 mkTopStgRhs is_static rhs_fvs srt binder_info rhs
262   = ASSERT2( not is_static, ppr rhs )
263     StgRhsClosure noCCS binder_info
264                   (getFVs rhs_fvs)               
265                   Updatable
266                   srt
267                   [] rhs
268 \end{code}
269
270
271 -- ---------------------------------------------------------------------------
272 -- Expressions
273 -- ---------------------------------------------------------------------------
274
275 \begin{code}
276 coreToStgExpr
277         :: CoreExpr
278         -> LneM (StgExpr,       -- Decorated STG expr
279                  FreeVarsInfo,  -- Its free vars (NB free, not live)
280                  EscVarsSet)    -- Its escapees, a subset of its free vars;
281                                 -- also a subset of the domain of the envt
282                                 -- because we are only interested in the escapees
283                                 -- for vars which might be turned into
284                                 -- let-no-escaped ones.
285 \end{code}
286
287 The second and third components can be derived in a simple bottom up pass, not
288 dependent on any decisions about which variables will be let-no-escaped or
289 not.  The first component, that is, the decorated expression, may then depend
290 on these components, but it in turn is not scrutinised as the basis for any
291 decisions.  Hence no black holes.
292
293 \begin{code}
294 coreToStgExpr (Lit l) = returnLne (StgLit l, emptyFVInfo, emptyVarSet)
295 coreToStgExpr (Var v) = coreToStgApp Nothing v []
296
297 coreToStgExpr expr@(App _ _)
298   = coreToStgApp Nothing f args
299   where
300     (f, args) = myCollectArgs expr
301
302 coreToStgExpr expr@(Lam _ _)
303   = let
304         (args, body) = myCollectBinders expr 
305         args'        = filterStgBinders args
306     in
307     extendVarEnvLne [ (a, LambdaBound) | a <- args' ] $
308     coreToStgExpr body  `thenLne` \ (body, body_fvs, body_escs) ->
309     let
310         fvs             = args' `minusFVBinders` body_fvs
311         escs            = body_escs `delVarSetList` args'
312         result_expr | null args' = body
313                     | otherwise  = StgLam (exprType expr) args' body
314     in
315     returnLne (result_expr, fvs, escs)
316
317 coreToStgExpr (Note (SCC cc) expr)
318   = coreToStgExpr expr          `thenLne` ( \ (expr2, fvs, escs) ->
319     returnLne (StgSCC cc expr2, fvs, escs) )
320
321 coreToStgExpr (Note (TickBox m n) expr)
322   = coreToStgExpr expr         `thenLne` ( \ (expr2, fvs, escs) ->
323     returnLne (StgTick m n expr2, fvs, escs) )
324
325 -- BinaryTickBox'es are are removed by the CorePrep pass.
326
327 coreToStgExpr expr@(Note (BinaryTickBox m t e) _)       
328   = pprPanic "coreToStgExpr: " (ppr expr)
329
330 coreToStgExpr (Note other_note expr)
331   = coreToStgExpr expr
332
333 coreToStgExpr (Cast expr co)
334   = coreToStgExpr expr
335
336 -- Cases require a little more real work.
337
338 coreToStgExpr (Case scrut bndr _ alts)
339   = extendVarEnvLne [(bndr, LambdaBound)]       (
340          mapAndUnzip3Lne vars_alt alts  `thenLne` \ (alts2, fvs_s, escs_s) ->
341          returnLne ( alts2,
342                      unionFVInfos fvs_s,
343                      unionVarSets escs_s )
344     )                                   `thenLne` \ (alts2, alts_fvs, alts_escs) ->
345     let
346         -- Determine whether the default binder is dead or not
347         -- This helps the code generator to avoid generating an assignment
348         -- for the case binder (is extremely rare cases) ToDo: remove.
349         bndr' | bndr `elementOfFVInfo` alts_fvs = bndr
350               | otherwise                       = bndr `setIdOccInfo` IAmDead
351
352         -- Don't consider the default binder as being 'live in alts',
353         -- since this is from the point of view of the case expr, where
354         -- the default binder is not free.
355         alts_fvs_wo_bndr  = bndr `minusFVBinder` alts_fvs
356         alts_escs_wo_bndr = alts_escs `delVarSet` bndr
357     in
358
359     freeVarsToLiveVars alts_fvs_wo_bndr         `thenLne` \ alts_lv_info ->
360
361         -- We tell the scrutinee that everything 
362         -- live in the alts is live in it, too.
363     setVarsLiveInCont alts_lv_info (
364         coreToStgExpr scrut       `thenLne` \ (scrut2, scrut_fvs, scrut_escs) ->
365         freeVarsToLiveVars scrut_fvs `thenLne` \ scrut_lv_info ->
366         returnLne (scrut2, scrut_fvs, scrut_escs, scrut_lv_info)
367       )    
368                 `thenLne` \ (scrut2, scrut_fvs, scrut_escs, scrut_lv_info) ->
369
370     returnLne (
371       StgCase scrut2 (getLiveVars scrut_lv_info)
372                      (getLiveVars alts_lv_info)
373                      bndr'
374                      (mkSRT alts_lv_info)
375                      (mkStgAltType (idType bndr) alts)
376                      alts2,
377       scrut_fvs `unionFVInfo` alts_fvs_wo_bndr,
378       alts_escs_wo_bndr `unionVarSet` getFVSet scrut_fvs
379                 -- You might think we should have scrut_escs, not 
380                 -- (getFVSet scrut_fvs), but actually we can't call, and 
381                 -- then return from, a let-no-escape thing.
382       )
383   where
384     vars_alt (con, binders, rhs)
385       = let     -- Remove type variables
386             binders' = filterStgBinders binders
387         in      
388         extendVarEnvLne [(b, LambdaBound) | b <- binders']      $
389         coreToStgExpr rhs       `thenLne` \ (rhs2, rhs_fvs, rhs_escs) ->
390         let
391                 -- Records whether each param is used in the RHS
392             good_use_mask = [ b `elementOfFVInfo` rhs_fvs | b <- binders' ]
393         in
394         returnLne ( (con, binders', good_use_mask, rhs2),
395                     binders' `minusFVBinders` rhs_fvs,
396                     rhs_escs `delVarSetList` binders' )
397                 -- ToDo: remove the delVarSet;
398                 -- since escs won't include any of these binders
399 \end{code}
400
401 Lets not only take quite a bit of work, but this is where we convert
402 then to let-no-escapes, if we wish.
403
404 (Meanwhile, we don't expect to see let-no-escapes...)
405 \begin{code}
406 coreToStgExpr (Let bind body)
407   = fixLne (\ ~(_, _, _, no_binder_escapes) ->
408         coreToStgLet no_binder_escapes bind body
409     )                           `thenLne` \ (new_let, fvs, escs, _) ->
410
411     returnLne (new_let, fvs, escs)
412 \end{code}
413
414 \begin{code}
415 mkStgAltType scrut_ty alts
416   = case splitTyConApp_maybe (repType scrut_ty) of
417         Just (tc,_) | isUnboxedTupleTyCon tc -> UbxTupAlt tc
418                     | isPrimTyCon tc         -> PrimAlt tc
419                     | isHiBootTyCon tc       -> look_for_better_tycon
420                     | isAlgTyCon tc          -> AlgAlt tc
421                     | isFunTyCon tc          -> PolyAlt
422                     | otherwise              -> pprPanic "mkStgAlts" (ppr tc)
423         Nothing                              -> PolyAlt
424
425   where
426    -- Sometimes, the TyCon in the type of the scrutinee is an HiBootTyCon,
427    -- which may not have any constructors inside it.  If so, then we
428    -- can get a better TyCon by grabbing the one from a constructor alternative
429    -- if one exists.
430    look_for_better_tycon
431         | ((DataAlt con, _, _) : _) <- data_alts = 
432                 AlgAlt (dataConTyCon con)
433         | otherwise =
434                 ASSERT(null data_alts)
435                 PolyAlt
436         where
437                 (data_alts, _deflt) = findDefault alts
438 \end{code}
439
440
441 -- ---------------------------------------------------------------------------
442 -- Applications
443 -- ---------------------------------------------------------------------------
444
445 \begin{code}
446 coreToStgApp
447          :: Maybe UpdateFlag            -- Just upd <=> this application is
448                                         -- the rhs of a thunk binding
449                                         --      x = [...] \upd [] -> the_app
450                                         -- with specified update flag
451         -> Id                           -- Function
452         -> [CoreArg]                    -- Arguments
453         -> LneM (StgExpr, FreeVarsInfo, EscVarsSet)
454
455 coreToStgApp maybe_thunk_body f args
456   = coreToStgArgs args          `thenLne` \ (args', args_fvs) ->
457     lookupVarLne f              `thenLne` \ how_bound ->
458
459     let
460         n_val_args       = valArgCount args
461         not_letrec_bound = not (isLetBound how_bound)
462         fun_fvs          
463           = let fvs = singletonFVInfo f how_bound fun_occ in
464             -- e.g. (f :: a -> int) (x :: a) 
465             -- Here the free variables are "f", "x" AND the type variable "a"
466             -- coreToStgArgs will deal with the arguments recursively
467             if opt_RuntimeTypes then
468               fvs `unionFVInfo` tyvarFVInfo (tyVarsOfType (idType f))
469             else fvs
470
471         -- Mostly, the arity info of a function is in the fn's IdInfo
472         -- But new bindings introduced by CoreSat may not have no
473         -- arity info; it would do us no good anyway.  For example:
474         --      let f = \ab -> e in f
475         -- No point in having correct arity info for f!
476         -- Hence the hasArity stuff below.
477         -- NB: f_arity is only consulted for LetBound things
478         f_arity   = stgArity f how_bound
479         saturated = f_arity <= n_val_args
480
481         fun_occ 
482          | not_letrec_bound         = noBinderInfo      -- Uninteresting variable
483          | f_arity > 0 && saturated = stgSatOcc -- Saturated or over-saturated function call
484          | otherwise                = stgUnsatOcc       -- Unsaturated function or thunk
485
486         fun_escs
487          | not_letrec_bound      = emptyVarSet  -- Only letrec-bound escapees are interesting
488          | f_arity == n_val_args = emptyVarSet  -- A function *or thunk* with an exactly
489                                                 -- saturated call doesn't escape
490                                                 -- (let-no-escape applies to 'thunks' too)
491
492          | otherwise         = unitVarSet f     -- Inexact application; it does escape
493
494         -- At the moment of the call:
495
496         --  either the function is *not* let-no-escaped, in which case
497         --         nothing is live except live_in_cont
498         --      or the function *is* let-no-escaped in which case the
499         --         variables it uses are live, but still the function
500         --         itself is not.  PS.  In this case, the function's
501         --         live vars should already include those of the
502         --         continuation, but it does no harm to just union the
503         --         two regardless.
504
505         res_ty = exprType (mkApps (Var f) args)
506         app = case globalIdDetails f of
507                 DataConWorkId dc | saturated -> StgConApp dc args'
508                 PrimOpId op                  -> ASSERT( saturated )
509                                                 StgOpApp (StgPrimOp op) args' res_ty
510                 FCallId call     -> ASSERT( saturated )
511                                     StgOpApp (StgFCallOp call (idUnique f)) args' res_ty
512                 _other           -> StgApp f args'
513
514     in
515     returnLne (
516         app,
517         fun_fvs  `unionFVInfo` args_fvs,
518         fun_escs `unionVarSet` (getFVSet args_fvs)
519                                 -- All the free vars of the args are disqualified
520                                 -- from being let-no-escaped.
521     )
522
523
524
525 -- ---------------------------------------------------------------------------
526 -- Argument lists
527 -- This is the guy that turns applications into A-normal form
528 -- ---------------------------------------------------------------------------
529
530 coreToStgArgs :: [CoreArg] -> LneM ([StgArg], FreeVarsInfo)
531 coreToStgArgs []
532   = returnLne ([], emptyFVInfo)
533
534 coreToStgArgs (Type ty : args)  -- Type argument
535   = coreToStgArgs args  `thenLne` \ (args', fvs) ->
536     if opt_RuntimeTypes then
537         returnLne (StgTypeArg ty : args', fvs `unionFVInfo` tyvarFVInfo (tyVarsOfType ty))
538     else
539     returnLne (args', fvs)
540
541 coreToStgArgs (arg : args)      -- Non-type argument
542   = coreToStgArgs args  `thenLne` \ (stg_args, args_fvs) ->
543     coreToStgExpr arg   `thenLne` \ (arg', arg_fvs, escs) ->
544     let
545         fvs = args_fvs `unionFVInfo` arg_fvs
546         stg_arg = case arg' of
547                        StgApp v []      -> StgVarArg v
548                        StgConApp con [] -> StgVarArg (dataConWorkId con)
549                        StgLit lit       -> StgLitArg lit
550                        _                -> pprPanic "coreToStgArgs" (ppr arg)
551     in
552     returnLne (stg_arg : stg_args, fvs)
553
554
555 -- ---------------------------------------------------------------------------
556 -- The magic for lets:
557 -- ---------------------------------------------------------------------------
558
559 coreToStgLet
560          :: Bool        -- True <=> yes, we are let-no-escaping this let
561          -> CoreBind    -- bindings
562          -> CoreExpr    -- body
563          -> LneM (StgExpr,      -- new let
564                   FreeVarsInfo, -- variables free in the whole let
565                   EscVarsSet,   -- variables that escape from the whole let
566                   Bool)         -- True <=> none of the binders in the bindings
567                                 -- is among the escaping vars
568
569 coreToStgLet let_no_escape bind body
570   = fixLne (\ ~(_, _, _, _, _, rec_body_fvs, _, _) ->
571
572         -- Do the bindings, setting live_in_cont to empty if
573         -- we ain't in a let-no-escape world
574         getVarsLiveInCont               `thenLne` \ live_in_cont ->
575         setVarsLiveInCont (if let_no_escape 
576                                 then live_in_cont 
577                                 else emptyLiveInfo)
578                           (vars_bind rec_body_fvs bind)
579             `thenLne` \ ( bind2, bind_fvs, bind_escs, bind_lv_info, env_ext) ->
580
581         -- Do the body
582         extendVarEnvLne env_ext (
583           coreToStgExpr body          `thenLne` \(body2, body_fvs, body_escs) ->
584           freeVarsToLiveVars body_fvs `thenLne` \ body_lv_info ->
585
586           returnLne (bind2, bind_fvs, bind_escs, getLiveVars bind_lv_info,
587                      body2, body_fvs, body_escs, getLiveVars body_lv_info)
588         )
589
590     ) `thenLne` (\ (bind2, bind_fvs, bind_escs, bind_lvs, 
591                     body2, body_fvs, body_escs, body_lvs) ->
592
593
594         -- Compute the new let-expression
595     let
596         new_let | let_no_escape = StgLetNoEscape live_in_whole_let bind_lvs bind2 body2
597                 | otherwise     = StgLet bind2 body2
598
599         free_in_whole_let
600           = binders `minusFVBinders` (bind_fvs `unionFVInfo` body_fvs)
601
602         live_in_whole_let
603           = bind_lvs `unionVarSet` (body_lvs `delVarSetList` binders)
604
605         real_bind_escs = if let_no_escape then
606                             bind_escs
607                          else
608                             getFVSet bind_fvs
609                             -- Everything escapes which is free in the bindings
610
611         let_escs = (real_bind_escs `unionVarSet` body_escs) `delVarSetList` binders
612
613         all_escs = bind_escs `unionVarSet` body_escs    -- Still includes binders of
614                                                         -- this let(rec)
615
616         no_binder_escapes = isEmptyVarSet (set_of_binders `intersectVarSet` all_escs)
617
618 #ifdef DEBUG
619         -- Debugging code as requested by Andrew Kennedy
620         checked_no_binder_escapes
621                 | not no_binder_escapes && any is_join_var binders
622                 = pprTrace "Interesting!  A join var that isn't let-no-escaped" (ppr binders)
623                   False
624                 | otherwise = no_binder_escapes
625 #else
626         checked_no_binder_escapes = no_binder_escapes
627 #endif
628                             
629                 -- Mustn't depend on the passed-in let_no_escape flag, since
630                 -- no_binder_escapes is used by the caller to derive the flag!
631     in
632     returnLne (
633         new_let,
634         free_in_whole_let,
635         let_escs,
636         checked_no_binder_escapes
637     ))
638   where
639     set_of_binders = mkVarSet binders
640     binders        = bindersOf bind
641
642     mk_binding bind_lv_info binder rhs
643         = (binder, LetBound (NestedLet live_vars) (manifestArity rhs))
644         where
645            live_vars | let_no_escape = addLiveVar bind_lv_info binder
646                      | otherwise     = unitLiveVar binder
647                 -- c.f. the invariant on NestedLet
648
649     vars_bind :: FreeVarsInfo           -- Free var info for body of binding
650               -> CoreBind
651               -> LneM (StgBinding,
652                        FreeVarsInfo, 
653                        EscVarsSet,        -- free vars; escapee vars
654                        LiveInfo,          -- Vars and CAFs live in binding
655                        [(Id, HowBound)])  -- extension to environment
656                                          
657
658     vars_bind body_fvs (NonRec binder rhs)
659       = coreToStgRhs body_fvs [] (binder,rhs)
660                                 `thenLne` \ (rhs2, bind_fvs, bind_lv_info, escs) ->
661         let
662             env_ext_item = mk_binding bind_lv_info binder rhs
663         in
664         returnLne (StgNonRec binder rhs2, 
665                    bind_fvs, escs, bind_lv_info, [env_ext_item])
666
667
668     vars_bind body_fvs (Rec pairs)
669       = fixLne (\ ~(_, rec_rhs_fvs, _, bind_lv_info, _) ->
670            let
671                 rec_scope_fvs = unionFVInfo body_fvs rec_rhs_fvs
672                 binders = map fst pairs
673                 env_ext = [ mk_binding bind_lv_info b rhs 
674                           | (b,rhs) <- pairs ]
675            in
676            extendVarEnvLne env_ext (
677               mapAndUnzip4Lne (coreToStgRhs rec_scope_fvs binders) pairs 
678                                         `thenLne` \ (rhss2, fvss, lv_infos, escss) ->
679               let
680                         bind_fvs = unionFVInfos fvss
681                         bind_lv_info = foldr unionLiveInfo emptyLiveInfo lv_infos
682                         escs     = unionVarSets escss
683               in
684               returnLne (StgRec (binders `zip` rhss2),
685                          bind_fvs, escs, bind_lv_info, env_ext)
686            )
687         )
688
689 is_join_var :: Id -> Bool
690 -- A hack (used only for compiler debuggging) to tell if
691 -- a variable started life as a join point ($j)
692 is_join_var j = occNameString (getOccName j) == "$j"
693 \end{code}
694
695 \begin{code}
696 coreToStgRhs :: FreeVarsInfo            -- Free var info for the scope of the binding
697              -> [Id]
698              -> (Id,CoreExpr)
699              -> LneM (StgRhs, FreeVarsInfo, LiveInfo, EscVarsSet)
700
701 coreToStgRhs scope_fv_info binders (bndr, rhs)
702   = coreToStgExpr rhs           `thenLne` \ (new_rhs, rhs_fvs, rhs_escs) ->
703     getEnvLne                   `thenLne` \ env ->    
704     freeVarsToLiveVars (binders `minusFVBinders` rhs_fvs) `thenLne` \ lv_info ->
705     returnLne (mkStgRhs rhs_fvs (mkSRT lv_info) bndr_info new_rhs,
706                rhs_fvs, lv_info, rhs_escs)
707   where
708     bndr_info = lookupFVInfo scope_fv_info bndr
709
710 mkStgRhs :: FreeVarsInfo -> SRT -> StgBinderInfo -> StgExpr -> StgRhs
711
712 mkStgRhs rhs_fvs srt binder_info (StgConApp con args)
713   = StgRhsCon noCCS con args
714
715 mkStgRhs rhs_fvs srt binder_info (StgLam _ bndrs body)
716   = StgRhsClosure noCCS binder_info
717                   (getFVs rhs_fvs)               
718                   ReEntrant
719                   srt bndrs body
720         
721 mkStgRhs rhs_fvs srt binder_info rhs
722   = StgRhsClosure noCCS binder_info
723                   (getFVs rhs_fvs)               
724                   upd_flag srt [] rhs
725   where
726    upd_flag = Updatable
727   {-
728     SDM: disabled.  Eval/Apply can't handle functions with arity zero very
729     well; and making these into simple non-updatable thunks breaks other
730     assumptions (namely that they will be entered only once).
731
732     upd_flag | isPAP env rhs  = ReEntrant
733              | otherwise      = Updatable
734   -}
735
736 {- ToDo:
737           upd = if isOnceDem dem
738                     then (if isNotTop toplev 
739                             then SingleEntry    -- HA!  Paydirt for "dem"
740                             else 
741 #ifdef DEBUG
742                      trace "WARNING: SE CAFs unsupported, forcing UPD instead" $
743 #endif
744                      Updatable)
745                 else Updatable
746         -- For now we forbid SingleEntry CAFs; they tickle the
747         -- ASSERT in rts/Storage.c line 215 at newCAF() re mut_link,
748         -- and I don't understand why.  There's only one SE_CAF (well,
749         -- only one that tickled a great gaping bug in an earlier attempt
750         -- at ClosureInfo.getEntryConvention) in the whole of nofib, 
751         -- specifically Main.lvl6 in spectral/cryptarithm2.
752         -- So no great loss.  KSW 2000-07.
753 -}
754 \end{code}
755
756 Detect thunks which will reduce immediately to PAPs, and make them
757 non-updatable.  This has several advantages:
758
759         - the non-updatable thunk behaves exactly like the PAP,
760
761         - the thunk is more efficient to enter, because it is
762           specialised to the task.
763
764         - we save one update frame, one stg_update_PAP, one update
765           and lots of PAP_enters.
766
767         - in the case where the thunk is top-level, we save building
768           a black hole and futhermore the thunk isn't considered to
769           be a CAF any more, so it doesn't appear in any SRTs.
770
771 We do it here, because the arity information is accurate, and we need
772 to do it before the SRT pass to save the SRT entries associated with
773 any top-level PAPs.
774
775 isPAP env (StgApp f args) = listLengthCmp args arity == LT -- idArity f > length args
776                           where
777                             arity = stgArity f (lookupBinding env f)
778 isPAP env _               = False
779
780
781 %************************************************************************
782 %*                                                                      *
783 \subsection[LNE-monad]{A little monad for this let-no-escaping pass}
784 %*                                                                      *
785 %************************************************************************
786
787 There's a lot of stuff to pass around, so we use this @LneM@ monad to
788 help.  All the stuff here is only passed *down*.
789
790 \begin{code}
791 type LneM a =  IdEnv HowBound
792             -> LiveInfo         -- Vars and CAFs live in continuation
793             -> a
794
795 type LiveInfo = (StgLiveVars,   -- Dynamic live variables; 
796                                 -- i.e. ones with a nested (non-top-level) binding
797                  CafSet)        -- Static live variables;
798                                 -- i.e. top-level variables that are CAFs or refer to them
799
800 type EscVarsSet = IdSet
801 type CafSet     = IdSet
802
803 data HowBound
804   = ImportBound         -- Used only as a response to lookupBinding; never
805                         -- exists in the range of the (IdEnv HowBound)
806
807   | LetBound            -- A let(rec) in this module
808         LetInfo         -- Whether top level or nested
809         Arity           -- Its arity (local Ids don't have arity info at this point)
810
811   | LambdaBound         -- Used for both lambda and case
812
813 data LetInfo
814   = TopLet              -- top level things
815   | NestedLet LiveInfo  -- For nested things, what is live if this
816                         -- thing is live?  Invariant: the binder
817                         -- itself is always a member of
818                         -- the dynamic set of its own LiveInfo
819
820 isLetBound (LetBound _ _) = True
821 isLetBound other          = False
822
823 topLevelBound ImportBound         = True
824 topLevelBound (LetBound TopLet _) = True
825 topLevelBound other               = False
826 \end{code}
827
828 For a let(rec)-bound variable, x, we record LiveInfo, the set of
829 variables that are live if x is live.  This LiveInfo comprises
830         (a) dynamic live variables (ones with a non-top-level binding)
831         (b) static live variabes (CAFs or things that refer to CAFs)
832
833 For "normal" variables (a) is just x alone.  If x is a let-no-escaped
834 variable then x is represented by a code pointer and a stack pointer
835 (well, one for each stack).  So all of the variables needed in the
836 execution of x are live if x is, and are therefore recorded in the
837 LetBound constructor; x itself *is* included.
838
839 The set of dynamic live variables is guaranteed ot have no further let-no-escaped
840 variables in it.
841
842 \begin{code}
843 emptyLiveInfo :: LiveInfo
844 emptyLiveInfo = (emptyVarSet,emptyVarSet)
845
846 unitLiveVar :: Id -> LiveInfo
847 unitLiveVar lv = (unitVarSet lv, emptyVarSet)
848
849 unitLiveCaf :: Id -> LiveInfo
850 unitLiveCaf caf = (emptyVarSet, unitVarSet caf)
851
852 addLiveVar :: LiveInfo -> Id -> LiveInfo
853 addLiveVar (lvs, cafs) id = (lvs `extendVarSet` id, cafs)
854
855 unionLiveInfo :: LiveInfo -> LiveInfo -> LiveInfo
856 unionLiveInfo (lv1,caf1) (lv2,caf2) = (lv1 `unionVarSet` lv2, caf1 `unionVarSet` caf2)
857
858 mkSRT :: LiveInfo -> SRT
859 mkSRT (_, cafs) = SRTEntries cafs
860
861 getLiveVars :: LiveInfo -> StgLiveVars
862 getLiveVars (lvs, _) = lvs
863 \end{code}
864
865
866 The std monad functions:
867 \begin{code}
868 initLne :: IdEnv HowBound -> LneM a -> a
869 initLne env m = m env emptyLiveInfo
870
871
872
873 {-# INLINE thenLne #-}
874 {-# INLINE returnLne #-}
875
876 returnLne :: a -> LneM a
877 returnLne e env lvs_cont = e
878
879 thenLne :: LneM a -> (a -> LneM b) -> LneM b
880 thenLne m k env lvs_cont 
881   = k (m env lvs_cont) env lvs_cont
882
883 mapAndUnzipLne  :: (a -> LneM (b,c))   -> [a] -> LneM ([b],[c])
884 mapAndUnzipLne f [] = returnLne ([],[])
885 mapAndUnzipLne f (x:xs)
886   = f x                 `thenLne` \ (r1,  r2)  ->
887     mapAndUnzipLne f xs `thenLne` \ (rs1, rs2) ->
888     returnLne (r1:rs1, r2:rs2)
889
890 mapAndUnzip3Lne :: (a -> LneM (b,c,d)) -> [a] -> LneM ([b],[c],[d])
891 mapAndUnzip3Lne f []    = returnLne ([],[],[])
892 mapAndUnzip3Lne f (x:xs)
893   = f x                  `thenLne` \ (r1,  r2,  r3)  ->
894     mapAndUnzip3Lne f xs `thenLne` \ (rs1, rs2, rs3) ->
895     returnLne (r1:rs1, r2:rs2, r3:rs3)
896
897 mapAndUnzip4Lne :: (a -> LneM (b,c,d,e)) -> [a] -> LneM ([b],[c],[d],[e])
898 mapAndUnzip4Lne f []    = returnLne ([],[],[],[])
899 mapAndUnzip4Lne f (x:xs)
900   = f x                  `thenLne` \ (r1,  r2,  r3, r4)  ->
901     mapAndUnzip4Lne f xs `thenLne` \ (rs1, rs2, rs3, rs4) ->
902     returnLne (r1:rs1, r2:rs2, r3:rs3, r4:rs4)
903
904 fixLne :: (a -> LneM a) -> LneM a
905 fixLne expr env lvs_cont
906   = result
907   where
908     result = expr result env lvs_cont
909 \end{code}
910
911 Functions specific to this monad:
912
913 \begin{code}
914 getVarsLiveInCont :: LneM LiveInfo
915 getVarsLiveInCont env lvs_cont = lvs_cont
916
917 setVarsLiveInCont :: LiveInfo -> LneM a -> LneM a
918 setVarsLiveInCont new_lvs_cont expr env lvs_cont
919   = expr env new_lvs_cont
920
921 extendVarEnvLne :: [(Id, HowBound)] -> LneM a -> LneM a
922 extendVarEnvLne ids_w_howbound expr env lvs_cont
923   = expr (extendVarEnvList env ids_w_howbound) lvs_cont
924
925 lookupVarLne :: Id -> LneM HowBound
926 lookupVarLne v env lvs_cont = returnLne (lookupBinding env v) env lvs_cont
927
928 getEnvLne :: LneM (IdEnv HowBound)
929 getEnvLne env lvs_cont = returnLne env env lvs_cont
930
931 lookupBinding :: IdEnv HowBound -> Id -> HowBound
932 lookupBinding env v = case lookupVarEnv env v of
933                         Just xx -> xx
934                         Nothing -> ASSERT2( isGlobalId v, ppr v ) ImportBound
935
936
937 -- The result of lookupLiveVarsForSet, a set of live variables, is
938 -- only ever tacked onto a decorated expression. It is never used as
939 -- the basis of a control decision, which might give a black hole.
940
941 freeVarsToLiveVars :: FreeVarsInfo -> LneM LiveInfo
942 freeVarsToLiveVars fvs env live_in_cont
943   = returnLne live_info env live_in_cont
944   where
945     live_info    = foldr unionLiveInfo live_in_cont lvs_from_fvs
946     lvs_from_fvs = map do_one (allFreeIds fvs)
947
948     do_one (v, how_bound)
949       = case how_bound of
950           ImportBound                     -> unitLiveCaf v      -- Only CAF imports are 
951                                                                 -- recorded in fvs
952           LetBound TopLet _              
953                 | mayHaveCafRefs (idCafInfo v) -> unitLiveCaf v
954                 | otherwise                    -> emptyLiveInfo
955
956           LetBound (NestedLet lvs) _      -> lvs        -- lvs already contains v
957                                                         -- (see the invariant on NestedLet)
958
959           _lambda_or_case_binding         -> unitLiveVar v      -- Bound by lambda or case
960 \end{code}
961
962 %************************************************************************
963 %*                                                                      *
964 \subsection[Free-var info]{Free variable information}
965 %*                                                                      *
966 %************************************************************************
967
968 \begin{code}
969 type FreeVarsInfo = VarEnv (Var, HowBound, StgBinderInfo)
970         -- The Var is so we can gather up the free variables
971         -- as a set.
972         --
973         -- The HowBound info just saves repeated lookups;
974         -- we look up just once when we encounter the occurrence.
975         -- INVARIANT: Any ImportBound Ids are HaveCafRef Ids
976         --            Imported Ids without CAF refs are simply
977         --            not put in the FreeVarsInfo for an expression.
978         --            See singletonFVInfo and freeVarsToLiveVars
979         --
980         -- StgBinderInfo records how it occurs; notably, we
981         -- are interested in whether it only occurs in saturated 
982         -- applications, because then we don't need to build a
983         -- curried version.
984         -- If f is mapped to noBinderInfo, that means
985         -- that f *is* mentioned (else it wouldn't be in the
986         -- IdEnv at all), but perhaps in an unsaturated applications.
987         --
988         -- All case/lambda-bound things are also mapped to
989         -- noBinderInfo, since we aren't interested in their
990         -- occurence info.
991         --
992         -- For ILX we track free var info for type variables too;
993         -- hence VarEnv not IdEnv
994 \end{code}
995
996 \begin{code}
997 emptyFVInfo :: FreeVarsInfo
998 emptyFVInfo = emptyVarEnv
999
1000 singletonFVInfo :: Id -> HowBound -> StgBinderInfo -> FreeVarsInfo
1001 -- Don't record non-CAF imports at all, to keep free-var sets small
1002 singletonFVInfo id ImportBound info
1003    | mayHaveCafRefs (idCafInfo id) = unitVarEnv id (id, ImportBound, info)
1004    | otherwise                     = emptyVarEnv
1005 singletonFVInfo id how_bound info  = unitVarEnv id (id, how_bound, info)
1006
1007 tyvarFVInfo :: TyVarSet -> FreeVarsInfo
1008 tyvarFVInfo tvs = foldVarSet add emptyFVInfo tvs
1009         where
1010           add tv fvs = extendVarEnv fvs tv (tv, LambdaBound, noBinderInfo)
1011                 -- Type variables must be lambda-bound
1012
1013 unionFVInfo :: FreeVarsInfo -> FreeVarsInfo -> FreeVarsInfo
1014 unionFVInfo fv1 fv2 = plusVarEnv_C plusFVInfo fv1 fv2
1015
1016 unionFVInfos :: [FreeVarsInfo] -> FreeVarsInfo
1017 unionFVInfos fvs = foldr unionFVInfo emptyFVInfo fvs
1018
1019 minusFVBinders :: [Id] -> FreeVarsInfo -> FreeVarsInfo
1020 minusFVBinders vs fv = foldr minusFVBinder fv vs
1021
1022 minusFVBinder :: Id -> FreeVarsInfo -> FreeVarsInfo
1023 minusFVBinder v fv | isId v && opt_RuntimeTypes
1024                    = (fv `delVarEnv` v) `unionFVInfo` 
1025                      tyvarFVInfo (tyVarsOfType (idType v))
1026                    | otherwise = fv `delVarEnv` v
1027         -- When removing a binder, remember to add its type variables
1028         -- c.f. CoreFVs.delBinderFV
1029
1030 elementOfFVInfo :: Id -> FreeVarsInfo -> Bool
1031 elementOfFVInfo id fvs = maybeToBool (lookupVarEnv fvs id)
1032
1033 lookupFVInfo :: FreeVarsInfo -> Id -> StgBinderInfo
1034 -- Find how the given Id is used.
1035 -- Externally visible things may be used any old how
1036 lookupFVInfo fvs id 
1037   | isExternalName (idName id) = noBinderInfo
1038   | otherwise = case lookupVarEnv fvs id of
1039                         Nothing         -> noBinderInfo
1040                         Just (_,_,info) -> info
1041
1042 allFreeIds :: FreeVarsInfo -> [(Id,HowBound)]   -- Both top level and non-top-level Ids
1043 allFreeIds fvs = [(id,how_bound) | (id,how_bound,_) <- varEnvElts fvs, isId id]
1044
1045 -- Non-top-level things only, both type variables and ids
1046 -- (type variables only if opt_RuntimeTypes)
1047 getFVs :: FreeVarsInfo -> [Var] 
1048 getFVs fvs = [id | (id, how_bound, _) <- varEnvElts fvs, 
1049                     not (topLevelBound how_bound) ]
1050
1051 getFVSet :: FreeVarsInfo -> VarSet
1052 getFVSet fvs = mkVarSet (getFVs fvs)
1053
1054 plusFVInfo (id1,hb1,info1) (id2,hb2,info2)
1055   = ASSERT (id1 == id2 && hb1 `check_eq_how_bound` hb2)
1056     (id1, hb1, combineStgBinderInfo info1 info2)
1057
1058 #ifdef DEBUG
1059 -- The HowBound info for a variable in the FVInfo should be consistent
1060 check_eq_how_bound ImportBound        ImportBound        = True
1061 check_eq_how_bound LambdaBound        LambdaBound        = True
1062 check_eq_how_bound (LetBound li1 ar1) (LetBound li2 ar2) = ar1 == ar2 && check_eq_li li1 li2
1063 check_eq_how_bound hb1                hb2                = False
1064
1065 check_eq_li (NestedLet _) (NestedLet _) = True
1066 check_eq_li TopLet        TopLet        = True
1067 check_eq_li li1           li2           = False
1068 #endif
1069 \end{code}
1070
1071 Misc.
1072 \begin{code}
1073 filterStgBinders :: [Var] -> [Var]
1074 filterStgBinders bndrs
1075   | opt_RuntimeTypes = bndrs
1076   | otherwise        = filter isId bndrs
1077 \end{code}
1078
1079
1080 \begin{code}
1081         -- Ignore all notes except SCC
1082 myCollectBinders expr
1083   = go [] expr
1084   where
1085     go bs (Lam b e)          = go (b:bs) e
1086     go bs e@(Note (SCC _) _) = (reverse bs, e) 
1087     go bs e@(Note (TickBox {}) _) = (reverse bs, e)
1088     go bs e@(Note (BinaryTickBox {}) _)  = (reverse bs, e)
1089     go bs (Cast e co)        = go bs e
1090     go bs (Note _ e)         = go bs e
1091     go bs e                  = (reverse bs, e)
1092
1093 myCollectArgs :: CoreExpr -> (Id, [CoreArg])
1094         -- We assume that we only have variables
1095         -- in the function position by now
1096 myCollectArgs expr
1097   = go expr []
1098   where
1099     go (Var v)          as = (v, as)
1100     go (App f a) as        = go f (a:as)
1101     go (Note (SCC _) e) as = pprPanic "CoreToStg.myCollectArgs" (ppr expr)
1102     go (Note (TickBox {}) e) as = pprPanic "CoreToStg.myCollectArgs" (ppr expr)
1103     go (Note (BinaryTickBox {}) e) as = pprPanic "CoreToStg.myCollectArgs" (ppr expr)
1104     go (Cast e co)      as = go e as
1105     go (Note n e)       as = go e as
1106     go _                as = pprPanic "CoreToStg.myCollectArgs" (ppr expr)
1107 \end{code}
1108
1109 \begin{code}
1110 stgArity :: Id -> HowBound -> Arity
1111 stgArity f (LetBound _ arity) = arity
1112 stgArity f ImportBound        = idArity f
1113 stgArity f LambdaBound        = 0
1114 \end{code}