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