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