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