2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
4 %************************************************************************
6 \section[CoreToStg]{Converting core syntax to STG syntax}
8 %************************************************************************
10 Convert a @CoreSyntax@ program to a @StgSyntax@ program.
13 module CoreToStg ( topCoreBindsToStg ) where
15 #include "HsVersions.h"
17 import CoreSyn -- input
18 import StgSyn -- output
20 import CoreUtils ( exprType )
21 import SimplUtils ( findDefault )
22 import CostCentre ( noCCS )
23 import Id ( Id, mkSysLocal, idType, idStrictness, isExportedId,
24 mkVanillaId, idName, idDemandInfo, idArity, setIdType,
27 import IdInfo ( StrictnessInfo(..), IdFlavour(..) )
28 import DataCon ( dataConWrapId )
29 import Demand ( Demand, isStrict, wwLazy )
30 import Name ( setNameUnique )
32 import PrimOp ( PrimOp(..), setCCallUnique )
33 import Type ( isUnLiftedType, isUnboxedTupleType, Type, splitFunTy_maybe,
34 UsageAnn(..), tyUsg, applyTy, repType, seqType,
35 splitRepFunTys, mkFunTys
37 import UniqSupply -- all of it, really
38 import BasicTypes ( TopLevelFlag(..), isNotTopLevel )
39 import UniqSet ( emptyUniqSet )
45 *************************************************
46 *************** OVERVIEW *********************
47 *************************************************
50 The business of this pass is to convert Core to Stg. On the way it
51 does some important transformations:
53 1. We discard type lambdas and applications. In so doing we discard
54 "trivial" bindings such as
56 where t1, t2 are types
58 2. We get the program into "A-normal form". In particular:
60 f E ==> let x = E in f x
61 OR ==> case E of x -> f x
63 where E is a non-trivial expression.
64 Which transformation is used depends on whether f is strict or not.
65 [Previously the transformation to case used to be done by the
66 simplifier, but it's better done here. It does mean that f needs
67 to have its strictness info correct!.]
69 Similarly, convert any unboxed let's into cases.
70 [I'm experimenting with leaving 'ok-for-speculation' rhss in let-form
71 right up to this point.]
73 3. We clone all local binders. The code generator uses the uniques to
74 name chunks of code for thunks, so it's important that the names used
75 are globally unique, not simply not-in-scope, which is all that
76 the simplifier ensures.
81 * We don't pin on correct arities any more, because they can be mucked up
82 by the lambda lifter. In particular, the lambda lifter can take a local
83 letrec-bound variable and make it a lambda argument, which shouldn't have
84 an arity. So SetStgVarInfo sets arities now.
86 * We do *not* pin on the correct free/live var info; that's done later.
87 Instead we use bOGUS_LVS and _FVS as a placeholder.
89 [Quite a bit of stuff that used to be here has moved
90 to tidyCorePgm (SimplCore.lhs) SLPJ Nov 96]
93 %************************************************************************
95 \subsection[coreToStg-programs]{Converting a core program and core bindings}
97 %************************************************************************
99 March 98: We keep a small environment to give all locally bound
100 Names new unique ids, since the code generator assumes that binders
101 are unique across a module. (Simplifier doesn't maintain this
102 invariant any longer.)
104 A binder to be floated out becomes an @StgFloatBind@.
107 type StgEnv = IdEnv Id
109 data StgFloatBind = NoBindF
110 | RecF [(Id, StgRhs)]
113 StgExpr -- *Can* be a StgLam
117 -- The interesting one is the NonRecF
118 -- NonRecF x rhs demand binds
120 -- x = let binds in rhs
121 -- (or possibly case etc if x demand is strict)
122 -- The binds are kept separate so they can be floated futher
126 A @RhsDemand@ gives the demand on an RHS: strict (@isStrictDem@) and
127 thus case-bound, or if let-bound, at most once (@isOnceDem@) or
131 data RhsDemand = RhsDemand { isStrictDem :: Bool, -- True => used at least once
132 isOnceDem :: Bool -- True => used at most once
135 mkDem :: Demand -> Bool -> RhsDemand
136 mkDem strict once = RhsDemand (isStrict strict) once
138 mkDemTy :: Demand -> Type -> RhsDemand
139 mkDemTy strict ty = RhsDemand (isStrict strict) (isOnceTy ty)
141 isOnceTy :: Type -> Bool
145 opt_UsageSPOn && -- can't expect annotations if -fusagesp is off
150 UsVar uv -> pprPanic "CoreToStg: unexpected uvar annot:" (ppr uv)
152 bdrDem :: Id -> RhsDemand
153 bdrDem id = mkDem (idDemandInfo id) (isOnceTy (idType id))
155 safeDem, onceDem :: RhsDemand
156 safeDem = RhsDemand False False -- always safe to use this
157 onceDem = RhsDemand False True -- used at most once
160 No free/live variable information is pinned on in this pass; it's added
162 we use @bOGUS_LVs@ and @bOGUS_FVs@ as placeholders.
164 When printing out the Stg we need non-bottom values in these
168 bOGUS_LVs :: StgLiveVars
169 bOGUS_LVs = emptyUniqSet
176 topCoreBindsToStg :: UniqSupply -- name supply
177 -> [CoreBind] -- input
178 -> [StgBinding] -- output
180 topCoreBindsToStg us core_binds
181 = initUs_ us (coreBindsToStg emptyVarEnv core_binds)
183 coreBindsToStg :: StgEnv -> [CoreBind] -> UniqSM [StgBinding]
185 coreBindsToStg env [] = returnUs []
186 coreBindsToStg env (b:bs)
187 = coreBindToStg TopLevel env b `thenUs` \ (bind_spec, new_env) ->
188 coreBindsToStg new_env bs `thenUs` \ new_bs ->
190 NonRecF bndr rhs dem floats
191 -> ASSERT2( not (isStrictDem dem) &&
192 not (isUnLiftedType (idType bndr)),
193 ppr b ) -- No top-level cases!
195 mkStgBinds floats rhs `thenUs` \ new_rhs ->
196 returnUs (StgNonRec bndr (exprToRhs dem TopLevel new_rhs)
198 -- Keep all the floats inside...
199 -- Some might be cases etc
200 -- We might want to revisit this decision
202 RecF prs -> returnUs (StgRec prs : new_bs)
203 NoBindF -> pprTrace "topCoreBindsToStg" (ppr b) $
208 %************************************************************************
210 \subsection[coreToStg-binds]{Converting bindings}
212 %************************************************************************
215 coreBindToStg :: TopLevelFlag -> StgEnv -> CoreBind -> UniqSM (StgFloatBind, StgEnv)
217 coreBindToStg top_lev env (NonRec binder rhs)
218 = coreExprToStgFloat env rhs `thenUs` \ (floats, stg_rhs) ->
219 case (floats, stg_rhs) of
220 ([], StgApp var []) | not (isExportedId binder)
221 -> returnUs (NoBindF, extendVarEnv env binder var)
222 -- A trivial binding let x = y in ...
223 -- can arise if postSimplExpr floats a NoRep literal out
224 -- so it seems sensible to deal with it well.
225 -- But we don't want to discard exported things. They can
226 -- occur; e.g. an exported user binding f = g
228 other -> newLocalId top_lev env binder `thenUs` \ (new_env, new_binder) ->
229 returnUs (NonRecF new_binder stg_rhs dem floats, new_env)
234 coreBindToStg top_lev env (Rec pairs)
235 = newLocalIds top_lev env binders `thenUs` \ (env', binders') ->
236 mapUs (do_rhs env') pairs `thenUs` \ stg_rhss ->
237 returnUs (RecF (binders' `zip` stg_rhss), env')
239 binders = map fst pairs
240 do_rhs env (bndr,rhs) = coreExprToStgFloat env rhs `thenUs` \ (floats, stg_expr) ->
241 mkStgBinds floats stg_expr `thenUs` \ stg_expr' ->
242 -- NB: stg_expr' might still be a StgLam (and we want that)
243 returnUs (exprToRhs (bdrDem bndr) top_lev stg_expr')
247 %************************************************************************
249 \subsection[coreToStg-rhss]{Converting right hand sides}
251 %************************************************************************
254 exprToRhs :: RhsDemand -> TopLevelFlag -> StgExpr -> StgRhs
255 exprToRhs dem _ (StgLam _ bndrs body)
256 = ASSERT( not (null bndrs) )
261 ReEntrant -- binders is non-empty
266 We reject the following candidates for 'static constructor'dom:
268 - any dcon that takes a lit-lit as an arg.
269 - [Win32 DLLs only]: any dcon that resides in a DLL
270 (or takes as arg something that is.)
272 These constraints are necessary to ensure that the code
273 generated in the end for the static constructors, which
274 live in the data segment, remain valid - i.e., it has to
275 be constant. For obvious reasons, that's hard to guarantee
276 with lit-lits. The second case of a constructor referring
277 to static closures hiding out in some DLL is an artifact
278 of the way Win32 DLLs handle global DLL variables. A (data)
279 symbol exported from a DLL has to be accessed through a
280 level of indirection at the site of use, so whereas
282 extern StgClosure y_closure;
283 extern StgClosure z_closure;
284 x = { ..., &y_closure, &z_closure };
286 is legal when the symbols are in scope at link-time, it is
287 not when y_closure is in a DLL. So, any potential static
288 closures that refers to stuff that's residing in a DLL
289 will be put in an (updateable) thunk instead.
291 An alternative strategy is to support the generation of
292 constructors (ala C++ static class constructors) which will
293 then be run at load time to fix up static closures.
295 exprToRhs dem toplev (StgConApp con args)
296 | isNotTopLevel toplev || not (isDllConApp con args)
297 -- isDllConApp checks for LitLit args too
298 = StgRhsCon noCCS con args
302 StgRhsClosure noCCS -- No cost centre (ToDo?)
304 noSRT -- figure out later
310 upd = if isOnceDem dem then SingleEntry else Updatable
311 -- HA! Paydirt for "dem"
315 %************************************************************************
317 \subsection[coreToStg-atoms{Converting atoms}
319 %************************************************************************
322 coreArgsToStg :: StgEnv -> [(CoreArg,RhsDemand)] -> UniqSM ([StgFloatBind], [StgArg])
323 -- Arguments are all value arguments (tyargs already removed), paired with their demand
328 coreArgsToStg env (ad:ads)
329 = coreArgToStg env ad `thenUs` \ (bs1, a') ->
330 coreArgsToStg env ads `thenUs` \ (bs2, as') ->
331 returnUs (bs1 ++ bs2, a' : as')
334 coreArgToStg :: StgEnv -> (CoreArg,RhsDemand) -> UniqSM ([StgFloatBind], StgArg)
335 -- This is where we arrange that a non-trivial argument is let-bound
337 coreArgToStg env (arg,dem)
338 = coreExprToStgFloat env arg `thenUs` \ (floats, arg') ->
340 StgApp v [] -> returnUs (floats, StgVarArg v)
341 StgLit lit -> returnUs (floats, StgLitArg lit)
343 StgConApp con [] -> returnUs (floats, StgVarArg (dataConWrapId con))
344 -- A nullary constructor can be replaced with
345 -- a ``call'' to its wrapper
347 other -> newStgVar arg_ty `thenUs` \ v ->
348 returnUs ([NonRecF v arg' dem floats], StgVarArg v)
350 arg_ty = exprType arg
354 %************************************************************************
356 \subsection[coreToStg-exprs]{Converting core expressions}
358 %************************************************************************
361 coreExprToStg :: StgEnv -> CoreExpr -> UniqSM StgExpr
362 coreExprToStg env expr
363 = coreExprToStgFloat env expr `thenUs` \ (binds,stg_expr) ->
364 mkStgBinds binds stg_expr `thenUs` \ stg_expr' ->
368 %************************************************************************
370 \subsubsection[coreToStg-let(rec)]{Let and letrec expressions}
372 %************************************************************************
375 coreExprToStgFloat :: StgEnv -> CoreExpr
376 -> UniqSM ([StgFloatBind], StgExpr)
377 -- Transform an expression to STG. The 'floats' are
378 -- any bindings we had to create for function arguments.
384 coreExprToStgFloat env (Var var)
385 = mkStgApp env var [] (idType var) `thenUs` \ app ->
388 coreExprToStgFloat env (Lit lit)
389 = returnUs ([], StgLit lit)
391 coreExprToStgFloat env (Let bind body)
392 = coreBindToStg NotTopLevel env bind `thenUs` \ (new_bind, new_env) ->
393 coreExprToStgFloat new_env body `thenUs` \ (floats, stg_body) ->
394 returnUs (new_bind:floats, stg_body)
397 Convert core @scc@ expression directly to STG @scc@ expression.
400 coreExprToStgFloat env (Note (SCC cc) expr)
401 = coreExprToStg env expr `thenUs` \ stg_expr ->
402 returnUs ([], StgSCC cc stg_expr)
404 coreExprToStgFloat env (Note other_note expr)
405 = coreExprToStgFloat env expr
409 coreExprToStgFloat env expr@(Type _)
410 = pprPanic "coreExprToStgFloat: tyarg unexpected:" $ ppr expr
414 %************************************************************************
416 \subsubsection[coreToStg-lambdas]{Lambda abstractions}
418 %************************************************************************
421 coreExprToStgFloat env expr@(Lam _ _)
423 expr_ty = exprType expr
424 (binders, body) = collectBinders expr
425 id_binders = filter isId binders
427 if null id_binders then -- It was all type/usage binders; tossed
428 coreExprToStgFloat env body
430 -- At least some value binders
431 newLocalIds NotTopLevel env id_binders `thenUs` \ (env', binders') ->
432 coreExprToStgFloat env' body `thenUs` \ (floats, stg_body) ->
433 mkStgBinds floats stg_body `thenUs` \ stg_body' ->
436 StgLam ty lam_bndrs lam_body ->
437 -- If the body reduced to a lambda too, join them up
438 returnUs ([], mkStgLam expr_ty (binders' ++ lam_bndrs) lam_body)
441 -- Body didn't reduce to a lambda, so return one
442 returnUs ([], mkStgLam expr_ty binders' stg_body')
446 %************************************************************************
448 \subsubsection[coreToStg-applications]{Applications}
450 %************************************************************************
453 coreExprToStgFloat env expr@(App _ _)
455 (fun,rads,ty,ss) = collect_args expr
457 final_ads | null ss = ads
458 | otherwise = zap ads -- Too few args to satisfy strictness info
459 -- so we have to ignore all the strictness info
460 -- e.g. + (error "urk")
461 -- Here, we can't evaluate the arg strictly,
462 -- because this partial application might be seq'd
464 coreArgsToStg env final_ads `thenUs` \ (arg_floats, stg_args) ->
466 -- Now deal with the function
467 case (fun, stg_args) of
468 (Var fn_id, _) -> -- A function Id, so do an StgApp; it's ok if
469 -- there are no arguments.
470 mkStgApp env fn_id stg_args ty `thenUs` \ app ->
471 returnUs (arg_floats, app)
473 (non_var_fun, []) -> -- No value args, so recurse into the function
474 ASSERT( null arg_floats )
475 coreExprToStgFloat env non_var_fun
477 other -> -- A non-variable applied to things; better let-bind it.
478 newStgVar (exprType fun) `thenUs` \ fn_id ->
479 coreExprToStgFloat env fun `thenUs` \ (fun_floats, stg_fun) ->
480 mkStgApp env fn_id stg_args ty `thenUs` \ app ->
481 returnUs (NonRecF fn_id stg_fun onceDem fun_floats : arg_floats,
485 -- Collect arguments and demands (*in reverse order*)
486 -- collect_args e = (f, args_w_demands, ty, stricts)
487 -- => e = f tys args, (i.e. args are just the value args)
489 -- stricts is the leftover demands of e on its further args
490 -- If stricts runs out, we zap all the demands in args_w_demands
491 -- because partial applications are lazy
493 collect_args :: CoreExpr -> (CoreExpr, [(CoreExpr,RhsDemand)], Type, [Demand])
495 collect_args (Note (Coerce ty _) e) = let (the_fun,ads,_,ss) = collect_args e
496 in (the_fun,ads,ty,ss)
497 collect_args (Note InlineCall e) = collect_args e
498 collect_args (Note (TermUsg _) e) = collect_args e
500 collect_args (App fun (Type tyarg)) = let (the_fun,ads,fun_ty,ss) = collect_args fun
501 in (the_fun,ads,applyTy fun_ty tyarg,ss)
502 collect_args (App fun arg)
503 = (the_fun, (arg, mkDemTy ss1 arg_ty) : ads, res_ty, ss_rest)
505 (ss1, ss_rest) = case ss of
506 (ss1:ss_rest) -> (ss1, ss_rest)
508 (the_fun, ads, fun_ty, ss) = collect_args fun
509 (arg_ty, res_ty) = expectJust "coreExprToStgFloat:collect_args" $
510 splitFunTy_maybe fun_ty
513 = (Var v, [], idType v, stricts)
515 stricts = case idStrictness v of
516 StrictnessInfo demands _ -> demands
517 other -> repeat wwLazy
519 collect_args fun = (fun, [], exprType fun, repeat wwLazy)
521 -- "zap" nukes the strictness info for a partial application
522 zap ads = [(arg, RhsDemand False once) | (arg, RhsDemand _ once) <- ads]
526 %************************************************************************
528 \subsubsection[coreToStg-cases]{Case expressions}
530 %************************************************************************
533 coreExprToStgFloat env (Case scrut bndr alts)
534 = coreExprToStgFloat env scrut `thenUs` \ (binds, scrut') ->
535 newLocalId NotTopLevel env bndr `thenUs` \ (env', bndr') ->
536 alts_to_stg env' (findDefault alts) `thenUs` \ alts' ->
537 mkStgCase scrut' bndr' alts' `thenUs` \ expr' ->
538 returnUs (binds, expr')
540 scrut_ty = idType bndr
541 prim_case = isUnLiftedType scrut_ty && not (isUnboxedTupleType scrut_ty)
543 alts_to_stg env (alts, deflt)
545 = default_to_stg env deflt `thenUs` \ deflt' ->
546 mapUs (prim_alt_to_stg env) alts `thenUs` \ alts' ->
547 returnUs (mkStgPrimAlts scrut_ty alts' deflt')
550 = default_to_stg env deflt `thenUs` \ deflt' ->
551 mapUs (alg_alt_to_stg env) alts `thenUs` \ alts' ->
552 returnUs (mkStgAlgAlts scrut_ty alts' deflt')
554 alg_alt_to_stg env (DataAlt con, bs, rhs)
555 = newLocalIds NotTopLevel env (filter isId bs) `thenUs` \ (env', stg_bs) ->
556 coreExprToStg env' rhs `thenUs` \ stg_rhs ->
557 returnUs (con, stg_bs, [ True | b <- stg_bs ]{-bogus use mask-}, stg_rhs)
558 -- NB the filter isId. Some of the binders may be
559 -- existential type variables, which STG doesn't care about
561 prim_alt_to_stg env (LitAlt lit, args, rhs)
562 = ASSERT( null args )
563 coreExprToStg env rhs `thenUs` \ stg_rhs ->
564 returnUs (lit, stg_rhs)
566 default_to_stg env Nothing
567 = returnUs StgNoDefault
569 default_to_stg env (Just rhs)
570 = coreExprToStg env rhs `thenUs` \ stg_rhs ->
571 returnUs (StgBindDefault stg_rhs)
572 -- The binder is used for prim cases and not otherwise
573 -- (hack for old code gen)
577 %************************************************************************
579 \subsection[coreToStg-misc]{Miscellaneous helping functions}
581 %************************************************************************
583 There's not anything interesting we can ASSERT about \tr{var} if it
584 isn't in the StgEnv. (WDP 94/06)
588 newStgVar :: Type -> UniqSM Id
590 = getUniqueUs `thenUs` \ uniq ->
592 returnUs (mkSysLocal SLIT("stg") uniq ty)
596 newLocalId TopLevel env id
597 -- Don't clone top-level binders. MkIface relies on their
598 -- uniques staying the same, so it can snaffle IdInfo off the
599 -- STG ids to put in interface files.
606 returnUs (env, mkVanillaId name ty)
609 newLocalId NotTopLevel env id
610 = -- Local binder, give it a new unique Id.
611 getUniqueUs `thenUs` \ uniq ->
615 new_id = mkVanillaId (setNameUnique name uniq) ty
616 new_env = extendVarEnv env id new_id
620 returnUs (new_env, new_id)
622 newLocalIds :: TopLevelFlag -> StgEnv -> [Id] -> UniqSM (StgEnv, [Id])
623 newLocalIds top_lev env []
625 newLocalIds top_lev env (b:bs)
626 = newLocalId top_lev env b `thenUs` \ (env', b') ->
627 newLocalIds top_lev env' bs `thenUs` \ (env'', bs') ->
628 returnUs (env'', b':bs')
632 %************************************************************************
634 \subsection{Building STG syn}
636 %************************************************************************
639 mkStgAlgAlts ty alts deflt = seqType ty `seq` StgAlgAlts ty alts deflt
640 mkStgPrimAlts ty alts deflt = seqType ty `seq` StgPrimAlts ty alts deflt
641 mkStgLam ty bndrs body = seqType ty `seq` StgLam ty bndrs body
643 mkStgApp :: StgEnv -> Id -> [StgArg] -> Type -> UniqSM StgExpr
644 -- The type is the type of the entire application
645 mkStgApp env fn args ty
646 = case idFlavour fn_alias of
648 -> saturate fn_alias args ty $ \ args' ty' ->
649 returnUs (StgConApp dc args')
651 PrimOpId (CCallOp ccall)
652 -- Sigh...make a guaranteed unique name for a dynamic ccall
653 -- Done here, not earlier, because it's a code-gen thing
654 -> saturate fn_alias args ty $ \ args' ty' ->
655 getUniqueUs `thenUs` \ uniq ->
656 let ccall' = setCCallUnique ccall uniq in
657 returnUs (StgPrimApp (CCallOp ccall') args' ty')
661 -> saturate fn_alias args ty $ \ args' ty' ->
662 returnUs (StgPrimApp op args' ty')
664 other -> returnUs (StgApp fn_alias args)
667 fn_alias = case (lookupVarEnv env fn) of -- In case it's been cloned
671 saturate :: Id -> [StgArg] -> Type -> ([StgArg] -> Type -> UniqSM StgExpr) -> UniqSM StgExpr
672 -- The type should be the type of (id args)
673 saturate fn args ty thing_inside
674 | excess_arity == 0 -- Saturated, so nothing to do
675 = thing_inside args ty
677 | otherwise -- An unsaturated constructor or primop; eta expand it
678 = ASSERT2( excess_arity > 0 && excess_arity <= length arg_tys,
679 ppr fn <+> ppr args <+> ppr excess_arity <+> parens (ppr ty) <+> ppr arg_tys )
680 mapUs newStgVar extra_arg_tys `thenUs` \ arg_vars ->
681 thing_inside (args ++ map StgVarArg arg_vars) final_res_ty `thenUs` \ body ->
682 returnUs (StgLam ty arg_vars body)
684 fn_arity = idArity fn
685 excess_arity = fn_arity - length args
686 (arg_tys, res_ty) = splitRepFunTys ty
687 extra_arg_tys = take excess_arity arg_tys
688 final_res_ty = mkFunTys (drop excess_arity arg_tys) res_ty
692 -- Stg doesn't have a lambda *expression*
693 deStgLam (StgLam ty bndrs body)
694 -- Try for eta reduction
695 = ASSERT( not (null bndrs) )
697 Just e -> -- Eta succeeded
700 Nothing -> -- Eta failed, so let-bind the lambda
701 newStgVar ty `thenUs` \ fn ->
702 returnUs (StgLet (StgNonRec fn lam_closure) (StgApp fn []))
704 lam_closure = StgRhsClosure noCCS
708 ReEntrant -- binders is non-empty
713 | n_remaining >= 0 &&
714 and (zipWith ok bndrs last_args) &&
715 notInExpr bndrs remaining_expr
716 = Just remaining_expr
718 remaining_expr = StgApp f remaining_args
719 (remaining_args, last_args) = splitAt n_remaining args
720 n_remaining = length args - length bndrs
722 eta (StgLet bind@(StgNonRec b r) body)
723 | notInRhs bndrs r = case eta body of
724 Just e -> Just (StgLet bind e)
729 ok bndr (StgVarArg arg) = bndr == arg
730 ok bndr other = False
732 deStgLam expr = returnUs expr
735 --------------------------------------------------
736 notInExpr :: [Id] -> StgExpr -> Bool
737 notInExpr vs (StgApp f args) = notInId vs f && notInArgs vs args
738 notInExpr vs (StgLet (StgNonRec b r) body) = notInRhs vs r && notInExpr vs body
739 notInExpr vs other = False -- Safe
741 notInRhs :: [Id] -> StgRhs -> Bool
742 notInRhs vs (StgRhsCon _ _ args) = notInArgs vs args
743 notInRhs vs (StgRhsClosure _ _ _ _ _ _ body) = notInExpr vs body
744 -- Conservative: we could delete the binders from vs, but
745 -- cloning means this will never help
747 notInArgs :: [Id] -> [StgArg] -> Bool
748 notInArgs vs args = all ok args
750 ok (StgVarArg v) = notInId vs v
751 ok (StgLitArg l) = True
753 notInId :: [Id] -> Id -> Bool
754 notInId vs v = not (v `elem` vs)
758 mkStgBinds :: [StgFloatBind]
759 -> StgExpr -- *Can* be a StgLam
760 -> UniqSM StgExpr -- *Can* be a StgLam
762 mkStgBinds [] body = returnUs body
763 mkStgBinds (b:bs) body
764 = deStgLam body `thenUs` \ body' ->
767 go [] body = returnUs body
768 go (b:bs) body = go bs body `thenUs` \ body' ->
771 -- The 'body' arg of mkStgBind can't be a StgLam
772 mkStgBind NoBindF body = returnUs body
773 mkStgBind (RecF prs) body = returnUs (StgLet (StgRec prs) body)
775 mkStgBind (NonRecF bndr rhs dem floats) body
777 -- We shouldn't get let or case of the form v=w
779 StgApp v [] -> pprTrace "mkStgLet" (ppr bndr <+> ppr v)
780 (mk_stg_let bndr rhs dem floats body)
781 other -> mk_stg_let bndr rhs dem floats body
783 mk_stg_let bndr rhs dem floats body
785 | isUnLiftedType bndr_rep_ty -- Use a case/PrimAlts
786 = ASSERT( not (isUnboxedTupleType bndr_rep_ty) )
787 mkStgCase rhs bndr (StgPrimAlts bndr_rep_ty [] (StgBindDefault body)) `thenUs` \ expr' ->
788 mkStgBinds floats expr'
792 -- Strict let with WHNF rhs
794 StgLet (StgNonRec bndr (exprToRhs dem NotTopLevel rhs)) body
796 -- Lazy let with WHNF rhs; float until we find a strict binding
798 (floats_out, floats_in) = splitFloats floats
800 mkStgBinds floats_in rhs `thenUs` \ new_rhs ->
801 mkStgBinds floats_out $
802 StgLet (StgNonRec bndr (exprToRhs dem NotTopLevel new_rhs)) body
804 | otherwise -- Not WHNF
806 -- Strict let with non-WHNF rhs
807 mkStgCase rhs bndr (StgAlgAlts bndr_rep_ty [] (StgBindDefault body)) `thenUs` \ expr' ->
808 mkStgBinds floats expr'
810 -- Lazy let with non-WHNF rhs, so keep the floats in the RHS
811 mkStgBinds floats rhs `thenUs` \ new_rhs ->
812 returnUs (StgLet (StgNonRec bndr (exprToRhs dem NotTopLevel new_rhs)) body)
815 bndr_rep_ty = repType (idType bndr)
816 is_strict = isStrictDem dem
817 is_whnf = case rhs of
818 StgConApp _ _ -> True
822 -- Split at the first strict binding
823 splitFloats fs@(NonRecF _ _ dem _ : _)
824 | isStrictDem dem = ([], fs)
826 splitFloats (f : fs) = case splitFloats fs of
827 (fs_out, fs_in) -> (f : fs_out, fs_in)
829 splitFloats [] = ([], [])
836 First, two special cases. We mangle cases involving
840 Up to this point, seq# will appear like this:
846 This code comes from an unfolding for 'seq' in Prelude.hs.
847 The 0# branch is purely to bamboozle the strictness analyser.
848 For example, if <stuff> is strict in x, and there was no seqError#
849 branch, the strictness analyser would conclude that the whole expression
850 was strict in x, and perhaps evaluate x first -- but that would be a DISASTER.
852 Now that the evaluation order is safe, we translate this into
857 This used to be done in the post-simplification phase, but we need
858 unfoldings involving seq# to appear unmangled in the interface file,
859 hence we do this mangling here.
861 Similarly, par# has an unfolding in PrelConc.lhs that makes it show
873 fork# isn't handled like this - it's an explicit IO operation now.
874 The reason is that fork# returns a ThreadId#, which gets in the
875 way of the above scheme. And anyway, IO is the only guaranteed
876 way to enforce ordering --SDM.
880 -- Discard alernatives in case (par# ..) of
881 mkStgCase scrut@(StgPrimApp ParOp _ _) bndr
882 (StgPrimAlts ty _ deflt@(StgBindDefault _))
883 = returnUs (StgCase scrut bOGUS_LVs bOGUS_LVs bndr noSRT (StgPrimAlts ty [] deflt))
885 mkStgCase (StgPrimApp SeqOp [scrut] _) bndr
886 (StgPrimAlts _ _ deflt@(StgBindDefault rhs))
887 = mkStgCase scrut_expr new_bndr new_alts
889 new_alts | isUnLiftedType scrut_ty = WARN( True, text "mkStgCase" ) StgPrimAlts scrut_ty [] deflt
890 | otherwise = StgAlgAlts scrut_ty [] deflt
891 scrut_ty = stgArgType scrut
892 new_bndr = setIdType bndr scrut_ty
893 -- NB: SeqOp :: forall a. a -> Int#
894 -- So bndr has type Int#
895 -- But now we are going to scrutinise the SeqOp's argument directly,
896 -- so we must change the type of the case binder to match that
897 -- of the argument expression e.
899 scrut_expr = case scrut of
900 StgVarArg v -> StgApp v []
901 -- Others should not happen because
902 -- seq of a value should have disappeared
903 StgLitArg l -> WARN( True, text "seq on" <+> ppr l ) StgLit l
905 mkStgCase scrut bndr alts
906 = deStgLam scrut `thenUs` \ scrut' ->
907 -- It is (just) possible to get a lambda as a srutinee here
908 -- Namely: fromDyn (toDyn ((+1)::Int->Int)) False)
909 -- gives: case ...Bool == Int->Int... of
910 -- True -> case coerce Bool (\x -> + 1 x) of
914 -- The True branch of the outer case will never happen, of course.
916 returnUs (StgCase scrut' bOGUS_LVs bOGUS_LVs bndr noSRT alts)