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