2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1996
6 We attach binding levels to Core bindings, in preparation for floating
9 We also let-ify many applications (notably case scrutinees), so they
10 will have a fighting chance of being floated sensible.
18 incMinorLvl, ltMajLvl, ltLvl, isTopLvl
21 #include "HsVersions.h"
26 import CoreUtils ( coreExprType, idSpecVars )
27 import CoreUnfold ( FormSummary, whnfOrBottom, mkFormSummary )
28 import FreeVars -- all of it
29 import MkId ( mkSysLocal )
31 nullIdEnv, addOneToIdEnv, growIdEnvList,
32 unionManyIdSets, unionIdSets, minusIdSet, mkIdSet,
36 import SrcLoc ( noSrcLoc )
37 import Type ( isUnpointedType, mkTyVarTys, mkForAllTys, tyVarsOfTypes, Type )
38 import TyVar ( emptyTyVarEnv, addToTyVarEnv,
39 growTyVarEnvList, lookupTyVarEnv,
42 unionManyTyVarSets, unionTyVarSets
44 import UniqSupply ( thenUs, returnUs, mapUs, mapAndUnzipUs,
45 mapAndUnzip3Us, getUnique, UniqSM,
48 import BasicTypes ( Unused )
49 import Maybes ( maybeToBool )
50 import Util ( mapAccumL, zipWithEqual, zipEqual, panic, assertPanic )
53 isLeakFreeType x y = False -- safe option; ToDo
56 %************************************************************************
58 \subsection{Level numbers}
60 %************************************************************************
64 = Top -- Means *really* the top level.
65 | Level Int -- Level number of enclosing lambdas
66 Int -- Number of big-lambda and/or case expressions between
67 -- here and the nearest enclosing lambda
70 The {\em level number} on a (type-)lambda-bound variable is the
71 nesting depth of the (type-)lambda which binds it. On an expression,
72 it's the maximum level number of its free (type-)variables. On a
73 let(rec)-bound variable, it's the level of its RHS. On a case-bound
74 variable, it's the number of enclosing lambdas.
76 Top-level variables: level~0. Those bound on the RHS of a top-level
77 definition but ``before'' a lambda; e.g., the \tr{x} in (levels shown
80 a_0 = let b_? = ... in
81 x_1 = ... b ... in ...
84 Level 0 0 will make something get floated to a top-level "equals",
85 @Top@ makes it go right to the top.
87 The main function @lvlExpr@ carries a ``context level'' (@ctxt_lvl@).
88 That's meant to be the level number of the enclosing binder in the
89 final (floated) program. If the level number of a sub-expression is
90 less than that of the context, then it might be worth let-binding the
91 sub-expression so that it will indeed float. This context level starts
92 at @Level 0 0@; it is never @Top@.
95 type LevelledExpr = GenCoreExpr (Id, Level) Id Unused
96 type LevelledArg = GenCoreArg Id Unused
97 type LevelledBind = GenCoreBinding (Id, Level) Id Unused
99 type LevelEnvs = (IdEnv Level, -- bind Ids to levels
100 TyVarEnv Level) -- bind type variables to levels
104 incMajorLvl :: Level -> Level
105 incMajorLvl Top = Level 1 0
106 incMajorLvl (Level major minor) = Level (major+1) 0
108 incMinorLvl :: Level -> Level
109 incMinorLvl Top = Level 0 1
110 incMinorLvl (Level major minor) = Level major (minor+1)
112 maxLvl :: Level -> Level -> Level
115 maxLvl l1@(Level maj1 min1) l2@(Level maj2 min2)
116 | (maj1 > maj2) || (maj1 == maj2 && min1 > min2) = l1
119 ltLvl :: Level -> Level -> Bool
121 ltLvl Top (Level _ _) = True
122 ltLvl (Level maj1 min1) (Level maj2 min2)
123 = (maj1 < maj2) || (maj1 == maj2 && min1 < min2)
125 ltMajLvl :: Level -> Level -> Bool
126 -- Tells if one level belongs to a difft *lambda* level to another
127 ltMajLvl l1 Top = False
128 ltMajLvl Top (Level 0 _) = False
129 ltMajLvl Top (Level _ _) = True
130 ltMajLvl (Level maj1 _) (Level maj2 _) = maj1 < maj2
132 isTopLvl :: Level -> Bool
134 isTopLvl other = False
136 isTopMajLvl :: Level -> Bool -- Tells if it's the top *lambda* level
137 isTopMajLvl Top = True
138 isTopMajLvl (Level maj _) = maj == 0
140 unTopify :: Level -> Level
141 unTopify Top = Level 0 0
144 instance Outputable Level where
145 ppr Top = ptext SLIT("<Top>")
146 ppr (Level maj min) = hcat [ char '<', int maj, char ',', int min, char '>' ]
149 %************************************************************************
151 \subsection{Main level-setting code}
153 %************************************************************************
156 setLevels :: [CoreBinding]
163 -- "do_them"'s main business is to thread the monad along
164 -- It gives each top binding the same empty envt, because
165 -- things unbound in the envt have level number zero implicitly
166 do_them :: [CoreBinding] -> LvlM [LevelledBind]
168 do_them [] = returnLvl []
170 = lvlTopBind b `thenLvl` \ (lvld_bind, _) ->
171 do_them bs `thenLvl` \ lvld_binds ->
172 returnLvl (lvld_bind ++ lvld_binds)
174 initial_envs = (nullIdEnv, emptyTyVarEnv)
176 lvlTopBind (NonRec binder rhs)
177 = lvlBind (Level 0 0) initial_envs (AnnNonRec binder (freeVars rhs))
178 -- Rhs can have no free vars!
180 lvlTopBind (Rec pairs)
181 = lvlBind (Level 0 0) initial_envs (AnnRec [(b,freeVars rhs) | (b,rhs) <- pairs])
184 %************************************************************************
186 \subsection{Bindings}
188 %************************************************************************
190 The binding stuff works for top level too.
193 type CoreBindingWithFVs = AnnCoreBinding Id Id Unused FVInfo
197 -> CoreBindingWithFVs
198 -> LvlM ([LevelledBind], LevelEnvs)
200 lvlBind ctxt_lvl envs@(venv, tenv) (AnnNonRec name rhs)
201 = setFloatLevel (Just name) {- Already let-bound -}
202 ctxt_lvl envs rhs ty `thenLvl` \ (final_lvl, rhs') ->
204 new_envs = (addOneToIdEnv venv name final_lvl, tenv)
206 returnLvl ([NonRec (name, final_lvl) rhs'], new_envs)
211 lvlBind ctxt_lvl envs@(venv, tenv) (AnnRec pairs)
212 = decideRecFloatLevel ctxt_lvl envs binders rhss
213 `thenLvl` \ (final_lvl, extra_binds, rhss') ->
215 binders_w_lvls = binders `zip` repeat final_lvl
216 new_envs = (growIdEnvList venv binders_w_lvls, tenv)
218 returnLvl (extra_binds ++ [Rec (zipEqual "lvlBind" binders_w_lvls rhss')], new_envs)
220 (binders,rhss) = unzip pairs
223 %************************************************************************
225 \subsection{Setting expression levels}
227 %************************************************************************
230 lvlExpr :: Level -- ctxt_lvl: Level of enclosing expression
231 -> LevelEnvs -- Level of in-scope names/tyvars
232 -> CoreExprWithFVs -- input expression
233 -> LvlM LevelledExpr -- Result expression
236 The @ctxt_lvl@ is, roughly, the level of the innermost enclosing
241 v = \x -> ...\y -> let r = case (..x..) of
245 When looking at the rhs of @r@, @ctxt_lvl@ will be 1 because that's
246 the level of @r@, even though it's inside a level-2 @\y@. It's
247 important that @ctxt_lvl@ is 1 and not 2 in @r@'s rhs, because we
248 don't want @lvlExpr@ to turn the scrutinee of the @case@ into an MFE
249 --- because it isn't a *maximal* free expression.
251 If there were another lambda in @r@'s rhs, it would get level-2 as well.
254 lvlExpr _ _ (_, AnnVar v) = returnLvl (Var v)
255 lvlExpr _ _ (_, AnnLit l) = returnLvl (Lit l)
256 lvlExpr _ _ (_, AnnCon con args) = returnLvl (Con con args)
257 lvlExpr _ _ (_, AnnPrim op args) = returnLvl (Prim op args)
259 lvlExpr ctxt_lvl envs@(venv, tenv) (_, AnnApp fun arg)
260 = lvlExpr ctxt_lvl envs fun `thenLvl` \ fun' ->
261 returnLvl (App fun' arg)
263 lvlExpr ctxt_lvl envs (_, AnnNote note expr)
264 = lvlExpr ctxt_lvl envs expr `thenLvl` \ expr' ->
265 returnLvl (Note note expr')
267 -- We don't split adjacent lambdas. That is, given
269 -- we don't float to give
270 -- \x -> let v = x+y in \y -> (v,y)
271 -- Why not? Because partial applications are fairly rare, and splitting
272 -- lambdas makes them more expensive.
274 lvlExpr ctxt_lvl envs@(venv, tenv) (_, AnnLam (ValBinder arg) rhs)
275 = lvlMFE incd_lvl (new_venv, tenv) body `thenLvl` \ body' ->
276 returnLvl (foldr (Lam . ValBinder) body' lvld_args)
278 incd_lvl = incMajorLvl ctxt_lvl
279 (args, body) = annCollectValBinders rhs
280 lvld_args = [(a,incd_lvl) | a <- (arg:args)]
281 new_venv = growIdEnvList venv lvld_args
283 -- We don't need to play such tricks for type lambdas, because
284 -- they don't get annotated
286 lvlExpr ctxt_lvl (venv, tenv) (_, AnnLam (TyBinder tyvar) body)
287 = lvlExpr incd_lvl (venv, new_tenv) body `thenLvl` \ body' ->
288 returnLvl (Lam (TyBinder tyvar) body')
290 incd_lvl = incMinorLvl ctxt_lvl
291 new_tenv = addToTyVarEnv tenv tyvar incd_lvl
293 lvlExpr ctxt_lvl envs (_, AnnLet bind body)
294 = lvlBind ctxt_lvl envs bind `thenLvl` \ (binds', new_envs) ->
295 lvlExpr ctxt_lvl new_envs body `thenLvl` \ body' ->
296 returnLvl (foldr Let body' binds') -- mkCoLet* requires Core...
298 lvlExpr ctxt_lvl envs@(venv, tenv) (_, AnnCase expr alts)
299 = lvlMFE ctxt_lvl envs expr `thenLvl` \ expr' ->
300 lvl_alts alts `thenLvl` \ alts' ->
301 returnLvl (Case expr' alts')
303 expr_type = coreExprType (deAnnotate expr)
304 incd_lvl = incMinorLvl ctxt_lvl
306 lvl_alts (AnnAlgAlts alts deflt)
307 = mapLvl lvl_alt alts `thenLvl` \ alts' ->
308 lvl_deflt deflt `thenLvl` \ deflt' ->
309 returnLvl (AlgAlts alts' deflt')
313 bs' = [ (b, incd_lvl) | b <- bs ]
314 new_envs = (growIdEnvList venv bs', tenv)
316 lvlMFE incd_lvl new_envs e `thenLvl` \ e' ->
317 returnLvl (con, bs', e')
319 lvl_alts (AnnPrimAlts alts deflt)
320 = mapLvl lvl_alt alts `thenLvl` \ alts' ->
321 lvl_deflt deflt `thenLvl` \ deflt' ->
322 returnLvl (PrimAlts alts' deflt')
325 = lvlMFE incd_lvl envs e `thenLvl` \ e' ->
328 lvl_deflt AnnNoDefault = returnLvl NoDefault
330 lvl_deflt (AnnBindDefault b expr)
332 new_envs = (addOneToIdEnv venv b incd_lvl, tenv)
334 lvlMFE incd_lvl new_envs expr `thenLvl` \ expr' ->
335 returnLvl (BindDefault (b, incd_lvl) expr')
338 @lvlMFE@ is just like @lvlExpr@, except that it might let-bind
339 the expression, so that it can itself be floated.
342 lvlMFE :: Level -- Level of innermost enclosing lambda/tylam
343 -> LevelEnvs -- Level of in-scope names/tyvars
344 -> CoreExprWithFVs -- input expression
345 -> LvlM LevelledExpr -- Result expression
347 lvlMFE ctxt_lvl envs@(venv,_) ann_expr
348 | isUnpointedType ty -- Can't let-bind it
349 = lvlExpr ctxt_lvl envs ann_expr
351 | otherwise -- Not primitive type so could be let-bound
352 = setFloatLevel Nothing {- Not already let-bound -}
353 ctxt_lvl envs ann_expr ty `thenLvl` \ (final_lvl, expr') ->
356 ty = coreExprType (deAnnotate ann_expr)
360 %************************************************************************
362 \subsection{Deciding floatability}
364 %************************************************************************
366 @setFloatLevel@ is used for let-bound right-hand-sides, or for MFEs which
367 are being created as let-bindings
371 YES. -> (a) try abstracting type variables.
372 If we abstract type variables it will go further, that is, past more
373 lambdas. same as asking if the level number given by the free
374 variables is less than the level number given by free variables
375 and type variables together.
376 Abstract offending type variables, e.g.
378 to let v = /\ty' -> f ty' a b
380 so that v' is not stopped by the level number of ty
381 tag the original let with its level number
382 (from its variables and type variables)
384 YES. -> No point in let binding to float a WHNF.
385 Pin (leave) expression here.
386 NO. -> Will float past a lambda?
387 (check using free variables only, not type variables)
388 YES. -> do the same as (a) above.
389 NO. -> No point in let binding if it is not going anywhere
390 Pin (leave) expression here.
393 setFloatLevel :: Maybe Id -- Just id <=> the expression is already let-bound to id
394 -- Nothing <=> it's a possible MFE
395 -> Level -- of context
398 -> CoreExprWithFVs -- Original rhs
399 -> Type -- Type of rhs
401 -> LvlM (Level, -- Level to attribute to this let-binding
402 LevelledExpr) -- Final rhs
404 setFloatLevel maybe_let_bound ctxt_lvl envs@(venv, tenv)
405 expr@(FVInfo fvs tfvs might_leak, _) ty
406 -- Invariant: ctxt_lvl is never = Top
407 -- Beautiful ASSERT, dudes (WDP 95/04)...
409 -- Now deal with (by not floating) trivial non-let-bound expressions
410 -- which just aren't worth let-binding in order to float. We always
411 -- choose to float even trivial let-bound things because it doesn't do
412 -- any harm, and not floating it may pin something important. For
419 -- Here, if we don't float v we won't float w, which is Bad News.
420 -- If this gives any problems we could restrict the idea to things destined
423 | not alreadyLetBound
424 && (manifestly_whnf || not will_float_past_lambda)
425 = -- Pin whnf non-let-bound expressions,
426 -- or ones which aren't going anywhere useful
427 lvlExpr ctxt_lvl envs expr `thenLvl` \ expr' ->
428 returnLvl (ctxt_lvl, expr')
430 | alreadyLetBound && not worth_type_abstraction
431 = -- Process the expression with a new ctxt_lvl, obtained from
432 -- the free vars of the expression itself
433 lvlExpr (unTopify expr_lvl) envs expr `thenLvl` \ expr' ->
434 returnLvl (maybe_unTopify expr_lvl, expr')
436 | otherwise -- This will create a let anyway, even if there is no
437 -- type variable to abstract, so we try to abstract anyway
438 = abstractWrtTyVars offending_tyvars ty envs lvl_after_ty_abstr expr
439 `thenLvl` \ final_expr ->
440 returnLvl (expr_lvl, final_expr)
441 -- OLD LIE: The body of the let, just a type application, isn't worth floating
442 -- so pin it with ctxt_lvl
443 -- The truth: better to give it expr_lvl in case it is pinning
444 -- something non-trivial which depends on it.
446 alreadyLetBound = maybeToBool maybe_let_bound
450 real_fvs = case maybe_let_bound of
451 Nothing -> fvs -- Just the expr fvs
452 Just id -> fvs `unionIdSets` mkIdSet (idSpecVars id)
453 -- Tiresome! Add the specVars
455 fv_list = idSetToList real_fvs
456 tv_list = tyVarSetToList tfvs
457 expr_lvl = ids_only_lvl `maxLvl` tyvars_only_lvl
458 ids_only_lvl = foldr (maxLvl . idLevel venv) tOP_LEVEL fv_list
459 tyvars_only_lvl = foldr (maxLvl . tyvarLevel tenv) tOP_LEVEL tv_list
460 lvl_after_ty_abstr = ids_only_lvl --`maxLvl` non_offending_tyvars_lvl
462 will_float_past_lambda = -- Will escape lambda if let-bound
463 ids_only_lvl `ltMajLvl` ctxt_lvl
465 worth_type_abstraction = -- Will escape (more) lambda(s)/type lambda(s)
466 -- if type abstracted
467 (ids_only_lvl `ltLvl` tyvars_only_lvl)
468 && not (is_trivial de_ann_expr) -- avoids abstracting trivial type applications
470 de_ann_expr = deAnnotate expr
473 | notValArg a = is_trivial e
474 is_trivial (Var _) = True
477 offending_tyvars = filter offending tv_list
478 --non_offending_tyvars = filter (not . offending) tv_list
479 --non_offending_tyvars_lvl = foldr (maxLvl . tyvarLevel tenv) tOP_LEVEL non_offending_tyvars
481 offending tyvar = ids_only_lvl `ltLvl` tyvarLevel tenv tyvar
483 manifestly_whnf = whnfOrBottom (mkFormSummary de_ann_expr)
485 maybe_unTopify Top | not (canFloatToTop (ty, expr)) = Level 0 0
486 maybe_unTopify lvl = lvl
487 {- ToDo [Andre]: the line above (maybe) should be Level 1 0,
488 -- so that the let will not go past the *last* lambda if it can
489 -- generate a space leak. If it is already in major level 0
490 -- It won't do any harm to give it a Level 1 0.
491 -- we should do the same test not only for things with level Top,
492 -- but also for anything that gets a major level 0.
494 f = \a -> let x = [1..1000]
497 f = let x = [1..1000]
499 is just as bad as floating x to the top level.
500 Notice it would be OK in cases like
501 f = \a -> let x = [1..1000]
505 f = let x = [1..1000]
508 as x will be gc'd after y is updated.
509 [We did not hit any problems with the above (Level 0 0) code
514 Abstract wrt tyvars, by making it just as if we had seen
519 instead of simply E. The idea is that v can be freely floated, since it
520 has no free type variables. Of course, if E has no free type
521 variables, then we just return E.
524 abstractWrtTyVars offending_tyvars ty (venv,tenv) lvl expr
525 = lvlExpr incd_lvl new_envs expr `thenLvl` \ expr' ->
526 newLvlVar poly_ty `thenLvl` \ poly_var ->
528 poly_var_rhs = mkTyLam offending_tyvars expr'
529 poly_var_binding = NonRec (poly_var, lvl) poly_var_rhs
530 poly_var_app = mkTyApp (Var poly_var) (mkTyVarTys offending_tyvars)
531 final_expr = Let poly_var_binding poly_var_app -- mkCoLet* requires Core
535 poly_ty = mkForAllTys offending_tyvars ty
537 -- These defns are just like those in the TyLam case of lvlExpr
538 (incd_lvl, tyvar_lvls) = mapAccumL next (unTopify lvl) offending_tyvars
540 next lvl tyvar = (lvl1, (tyvar,lvl1))
541 where lvl1 = incMinorLvl lvl
543 new_tenv = growTyVarEnvList tenv tyvar_lvls
544 new_envs = (venv, new_tenv)
547 Recursive definitions. We want to transform
559 x1' = /\ ab -> let D' in e1
561 xn' = /\ ab -> let D' in en
565 where ab are the tyvars pinning the defn further in than it
566 need be, and D is a bunch of simple type applications:
572 The "_cl" indicates that in D, the level numbers on the xi are the context level
573 number; type applications aren't worth floating. The D' decls are
580 but differ in their level numbers; here the ab are the newly-introduced
584 decideRecFloatLevel ctxt_lvl envs@(venv, tenv) ids rhss
585 | isTopMajLvl ids_only_lvl && -- Destination = top
586 not (all canFloatToTop (zipEqual "decideRec" tys rhss)) -- Some can't float to top
589 ids_w_lvls = ids `zip` repeat ctxt_lvl
590 new_envs = (growIdEnvList venv ids_w_lvls, tenv)
592 mapLvl (lvlExpr ctxt_lvl new_envs) rhss `thenLvl` \ rhss' ->
593 returnLvl (ctxt_lvl, [], rhss')
595 {- OMITTED; see comments above near isWorthFloatingExpr
597 | not (any (isWorthFloating True . deAnnotate) rhss)
599 mapLvl (lvlExpr ctxt_lvl envs) rhss `thenLvl` \ rhss' ->
600 returnLvl (ctxt_lvl, [], rhss')
604 | ids_only_lvl `ltLvl` tyvars_only_lvl
605 = -- Abstract wrt tyvars;
606 -- offending_tyvars is definitely non-empty
607 -- (I love the ASSERT to check this... WDP 95/02)
609 -- These defns are just like those in the TyLam case of lvlExpr
610 (incd_lvl, tyvar_lvls) = mapAccumL next (unTopify ids_only_lvl) offending_tyvars
612 next lvl tyvar = (lvl1, (tyvar,lvl1))
613 where lvl1 = incMinorLvl lvl
615 ids_w_incd_lvl = [(id,incd_lvl) | id <- ids]
616 new_tenv = growTyVarEnvList tenv tyvar_lvls
617 new_venv = growIdEnvList venv ids_w_incd_lvl
618 new_envs = (new_venv, new_tenv)
620 mapLvl (lvlExpr incd_lvl new_envs) rhss `thenLvl` \ rhss' ->
621 mapLvl newLvlVar poly_tys `thenLvl` \ poly_vars ->
623 ids_w_poly_vars = zipEqual "decideRec2" ids poly_vars
625 -- The "d_rhss" are the right-hand sides of "D" and "D'"
626 -- in the documentation above
627 d_rhss = [ mkTyApp (Var poly_var) offending_tyvar_tys | poly_var <- poly_vars]
629 -- "local_binds" are "D'" in the documentation above
630 local_binds = zipWithEqual "SetLevels" NonRec ids_w_incd_lvl d_rhss
632 poly_var_rhss = [ mkTyLam offending_tyvars (foldr Let rhs' local_binds)
633 | rhs' <- rhss' -- mkCoLet* requires Core...
636 poly_binds = zipEqual "poly_binds" [(poly_var, ids_only_lvl) | poly_var <- poly_vars]
640 returnLvl (ctxt_lvl, [Rec poly_binds], d_rhss)
641 -- The new right-hand sides, just a type application, aren't worth floating
642 -- so pin it with ctxt_lvl
645 = -- Let it float freely
647 ids_w_lvls = ids `zip` repeat expr_lvl
648 new_envs = (growIdEnvList venv ids_w_lvls, tenv)
650 mapLvl (lvlExpr (unTopify expr_lvl) new_envs) rhss `thenLvl` \ rhss' ->
651 returnLvl (expr_lvl, [], rhss')
656 fvs = (unionManyIdSets [freeVarsOf rhs | rhs <- rhss] `unionIdSets`
657 mkIdSet (concat (map idSpecVars ids)))
658 `minusIdSet` mkIdSet ids
660 tfvs = unionManyTyVarSets [freeTyVarsOf rhs | rhs <- rhss]
663 -- Why the "tyVarsOfTypes" part? Consider this:
664 -- /\a -> letrec x::a = x in E
665 -- Now, there are no explicit free type variables in the RHS of x,
666 -- but nevertheless "a" is free in its definition. So we add in
667 -- the free tyvars of the types of the binders.
668 -- This actually happened in the defn of errorIO in IOBase.lhs:
669 -- errorIO (ST io) = case (errorIO# io) of
672 -- bottom = bottom -- Never evaluated
673 -- I don't think this can every happen for non-recursive bindings.
675 fv_list = idSetToList fvs
676 tv_list = tyVarSetToList tfvs
678 ids_only_lvl = foldr (maxLvl . idLevel venv) tOP_LEVEL fv_list
679 tyvars_only_lvl = foldr (maxLvl . tyvarLevel tenv) tOP_LEVEL tv_list
680 expr_lvl = ids_only_lvl `maxLvl` tyvars_only_lvl
683 | ids_only_lvl `ltLvl` tyvars_only_lvl = filter offending tv_list
686 offending_tyvar_tys = mkTyVarTys offending_tyvars
687 poly_tys = map (mkForAllTys offending_tyvars) tys
689 offending tyvar = ids_only_lvl `ltLvl` tyvarLevel tenv tyvar
694 {- ******** OMITTED NOW
696 isWorthFloating :: Bool -- True <=> already let-bound
697 -> CoreExpr -- The expression
700 isWorthFloating alreadyLetBound expr
702 | alreadyLetBound = isWorthFloatingExpr expr
704 | otherwise = -- No point in adding a fresh let-binding for a WHNF, because
705 -- floating it isn't beneficial enough.
706 isWorthFloatingExpr expr &&
707 not (whnfOrBottom expr)
710 isWorthFloatingExpr :: CoreExpr -> Bool
712 isWorthFloatingExpr (Var v) = False
713 isWorthFloatingExpr (Lit lit) = False
714 isWorthFloatingExpr (App e arg)
715 | notValArg arg = isWorthFloatingExpr e
716 isWorthFloatingExpr (Con con as)
717 | all notValArg as = False -- Just a type application
718 isWorthFloatingExpr _ = True
720 canFloatToTop :: (Type, CoreExprWithFVs) -> Bool
722 canFloatToTop (ty, (FVInfo _ _ (LeakFree _), expr)) = True
723 canFloatToTop (ty, (FVInfo _ _ MightLeak, expr)) = isLeakFreeType [] ty
725 valSuggestsLeakFree expr = whnfOrBottom expr
730 %************************************************************************
732 \subsection{Help functions}
734 %************************************************************************
737 idLevel :: IdEnv Level -> Id -> Level
739 = case lookupIdEnv venv v of
743 tyvarLevel :: TyVarEnv Level -> TyVar -> Level
744 tyvarLevel tenv tyvar
745 = case lookupTyVarEnv tenv tyvar of
751 annCollectValBinders (_, (AnnLam (ValBinder arg) rhs))
754 (args, body) = annCollectValBinders rhs
756 annCollectValBinders body
760 %************************************************************************
762 \subsection{Free-To-Level Monad}
764 %************************************************************************
767 type LvlM result = UniqSM result
772 mapAndUnzipLvl = mapAndUnzipUs
773 mapAndUnzip3Lvl = mapAndUnzip3Us
776 We create a let-binding for `interesting' (non-utterly-trivial)
777 applications, to give them a fighting chance of being floated.
780 newLvlVar :: Type -> LvlM Id
783 = mkSysLocal SLIT("lvl") (getUnique us) ty noSrcLoc