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