Fix Trac #1981: seq on a type-family-typed expression
[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 Module
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 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 bndr alts
415   = case splitTyConApp_maybe (repType (idType bndr)) 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                     | otherwise              -> ASSERT( _is_poly_alt_tycon tc )
421                                                 PolyAlt
422         Nothing                              -> PolyAlt
423
424   where
425    _is_poly_alt_tycon tc
426         =  isFunTyCon tc
427         || isPrimTyCon tc   -- "Any" is lifted but primitive
428         || isOpenTyCon tc   -- Type family; e.g. arising from strict
429                             -- function application where argument has a
430                             -- type-family type
431
432    -- Sometimes, the TyCon is a HiBootTyCon which may not have any 
433    -- constructors inside it.  Then we can get a better TyCon by 
434    -- grabbing the one from a constructor alternative
435    -- if one exists.
436    look_for_better_tycon
437         | ((DataAlt con, _, _) : _) <- data_alts = 
438                 AlgAlt (dataConTyCon con)
439         | otherwise =
440                 ASSERT(null data_alts)
441                 PolyAlt
442         where
443                 (data_alts, _deflt) = findDefault alts
444 \end{code}
445
446
447 -- ---------------------------------------------------------------------------
448 -- Applications
449 -- ---------------------------------------------------------------------------
450
451 \begin{code}
452 coreToStgApp
453          :: Maybe UpdateFlag            -- Just upd <=> this application is
454                                         -- the rhs of a thunk binding
455                                         --      x = [...] \upd [] -> the_app
456                                         -- with specified update flag
457         -> Id                           -- Function
458         -> [CoreArg]                    -- Arguments
459         -> LneM (StgExpr, FreeVarsInfo, EscVarsSet)
460
461
462 coreToStgApp maybe_thunk_body f args
463   = coreToStgArgs args          `thenLne` \ (args', args_fvs) ->
464     lookupVarLne f              `thenLne` \ how_bound ->
465
466     let
467         n_val_args       = valArgCount args
468         not_letrec_bound = not (isLetBound how_bound)
469         fun_fvs          
470           = let fvs = singletonFVInfo f how_bound fun_occ in
471             -- e.g. (f :: a -> int) (x :: a) 
472             -- Here the free variables are "f", "x" AND the type variable "a"
473             -- coreToStgArgs will deal with the arguments recursively
474             if opt_RuntimeTypes then
475               fvs `unionFVInfo` tyvarFVInfo (tyVarsOfType (idType f))
476             else fvs
477
478         -- Mostly, the arity info of a function is in the fn's IdInfo
479         -- But new bindings introduced by CoreSat may not have no
480         -- arity info; it would do us no good anyway.  For example:
481         --      let f = \ab -> e in f
482         -- No point in having correct arity info for f!
483         -- Hence the hasArity stuff below.
484         -- NB: f_arity is only consulted for LetBound things
485         f_arity   = stgArity f how_bound
486         saturated = f_arity <= n_val_args
487
488         fun_occ 
489          | not_letrec_bound         = noBinderInfo      -- Uninteresting variable
490          | f_arity > 0 && saturated = stgSatOcc -- Saturated or over-saturated function call
491          | otherwise                = stgUnsatOcc       -- Unsaturated function or thunk
492
493         fun_escs
494          | not_letrec_bound      = emptyVarSet  -- Only letrec-bound escapees are interesting
495          | f_arity == n_val_args = emptyVarSet  -- A function *or thunk* with an exactly
496                                                 -- saturated call doesn't escape
497                                                 -- (let-no-escape applies to 'thunks' too)
498
499          | otherwise         = unitVarSet f     -- Inexact application; it does escape
500
501         -- At the moment of the call:
502
503         --  either the function is *not* let-no-escaped, in which case
504         --         nothing is live except live_in_cont
505         --      or the function *is* let-no-escaped in which case the
506         --         variables it uses are live, but still the function
507         --         itself is not.  PS.  In this case, the function's
508         --         live vars should already include those of the
509         --         continuation, but it does no harm to just union the
510         --         two regardless.
511
512         res_ty = exprType (mkApps (Var f) args)
513         app = case globalIdDetails f of
514                 DataConWorkId dc | saturated -> StgConApp dc args'
515                 PrimOpId op      -> ASSERT( saturated )
516                                     StgOpApp (StgPrimOp op) args' res_ty
517                 FCallId call     -> ASSERT( saturated )
518                                     StgOpApp (StgFCallOp call (idUnique f)) args' res_ty
519                 TickBoxOpId {}   -> pprPanic "coreToStg TickBox" $ ppr (f,args')
520                 _other           -> StgApp f args'
521
522     in
523     returnLne (
524         app,
525         fun_fvs  `unionFVInfo` args_fvs,
526         fun_escs `unionVarSet` (getFVSet args_fvs)
527                                 -- All the free vars of the args are disqualified
528                                 -- from being let-no-escaped.
529     )
530
531
532
533 -- ---------------------------------------------------------------------------
534 -- Argument lists
535 -- This is the guy that turns applications into A-normal form
536 -- ---------------------------------------------------------------------------
537
538 coreToStgArgs :: [CoreArg] -> LneM ([StgArg], FreeVarsInfo)
539 coreToStgArgs []
540   = returnLne ([], emptyFVInfo)
541
542 coreToStgArgs (Type ty : args)  -- Type argument
543   = coreToStgArgs args  `thenLne` \ (args', fvs) ->
544     if opt_RuntimeTypes then
545         returnLne (StgTypeArg ty : args', fvs `unionFVInfo` tyvarFVInfo (tyVarsOfType ty))
546     else
547     returnLne (args', fvs)
548
549 coreToStgArgs (arg : args)      -- Non-type argument
550   = coreToStgArgs args  `thenLne` \ (stg_args, args_fvs) ->
551     coreToStgExpr arg   `thenLne` \ (arg', arg_fvs, escs) ->
552     let
553         fvs = args_fvs `unionFVInfo` arg_fvs
554         stg_arg = case arg' of
555                        StgApp v []      -> StgVarArg v
556                        StgConApp con [] -> StgVarArg (dataConWorkId con)
557                        StgLit lit       -> StgLitArg lit
558                        _                -> pprPanic "coreToStgArgs" (ppr arg)
559     in
560         -- WARNING: what if we have an argument like (v `cast` co)
561         --          where 'co' changes the representation type?
562         --          (This really only happens if co is unsafe.)
563         -- Then all the getArgAmode stuff in CgBindery will set the
564         -- cg_rep of the CgIdInfo based on the type of v, rather
565         -- than the type of 'co'.
566         -- This matters particularly when the function is a primop
567         -- or foreign call.
568         -- Wanted: a better solution than this hacky warning
569     let
570         arg_ty = exprType arg
571         stg_arg_ty = stgArgType stg_arg
572         bad_args = (isUnLiftedType arg_ty && not (isUnLiftedType stg_arg_ty)) 
573                 || (typePrimRep arg_ty /= typePrimRep stg_arg_ty)
574         -- In GHCi we coerce an argument of type BCO# (unlifted) to HValue (lifted), 
575         -- and pass it to a function expecting an HValue (arg_ty).  This is ok because
576         -- we can treat an unlifted value as lifted.  But the other way round 
577         -- we complain.
578         -- We also want to check if a pointer is cast to a non-ptr etc
579     in
580     WARN( bad_args, ptext SLIT("Dangerous-looking argument. Probable cause: bad unsafeCoerce#") $$ ppr arg )
581     returnLne (stg_arg : stg_args, fvs)
582
583
584 -- ---------------------------------------------------------------------------
585 -- The magic for lets:
586 -- ---------------------------------------------------------------------------
587
588 coreToStgLet
589          :: Bool        -- True <=> yes, we are let-no-escaping this let
590          -> CoreBind    -- bindings
591          -> CoreExpr    -- body
592          -> LneM (StgExpr,      -- new let
593                   FreeVarsInfo, -- variables free in the whole let
594                   EscVarsSet,   -- variables that escape from the whole let
595                   Bool)         -- True <=> none of the binders in the bindings
596                                 -- is among the escaping vars
597
598 coreToStgLet let_no_escape bind body
599   = fixLne (\ ~(_, _, _, _, _, rec_body_fvs, _, _) ->
600
601         -- Do the bindings, setting live_in_cont to empty if
602         -- we ain't in a let-no-escape world
603         getVarsLiveInCont               `thenLne` \ live_in_cont ->
604         setVarsLiveInCont (if let_no_escape 
605                                 then live_in_cont 
606                                 else emptyLiveInfo)
607                           (vars_bind rec_body_fvs bind)
608             `thenLne` \ ( bind2, bind_fvs, bind_escs, bind_lv_info, env_ext) ->
609
610         -- Do the body
611         extendVarEnvLne env_ext (
612           coreToStgExpr body          `thenLne` \(body2, body_fvs, body_escs) ->
613           freeVarsToLiveVars body_fvs `thenLne` \ body_lv_info ->
614
615           returnLne (bind2, bind_fvs, bind_escs, getLiveVars bind_lv_info,
616                      body2, body_fvs, body_escs, getLiveVars body_lv_info)
617         )
618
619     ) `thenLne` (\ (bind2, bind_fvs, bind_escs, bind_lvs, 
620                     body2, body_fvs, body_escs, body_lvs) ->
621
622
623         -- Compute the new let-expression
624     let
625         new_let | let_no_escape = StgLetNoEscape live_in_whole_let bind_lvs bind2 body2
626                 | otherwise     = StgLet bind2 body2
627
628         free_in_whole_let
629           = binders `minusFVBinders` (bind_fvs `unionFVInfo` body_fvs)
630
631         live_in_whole_let
632           = bind_lvs `unionVarSet` (body_lvs `delVarSetList` binders)
633
634         real_bind_escs = if let_no_escape then
635                             bind_escs
636                          else
637                             getFVSet bind_fvs
638                             -- Everything escapes which is free in the bindings
639
640         let_escs = (real_bind_escs `unionVarSet` body_escs) `delVarSetList` binders
641
642         all_escs = bind_escs `unionVarSet` body_escs    -- Still includes binders of
643                                                         -- this let(rec)
644
645         no_binder_escapes = isEmptyVarSet (set_of_binders `intersectVarSet` all_escs)
646
647 #ifdef DEBUG
648         -- Debugging code as requested by Andrew Kennedy
649         checked_no_binder_escapes
650                 | not no_binder_escapes && any is_join_var binders
651                 = pprTrace "Interesting!  A join var that isn't let-no-escaped" (ppr binders)
652                   False
653                 | otherwise = no_binder_escapes
654 #else
655         checked_no_binder_escapes = no_binder_escapes
656 #endif
657                             
658                 -- Mustn't depend on the passed-in let_no_escape flag, since
659                 -- no_binder_escapes is used by the caller to derive the flag!
660     in
661     returnLne (
662         new_let,
663         free_in_whole_let,
664         let_escs,
665         checked_no_binder_escapes
666     ))
667   where
668     set_of_binders = mkVarSet binders
669     binders        = bindersOf bind
670
671     mk_binding bind_lv_info binder rhs
672         = (binder, LetBound (NestedLet live_vars) (manifestArity rhs))
673         where
674            live_vars | let_no_escape = addLiveVar bind_lv_info binder
675                      | otherwise     = unitLiveVar binder
676                 -- c.f. the invariant on NestedLet
677
678     vars_bind :: FreeVarsInfo           -- Free var info for body of binding
679               -> CoreBind
680               -> LneM (StgBinding,
681                        FreeVarsInfo, 
682                        EscVarsSet,        -- free vars; escapee vars
683                        LiveInfo,          -- Vars and CAFs live in binding
684                        [(Id, HowBound)])  -- extension to environment
685                                          
686
687     vars_bind body_fvs (NonRec binder rhs)
688       = coreToStgRhs body_fvs [] (binder,rhs)
689                                 `thenLne` \ (rhs2, bind_fvs, bind_lv_info, escs) ->
690         let
691             env_ext_item = mk_binding bind_lv_info binder rhs
692         in
693         returnLne (StgNonRec binder rhs2, 
694                    bind_fvs, escs, bind_lv_info, [env_ext_item])
695
696
697     vars_bind body_fvs (Rec pairs)
698       = fixLne (\ ~(_, rec_rhs_fvs, _, bind_lv_info, _) ->
699            let
700                 rec_scope_fvs = unionFVInfo body_fvs rec_rhs_fvs
701                 binders = map fst pairs
702                 env_ext = [ mk_binding bind_lv_info b rhs 
703                           | (b,rhs) <- pairs ]
704            in
705            extendVarEnvLne env_ext (
706               mapAndUnzip4Lne (coreToStgRhs rec_scope_fvs binders) pairs 
707                                         `thenLne` \ (rhss2, fvss, lv_infos, escss) ->
708               let
709                         bind_fvs = unionFVInfos fvss
710                         bind_lv_info = foldr unionLiveInfo emptyLiveInfo lv_infos
711                         escs     = unionVarSets escss
712               in
713               returnLne (StgRec (binders `zip` rhss2),
714                          bind_fvs, escs, bind_lv_info, env_ext)
715            )
716         )
717
718 is_join_var :: Id -> Bool
719 -- A hack (used only for compiler debuggging) to tell if
720 -- a variable started life as a join point ($j)
721 is_join_var j = occNameString (getOccName j) == "$j"
722 \end{code}
723
724 \begin{code}
725 coreToStgRhs :: FreeVarsInfo            -- Free var info for the scope of the binding
726              -> [Id]
727              -> (Id,CoreExpr)
728              -> LneM (StgRhs, FreeVarsInfo, LiveInfo, EscVarsSet)
729
730 coreToStgRhs scope_fv_info binders (bndr, rhs)
731   = coreToStgExpr rhs           `thenLne` \ (new_rhs, rhs_fvs, rhs_escs) ->
732     getEnvLne                   `thenLne` \ env ->    
733     freeVarsToLiveVars (binders `minusFVBinders` rhs_fvs) `thenLne` \ lv_info ->
734     returnLne (mkStgRhs rhs_fvs (mkSRT lv_info) bndr_info new_rhs,
735                rhs_fvs, lv_info, rhs_escs)
736   where
737     bndr_info = lookupFVInfo scope_fv_info bndr
738
739 mkStgRhs :: FreeVarsInfo -> SRT -> StgBinderInfo -> StgExpr -> StgRhs
740
741 mkStgRhs rhs_fvs srt binder_info (StgConApp con args)
742   = StgRhsCon noCCS con args
743
744 mkStgRhs rhs_fvs srt binder_info (StgLam _ bndrs body)
745   = StgRhsClosure noCCS binder_info
746                   (getFVs rhs_fvs)               
747                   ReEntrant
748                   srt bndrs body
749         
750 mkStgRhs rhs_fvs srt binder_info rhs
751   = StgRhsClosure noCCS binder_info
752                   (getFVs rhs_fvs)               
753                   upd_flag srt [] rhs
754   where
755    upd_flag = Updatable
756   {-
757     SDM: disabled.  Eval/Apply can't handle functions with arity zero very
758     well; and making these into simple non-updatable thunks breaks other
759     assumptions (namely that they will be entered only once).
760
761     upd_flag | isPAP env rhs  = ReEntrant
762              | otherwise      = Updatable
763   -}
764
765 {- ToDo:
766           upd = if isOnceDem dem
767                     then (if isNotTop toplev 
768                             then SingleEntry    -- HA!  Paydirt for "dem"
769                             else 
770 #ifdef DEBUG
771                      trace "WARNING: SE CAFs unsupported, forcing UPD instead" $
772 #endif
773                      Updatable)
774                 else Updatable
775         -- For now we forbid SingleEntry CAFs; they tickle the
776         -- ASSERT in rts/Storage.c line 215 at newCAF() re mut_link,
777         -- and I don't understand why.  There's only one SE_CAF (well,
778         -- only one that tickled a great gaping bug in an earlier attempt
779         -- at ClosureInfo.getEntryConvention) in the whole of nofib, 
780         -- specifically Main.lvl6 in spectral/cryptarithm2.
781         -- So no great loss.  KSW 2000-07.
782 -}
783 \end{code}
784
785 Detect thunks which will reduce immediately to PAPs, and make them
786 non-updatable.  This has several advantages:
787
788         - the non-updatable thunk behaves exactly like the PAP,
789
790         - the thunk is more efficient to enter, because it is
791           specialised to the task.
792
793         - we save one update frame, one stg_update_PAP, one update
794           and lots of PAP_enters.
795
796         - in the case where the thunk is top-level, we save building
797           a black hole and futhermore the thunk isn't considered to
798           be a CAF any more, so it doesn't appear in any SRTs.
799
800 We do it here, because the arity information is accurate, and we need
801 to do it before the SRT pass to save the SRT entries associated with
802 any top-level PAPs.
803
804 isPAP env (StgApp f args) = listLengthCmp args arity == LT -- idArity f > length args
805                           where
806                             arity = stgArity f (lookupBinding env f)
807 isPAP env _               = False
808
809
810 %************************************************************************
811 %*                                                                      *
812 \subsection[LNE-monad]{A little monad for this let-no-escaping pass}
813 %*                                                                      *
814 %************************************************************************
815
816 There's a lot of stuff to pass around, so we use this @LneM@ monad to
817 help.  All the stuff here is only passed *down*.
818
819 \begin{code}
820 type LneM a =  IdEnv HowBound
821             -> LiveInfo         -- Vars and CAFs live in continuation
822             -> a
823
824 type LiveInfo = (StgLiveVars,   -- Dynamic live variables; 
825                                 -- i.e. ones with a nested (non-top-level) binding
826                  CafSet)        -- Static live variables;
827                                 -- i.e. top-level variables that are CAFs or refer to them
828
829 type EscVarsSet = IdSet
830 type CafSet     = IdSet
831
832 data HowBound
833   = ImportBound         -- Used only as a response to lookupBinding; never
834                         -- exists in the range of the (IdEnv HowBound)
835
836   | LetBound            -- A let(rec) in this module
837         LetInfo         -- Whether top level or nested
838         Arity           -- Its arity (local Ids don't have arity info at this point)
839
840   | LambdaBound         -- Used for both lambda and case
841
842 data LetInfo
843   = TopLet              -- top level things
844   | NestedLet LiveInfo  -- For nested things, what is live if this
845                         -- thing is live?  Invariant: the binder
846                         -- itself is always a member of
847                         -- the dynamic set of its own LiveInfo
848
849 isLetBound (LetBound _ _) = True
850 isLetBound other          = False
851
852 topLevelBound ImportBound         = True
853 topLevelBound (LetBound TopLet _) = True
854 topLevelBound other               = False
855 \end{code}
856
857 For a let(rec)-bound variable, x, we record LiveInfo, the set of
858 variables that are live if x is live.  This LiveInfo comprises
859         (a) dynamic live variables (ones with a non-top-level binding)
860         (b) static live variabes (CAFs or things that refer to CAFs)
861
862 For "normal" variables (a) is just x alone.  If x is a let-no-escaped
863 variable then x is represented by a code pointer and a stack pointer
864 (well, one for each stack).  So all of the variables needed in the
865 execution of x are live if x is, and are therefore recorded in the
866 LetBound constructor; x itself *is* included.
867
868 The set of dynamic live variables is guaranteed ot have no further let-no-escaped
869 variables in it.
870
871 \begin{code}
872 emptyLiveInfo :: LiveInfo
873 emptyLiveInfo = (emptyVarSet,emptyVarSet)
874
875 unitLiveVar :: Id -> LiveInfo
876 unitLiveVar lv = (unitVarSet lv, emptyVarSet)
877
878 unitLiveCaf :: Id -> LiveInfo
879 unitLiveCaf caf = (emptyVarSet, unitVarSet caf)
880
881 addLiveVar :: LiveInfo -> Id -> LiveInfo
882 addLiveVar (lvs, cafs) id = (lvs `extendVarSet` id, cafs)
883
884 unionLiveInfo :: LiveInfo -> LiveInfo -> LiveInfo
885 unionLiveInfo (lv1,caf1) (lv2,caf2) = (lv1 `unionVarSet` lv2, caf1 `unionVarSet` caf2)
886
887 mkSRT :: LiveInfo -> SRT
888 mkSRT (_, cafs) = SRTEntries cafs
889
890 getLiveVars :: LiveInfo -> StgLiveVars
891 getLiveVars (lvs, _) = lvs
892 \end{code}
893
894
895 The std monad functions:
896 \begin{code}
897 initLne :: IdEnv HowBound -> LneM a -> a
898 initLne env m = m env emptyLiveInfo
899
900
901
902 {-# INLINE thenLne #-}
903 {-# INLINE returnLne #-}
904
905 returnLne :: a -> LneM a
906 returnLne e env lvs_cont = e
907
908 thenLne :: LneM a -> (a -> LneM b) -> LneM b
909 thenLne m k env lvs_cont 
910   = k (m env lvs_cont) env lvs_cont
911
912 mapAndUnzipLne  :: (a -> LneM (b,c))   -> [a] -> LneM ([b],[c])
913 mapAndUnzipLne f [] = returnLne ([],[])
914 mapAndUnzipLne f (x:xs)
915   = f x                 `thenLne` \ (r1,  r2)  ->
916     mapAndUnzipLne f xs `thenLne` \ (rs1, rs2) ->
917     returnLne (r1:rs1, r2:rs2)
918
919 mapAndUnzip3Lne :: (a -> LneM (b,c,d)) -> [a] -> LneM ([b],[c],[d])
920 mapAndUnzip3Lne f []    = returnLne ([],[],[])
921 mapAndUnzip3Lne f (x:xs)
922   = f x                  `thenLne` \ (r1,  r2,  r3)  ->
923     mapAndUnzip3Lne f xs `thenLne` \ (rs1, rs2, rs3) ->
924     returnLne (r1:rs1, r2:rs2, r3:rs3)
925
926 mapAndUnzip4Lne :: (a -> LneM (b,c,d,e)) -> [a] -> LneM ([b],[c],[d],[e])
927 mapAndUnzip4Lne f []    = returnLne ([],[],[],[])
928 mapAndUnzip4Lne f (x:xs)
929   = f x                  `thenLne` \ (r1,  r2,  r3, r4)  ->
930     mapAndUnzip4Lne f xs `thenLne` \ (rs1, rs2, rs3, rs4) ->
931     returnLne (r1:rs1, r2:rs2, r3:rs3, r4:rs4)
932
933 fixLne :: (a -> LneM a) -> LneM a
934 fixLne expr env lvs_cont
935   = result
936   where
937     result = expr result env lvs_cont
938 \end{code}
939
940 Functions specific to this monad:
941
942 \begin{code}
943 getVarsLiveInCont :: LneM LiveInfo
944 getVarsLiveInCont env lvs_cont = lvs_cont
945
946 setVarsLiveInCont :: LiveInfo -> LneM a -> LneM a
947 setVarsLiveInCont new_lvs_cont expr env lvs_cont
948   = expr env new_lvs_cont
949
950 extendVarEnvLne :: [(Id, HowBound)] -> LneM a -> LneM a
951 extendVarEnvLne ids_w_howbound expr env lvs_cont
952   = expr (extendVarEnvList env ids_w_howbound) lvs_cont
953
954 lookupVarLne :: Id -> LneM HowBound
955 lookupVarLne v env lvs_cont = returnLne (lookupBinding env v) env lvs_cont
956
957 getEnvLne :: LneM (IdEnv HowBound)
958 getEnvLne env lvs_cont = returnLne env env lvs_cont
959
960 lookupBinding :: IdEnv HowBound -> Id -> HowBound
961 lookupBinding env v = case lookupVarEnv env v of
962                         Just xx -> xx
963                         Nothing -> ASSERT2( isGlobalId v, ppr v ) ImportBound
964
965
966 -- The result of lookupLiveVarsForSet, a set of live variables, is
967 -- only ever tacked onto a decorated expression. It is never used as
968 -- the basis of a control decision, which might give a black hole.
969
970 freeVarsToLiveVars :: FreeVarsInfo -> LneM LiveInfo
971 freeVarsToLiveVars fvs env live_in_cont
972   = returnLne live_info env live_in_cont
973   where
974     live_info    = foldr unionLiveInfo live_in_cont lvs_from_fvs
975     lvs_from_fvs = map do_one (allFreeIds fvs)
976
977     do_one (v, how_bound)
978       = case how_bound of
979           ImportBound                     -> unitLiveCaf v      -- Only CAF imports are 
980                                                                 -- recorded in fvs
981           LetBound TopLet _              
982                 | mayHaveCafRefs (idCafInfo v) -> unitLiveCaf v
983                 | otherwise                    -> emptyLiveInfo
984
985           LetBound (NestedLet lvs) _      -> lvs        -- lvs already contains v
986                                                         -- (see the invariant on NestedLet)
987
988           _lambda_or_case_binding         -> unitLiveVar v      -- Bound by lambda or case
989 \end{code}
990
991 %************************************************************************
992 %*                                                                      *
993 \subsection[Free-var info]{Free variable information}
994 %*                                                                      *
995 %************************************************************************
996
997 \begin{code}
998 type FreeVarsInfo = VarEnv (Var, HowBound, StgBinderInfo)
999         -- The Var is so we can gather up the free variables
1000         -- as a set.
1001         --
1002         -- The HowBound info just saves repeated lookups;
1003         -- we look up just once when we encounter the occurrence.
1004         -- INVARIANT: Any ImportBound Ids are HaveCafRef Ids
1005         --            Imported Ids without CAF refs are simply
1006         --            not put in the FreeVarsInfo for an expression.
1007         --            See singletonFVInfo and freeVarsToLiveVars
1008         --
1009         -- StgBinderInfo records how it occurs; notably, we
1010         -- are interested in whether it only occurs in saturated 
1011         -- applications, because then we don't need to build a
1012         -- curried version.
1013         -- If f is mapped to noBinderInfo, that means
1014         -- that f *is* mentioned (else it wouldn't be in the
1015         -- IdEnv at all), but perhaps in an unsaturated applications.
1016         --
1017         -- All case/lambda-bound things are also mapped to
1018         -- noBinderInfo, since we aren't interested in their
1019         -- occurence info.
1020         --
1021         -- For ILX we track free var info for type variables too;
1022         -- hence VarEnv not IdEnv
1023 \end{code}
1024
1025 \begin{code}
1026 emptyFVInfo :: FreeVarsInfo
1027 emptyFVInfo = emptyVarEnv
1028
1029 singletonFVInfo :: Id -> HowBound -> StgBinderInfo -> FreeVarsInfo
1030 -- Don't record non-CAF imports at all, to keep free-var sets small
1031 singletonFVInfo id ImportBound info
1032    | mayHaveCafRefs (idCafInfo id) = unitVarEnv id (id, ImportBound, info)
1033    | otherwise                     = emptyVarEnv
1034 singletonFVInfo id how_bound info  = unitVarEnv id (id, how_bound, info)
1035
1036 tyvarFVInfo :: TyVarSet -> FreeVarsInfo
1037 tyvarFVInfo tvs = foldVarSet add emptyFVInfo tvs
1038         where
1039           add tv fvs = extendVarEnv fvs tv (tv, LambdaBound, noBinderInfo)
1040                 -- Type variables must be lambda-bound
1041
1042 unionFVInfo :: FreeVarsInfo -> FreeVarsInfo -> FreeVarsInfo
1043 unionFVInfo fv1 fv2 = plusVarEnv_C plusFVInfo fv1 fv2
1044
1045 unionFVInfos :: [FreeVarsInfo] -> FreeVarsInfo
1046 unionFVInfos fvs = foldr unionFVInfo emptyFVInfo fvs
1047
1048 minusFVBinders :: [Id] -> FreeVarsInfo -> FreeVarsInfo
1049 minusFVBinders vs fv = foldr minusFVBinder fv vs
1050
1051 minusFVBinder :: Id -> FreeVarsInfo -> FreeVarsInfo
1052 minusFVBinder v fv | isId v && opt_RuntimeTypes
1053                    = (fv `delVarEnv` v) `unionFVInfo` 
1054                      tyvarFVInfo (tyVarsOfType (idType v))
1055                    | otherwise = fv `delVarEnv` v
1056         -- When removing a binder, remember to add its type variables
1057         -- c.f. CoreFVs.delBinderFV
1058
1059 elementOfFVInfo :: Id -> FreeVarsInfo -> Bool
1060 elementOfFVInfo id fvs = maybeToBool (lookupVarEnv fvs id)
1061
1062 lookupFVInfo :: FreeVarsInfo -> Id -> StgBinderInfo
1063 -- Find how the given Id is used.
1064 -- Externally visible things may be used any old how
1065 lookupFVInfo fvs id 
1066   | isExternalName (idName id) = noBinderInfo
1067   | otherwise = case lookupVarEnv fvs id of
1068                         Nothing         -> noBinderInfo
1069                         Just (_,_,info) -> info
1070
1071 allFreeIds :: FreeVarsInfo -> [(Id,HowBound)]   -- Both top level and non-top-level Ids
1072 allFreeIds fvs = [(id,how_bound) | (id,how_bound,_) <- varEnvElts fvs, isId id]
1073
1074 -- Non-top-level things only, both type variables and ids
1075 -- (type variables only if opt_RuntimeTypes)
1076 getFVs :: FreeVarsInfo -> [Var] 
1077 getFVs fvs = [id | (id, how_bound, _) <- varEnvElts fvs, 
1078                     not (topLevelBound how_bound) ]
1079
1080 getFVSet :: FreeVarsInfo -> VarSet
1081 getFVSet fvs = mkVarSet (getFVs fvs)
1082
1083 plusFVInfo (id1,hb1,info1) (id2,hb2,info2)
1084   = ASSERT (id1 == id2 && hb1 `check_eq_how_bound` hb2)
1085     (id1, hb1, combineStgBinderInfo info1 info2)
1086
1087 -- The HowBound info for a variable in the FVInfo should be consistent
1088 check_eq_how_bound ImportBound        ImportBound        = True
1089 check_eq_how_bound LambdaBound        LambdaBound        = True
1090 check_eq_how_bound (LetBound li1 ar1) (LetBound li2 ar2) = ar1 == ar2 && check_eq_li li1 li2
1091 check_eq_how_bound hb1                hb2                = False
1092
1093 check_eq_li (NestedLet _) (NestedLet _) = True
1094 check_eq_li TopLet        TopLet        = True
1095 check_eq_li li1           li2           = False
1096 \end{code}
1097
1098 Misc.
1099 \begin{code}
1100 filterStgBinders :: [Var] -> [Var]
1101 filterStgBinders bndrs
1102   | opt_RuntimeTypes = bndrs
1103   | otherwise        = filter isId bndrs
1104 \end{code}
1105
1106
1107 \begin{code}
1108         -- Ignore all notes except SCC
1109 myCollectBinders expr
1110   = go [] expr
1111   where
1112     go bs (Lam b e)          = go (b:bs) e
1113     go bs e@(Note (SCC _) _) = (reverse bs, e) 
1114     go bs (Cast e co)        = go bs e
1115     go bs (Note _ e)         = go bs e
1116     go bs e                  = (reverse bs, e)
1117
1118 myCollectArgs :: CoreExpr -> (Id, [CoreArg])
1119         -- We assume that we only have variables
1120         -- in the function position by now
1121 myCollectArgs expr
1122   = go expr []
1123   where
1124     go (Var v)          as = (v, as)
1125     go (App f a) as        = go f (a:as)
1126     go (Note (SCC _) e) as = pprPanic "CoreToStg.myCollectArgs" (ppr expr)
1127     go (Cast e co)      as = go e as
1128     go (Note n e)       as = go e as
1129     go _                as = pprPanic "CoreToStg.myCollectArgs" (ppr expr)
1130 \end{code}
1131
1132 \begin{code}
1133 stgArity :: Id -> HowBound -> Arity
1134 stgArity f (LetBound _ arity) = arity
1135 stgArity f ImportBound        = idArity f
1136 stgArity f LambdaBound        = 0
1137 \end{code}