2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
6 ***************************
8 ***************************
10 1. We attach binding levels to Core bindings, in preparation for floating
11 outwards (@FloatOut@).
13 2. We also let-ify many expressions (notably case scrutinees), so they
14 will have a fighting chance of being floated sensible.
16 3. We clone the binders of any floatable let-binding, so that when it is
17 floated out it will be unique. (This used to be done by the simplifier
18 but the latter now only ensures that there's no shadowing; indeed, even
19 that may not be true.)
21 NOTE: this can't be done using the uniqAway idea, because the variable
22 must be unique in the whole program, not just its current scope,
23 because two variables in different scopes may float out to the
26 NOTE: Very tiresomely, we must apply this substitution to
27 the rules stored inside a variable too.
29 We do *not* clone top-level bindings, because some of them must not change,
30 but we *do* clone bindings that are heading for the top level
33 case x of wild { p -> ...wild... }
34 we substitute x for wild in the RHS of the case alternatives:
35 case x of wild { p -> ...x... }
36 This means that a sub-expression involving x is not "trapped" inside the RHS.
37 And it's not inconvenient because we already have a substitution.
39 Note that this is EXACTLY BACKWARDS from the what the simplifier does.
40 The simplifier tries to get rid of occurrences of x, in favour of wild,
41 in the hope that there will only be one remaining occurrence of x, namely
42 the scrutinee of the case, and we can inline it.
49 LevelledBind, LevelledExpr,
51 incMinorLvl, ltMajLvl, ltLvl, isTopLvl
54 #include "HsVersions.h"
58 import DynFlags ( FloatOutSwitches(..) )
59 import CoreUtils ( exprType, mkPiTypes )
60 import CoreArity ( exprBotStrictness_maybe )
61 import CoreFVs -- all of it
62 import CoreSubst ( Subst, emptySubst, extendInScope, extendInScopeList,
63 extendIdSubst, cloneIdBndr, cloneRecIdBndrs )
64 import Id ( idType, mkLocalIdWithInfo, mkSysLocal, isOneShotLambda,
65 zapDemandIdInfo, transferPolyIdInfo,
66 idSpecialisation, idUnfolding, setIdInfo,
67 setIdStrictness, setIdArity
73 import Demand ( StrictSig, increaseStrictSigArity )
74 import Name ( getOccName, mkSystemVarName )
75 import OccName ( occNameString )
76 import Type ( isUnLiftedType, Type )
77 import BasicTypes ( TopLevelFlag(..), Arity )
79 import Util ( sortLe, isSingleton, count )
84 %************************************************************************
86 \subsection{Level numbers}
88 %************************************************************************
91 data Level = Level Int -- Level number of enclosing lambdas
92 Int -- Number of big-lambda and/or case expressions between
93 -- here and the nearest enclosing lambda
96 The {\em level number} on a (type-)lambda-bound variable is the
97 nesting depth of the (type-)lambda which binds it. The outermost lambda
98 has level 1, so (Level 0 0) means that the variable is bound outside any lambda.
100 On an expression, it's the maximum level number of its free
101 (type-)variables. On a let(rec)-bound variable, it's the level of its
102 RHS. On a case-bound variable, it's the number of enclosing lambdas.
104 Top-level variables: level~0. Those bound on the RHS of a top-level
105 definition but ``before'' a lambda; e.g., the \tr{x} in (levels shown
106 as ``subscripts'')...
108 a_0 = let b_? = ... in
109 x_1 = ... b ... in ...
112 The main function @lvlExpr@ carries a ``context level'' (@ctxt_lvl@).
113 That's meant to be the level number of the enclosing binder in the
114 final (floated) program. If the level number of a sub-expression is
115 less than that of the context, then it might be worth let-binding the
116 sub-expression so that it will indeed float.
118 If you can float to level @Level 0 0@ worth doing so because then your
119 allocation becomes static instead of dynamic. We always start with
123 Note [FloatOut inside INLINE]
124 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
125 @InlineCtxt@ very similar to @Level 0 0@, but is used for one purpose:
126 to say "don't float anything out of here". That's exactly what we
127 want for the body of an INLINE, where we don't want to float anything
128 out at all. See notes with lvlMFE below.
132 -- At one time I tried the effect of not float anything out of an InlineMe,
133 -- but it sometimes works badly. For example, consider PrelArr.done. It
134 -- has the form __inline (\d. e)
135 -- where e doesn't mention d. If we float this to
136 -- __inline (let x = e in \d. x)
137 -- things are bad. The inliner doesn't even inline it because it doesn't look
138 -- like a head-normal form. So it seems a lesser evil to let things float.
139 -- In SetLevels we do set the context to (Level 0 0) when we get to an InlineMe
140 -- which discourages floating out.
142 So the conclusion is: don't do any floating at all inside an InlineMe.
143 (In the above example, don't float the {x=e} out of the \d.)
145 One particular case is that of workers: we don't want to float the
146 call to the worker outside the wrapper, otherwise the worker might get
147 inlined into the floated expression, and an importing module won't see
151 type LevelledExpr = TaggedExpr Level
152 type LevelledBind = TaggedBind Level
155 tOP_LEVEL = Level 0 0
157 incMajorLvl :: Level -> Level
158 incMajorLvl (Level major _) = Level (major + 1) 0
160 incMinorLvl :: Level -> Level
161 incMinorLvl (Level major minor) = Level major (minor+1)
163 maxLvl :: Level -> Level -> Level
164 maxLvl l1@(Level maj1 min1) l2@(Level maj2 min2)
165 | (maj1 > maj2) || (maj1 == maj2 && min1 > min2) = l1
168 ltLvl :: Level -> Level -> Bool
169 ltLvl (Level maj1 min1) (Level maj2 min2)
170 = (maj1 < maj2) || (maj1 == maj2 && min1 < min2)
172 ltMajLvl :: Level -> Level -> Bool
173 -- Tells if one level belongs to a difft *lambda* level to another
174 ltMajLvl (Level maj1 _) (Level maj2 _) = maj1 < maj2
176 isTopLvl :: Level -> Bool
177 isTopLvl (Level 0 0) = True
180 instance Outputable Level where
181 ppr (Level maj min) = hcat [ char '<', int maj, char ',', int min, char '>' ]
183 instance Eq Level where
184 (Level maj1 min1) == (Level maj2 min2) = maj1 == maj2 && min1 == min2
188 %************************************************************************
190 \subsection{Main level-setting code}
192 %************************************************************************
195 setLevels :: FloatOutSwitches
200 setLevels float_lams binds us
201 = initLvl us (do_them init_env binds)
203 init_env = initialEnv float_lams
205 do_them :: LevelEnv -> [CoreBind] -> LvlM [LevelledBind]
206 do_them _ [] = return []
208 = do { (lvld_bind, env') <- lvlTopBind env b
209 ; lvld_binds <- do_them env' bs
210 ; return (lvld_bind : lvld_binds) }
212 lvlTopBind :: LevelEnv -> Bind Id -> LvlM (LevelledBind, LevelEnv)
213 lvlTopBind env (NonRec binder rhs)
214 = lvlBind TopLevel tOP_LEVEL env (AnnNonRec binder (freeVars rhs))
215 -- Rhs can have no free vars!
217 lvlTopBind env (Rec pairs)
218 = lvlBind TopLevel tOP_LEVEL env (AnnRec [(b,freeVars rhs) | (b,rhs) <- pairs])
221 %************************************************************************
223 \subsection{Setting expression levels}
225 %************************************************************************
228 lvlExpr :: Level -- ctxt_lvl: Level of enclosing expression
229 -> LevelEnv -- Level of in-scope names/tyvars
230 -> CoreExprWithFVs -- input expression
231 -> LvlM LevelledExpr -- Result expression
234 The @ctxt_lvl@ is, roughly, the level of the innermost enclosing
235 binder. Here's an example
237 v = \x -> ...\y -> let r = case (..x..) of
241 When looking at the rhs of @r@, @ctxt_lvl@ will be 1 because that's
242 the level of @r@, even though it's inside a level-2 @\y@. It's
243 important that @ctxt_lvl@ is 1 and not 2 in @r@'s rhs, because we
244 don't want @lvlExpr@ to turn the scrutinee of the @case@ into an MFE
245 --- because it isn't a *maximal* free expression.
247 If there were another lambda in @r@'s rhs, it would get level-2 as well.
250 lvlExpr _ _ ( _, AnnType ty) = return (Type ty)
251 lvlExpr _ env (_, AnnVar v) = return (lookupVar env v)
252 lvlExpr _ _ (_, AnnLit lit) = return (Lit lit)
254 lvlExpr ctxt_lvl env (_, AnnApp fun arg) = do
255 fun' <- lvlExpr ctxt_lvl env fun -- We don't do MFE on partial applications
256 arg' <- lvlMFE False ctxt_lvl env arg
257 return (App fun' arg')
259 lvlExpr ctxt_lvl env (_, AnnNote note expr) = do
260 expr' <- lvlExpr ctxt_lvl env expr
261 return (Note note expr')
263 lvlExpr ctxt_lvl env (_, AnnCast expr co) = do
264 expr' <- lvlExpr ctxt_lvl env expr
265 return (Cast expr' co)
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 env expr@(_, AnnLam {}) = do
275 new_body <- lvlMFE True new_lvl new_env body
276 return (mkLams new_bndrs new_body)
278 (bndrs, body) = collectAnnBndrs expr
279 (new_lvl, new_bndrs) = lvlLamBndrs ctxt_lvl bndrs
280 new_env = extendLvlEnv env new_bndrs
281 -- At one time we called a special verion of collectBinders,
282 -- which ignored coercions, because we don't want to split
283 -- a lambda like this (\x -> coerce t (\s -> ...))
284 -- This used to happen quite a bit in state-transformer programs,
285 -- but not nearly so much now non-recursive newtypes are transparent.
286 -- [See SetLevels rev 1.50 for a version with this approach.]
288 lvlExpr ctxt_lvl env (_, AnnLet (AnnNonRec bndr rhs) body)
289 | isUnLiftedType (idType bndr) = do
290 -- Treat unlifted let-bindings (let x = b in e) just like (case b of x -> e)
291 -- That is, leave it exactly where it is
292 -- We used to float unlifted bindings too (e.g. to get a cheap primop
293 -- outside a lambda (to see how, look at lvlBind in rev 1.58)
294 -- but an unrelated change meant that these unlifed bindings
295 -- could get to the top level which is bad. And there's not much point;
296 -- unlifted bindings are always cheap, and so hardly worth floating.
297 rhs' <- lvlExpr ctxt_lvl env rhs
298 body' <- lvlExpr incd_lvl env' body
299 return (Let (NonRec bndr' rhs') body')
301 incd_lvl = incMinorLvl ctxt_lvl
302 bndr' = TB bndr incd_lvl
303 env' = extendLvlEnv env [bndr']
305 lvlExpr ctxt_lvl env (_, AnnLet bind body) = do
306 (bind', new_env) <- lvlBind NotTopLevel ctxt_lvl env bind
307 body' <- lvlExpr ctxt_lvl new_env body
308 return (Let bind' body')
310 lvlExpr ctxt_lvl env (_, AnnCase expr case_bndr ty alts) = do
311 expr' <- lvlMFE True ctxt_lvl env expr
312 let alts_env = extendCaseBndrLvlEnv env expr' case_bndr incd_lvl
313 alts' <- mapM (lvl_alt alts_env) alts
314 return (Case expr' (TB case_bndr incd_lvl) ty alts')
316 incd_lvl = incMinorLvl ctxt_lvl
318 lvl_alt alts_env (con, bs, rhs) = do
319 rhs' <- lvlMFE True incd_lvl new_env rhs
320 return (con, bs', rhs')
322 bs' = [ TB b incd_lvl | b <- bs ]
323 new_env = extendLvlEnv alts_env bs'
326 @lvlMFE@ is just like @lvlExpr@, except that it might let-bind
327 the expression, so that it can itself be floated.
331 We don't float unlifted MFEs, which potentially loses big opportunites.
334 where h :: Int -> Int# is expensive. We'd like to float the (h y) outside
335 the \x, but we don't because it's unboxed. Possible solution: box it.
337 Note [Bottoming floats]
338 ~~~~~~~~~~~~~~~~~~~~~~~
340 f = \x. g (error "urk")
341 we'd like to float the call to error, to get
344 Furthermore, we want to float a bottoming expression even if it has free
346 f = \x. g (let v = h x in error ("urk" ++ v))
347 Then we'd like to abstact over 'x' can float the whole arg of g:
348 lvl = \x. let v = h x in error ("urk" ++ v)
350 See Maessen's paper 1999 "Bottom extraction: factoring error handling out
351 of functional programs" (unpublished I think).
353 When we do this, we set the strictness and arity of the new bottoming
354 Id, so that it's properly exposed as such in the interface file, even if
355 this is all happening after strictness analysis.
357 Note [Bottoming floats: eta expansion] c.f Note [Bottoming floats]
358 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
359 Tiresomely, though, the simplifier has an invariant that the manifest
360 arity of the RHS should be the same as the arity; but we can't call
361 etaExpand during SetLevels because it works over a decorated form of
362 CoreExpr. So we do the eta expansion later, in FloatOut.
366 We don't float a case expression as an MFE from a strict context. Why not?
367 Because in doing so we share a tiny bit of computation (the switch) but
368 in exchange we build a thunk, which is bad. This case reduces allocation
369 by 7% in spectral/puzzle (a rather strange benchmark) and 1.2% in real/fem.
370 Doesn't change any other allocation at all.
373 lvlMFE :: Bool -- True <=> strict context [body of case or let]
374 -> Level -- Level of innermost enclosing lambda/tylam
375 -> LevelEnv -- Level of in-scope names/tyvars
376 -> CoreExprWithFVs -- input expression
377 -> LvlM LevelledExpr -- Result expression
379 lvlMFE _ _ _ (_, AnnType ty)
382 -- No point in floating out an expression wrapped in a coercion or note
383 -- If we do we'll transform lvl = e |> co
384 -- to lvl' = e; lvl = lvl' |> co
385 -- and then inline lvl. Better just to float out the payload.
386 lvlMFE strict_ctxt ctxt_lvl env (_, AnnNote n e)
387 = do { e' <- lvlMFE strict_ctxt ctxt_lvl env e
388 ; return (Note n e') }
390 lvlMFE strict_ctxt ctxt_lvl env (_, AnnCast e co)
391 = do { e' <- lvlMFE strict_ctxt ctxt_lvl env e
392 ; return (Cast e' co) }
395 lvlMFE True ctxt_lvl env e@(_, AnnCase {})
396 = lvlExpr ctxt_lvl env e -- Don't share cases
398 lvlMFE strict_ctxt ctxt_lvl env ann_expr@(fvs, _)
399 | isUnLiftedType ty -- Can't let-bind it; see Note [Unlifted MFEs]
400 || notWorthFloating ann_expr abs_vars
401 || not good_destination
402 = -- Don't float it out
403 lvlExpr ctxt_lvl env ann_expr
405 | otherwise -- Float it out!
406 = do expr' <- lvlFloatRhs abs_vars dest_lvl env ann_expr
407 var <- newLvlVar abs_vars ty mb_bot
408 return (Let (NonRec (TB var dest_lvl) expr')
409 (mkVarApps (Var var) abs_vars))
411 expr = deAnnotate ann_expr
413 mb_bot = exprBotStrictness_maybe expr
414 dest_lvl = destLevel env fvs (isFunction ann_expr) mb_bot
415 abs_vars = abstractVars dest_lvl env fvs
417 -- A decision to float entails let-binding this thing, and we only do
418 -- that if we'll escape a value lambda, or will go to the top level.
420 | dest_lvl `ltMajLvl` ctxt_lvl -- Escapes a value lambda
422 -- OLD CODE: not (exprIsCheap expr) || isTopLvl dest_lvl
423 -- see Note [Escaping a value lambda]
425 | otherwise -- Does not escape a value lambda
426 = isTopLvl dest_lvl -- Only float if we are going to the top level
427 && floatConsts env -- and the floatConsts flag is on
428 && not strict_ctxt -- Don't float from a strict context
429 -- We are keen to float something to the top level, even if it does not
430 -- escape a lambda, because then it needs no allocation. But it's controlled
431 -- by a flag, because doing this too early loses opportunities for RULES
432 -- which (needless to say) are important in some nofib programs
433 -- (gcd is an example).
436 -- concat = /\ a -> foldr ..a.. (++) []
437 -- was getting turned into
438 -- concat = /\ a -> lvl a
439 -- lvl = /\ a -> foldr ..a.. (++) []
440 -- which is pretty stupid. Hence the strict_ctxt test
442 annotateBotStr :: Id -> Maybe (Arity, StrictSig) -> Id
443 annotateBotStr id Nothing = id
444 annotateBotStr id (Just (arity,sig)) = id `setIdArity` arity
445 `setIdStrictness` sig
447 notWorthFloating :: CoreExprWithFVs -> [Var] -> Bool
448 -- Returns True if the expression would be replaced by
449 -- something bigger than it is now. For example:
450 -- abs_vars = tvars only: return True if e is trivial,
451 -- but False for anything bigger
452 -- abs_vars = [x] (an Id): return True for trivial, or an application (f x)
453 -- but False for (f x x)
455 -- One big goal is that floating should be idempotent. Eg if
456 -- we replace e with (lvl79 x y) and then run FloatOut again, don't want
457 -- to replace (lvl79 x y) with (lvl83 x y)!
459 notWorthFloating e abs_vars
460 = go e (count isId abs_vars)
462 go (_, AnnVar {}) n = n == 0
463 go (_, AnnLit {}) n = n == 0
464 go (_, AnnCast e _) n = go e n
465 go (_, AnnApp e arg) n
466 | (_, AnnType {}) <- arg = go e n
468 | is_triv arg = go e (n-1)
472 is_triv (_, AnnLit {}) = True -- Treat all literals as trivial
473 is_triv (_, AnnVar {}) = True -- (ie not worth floating)
474 is_triv (_, AnnCast e _) = is_triv e
475 is_triv (_, AnnApp e (_, AnnType {})) = is_triv e
479 Note [Escaping a value lambda]
480 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
481 We want to float even cheap expressions out of value lambdas,
482 because that saves allocation. Consider
483 f = \x. .. (\y.e) ...
484 Then we'd like to avoid allocating the (\y.e) every time we call f,
485 (assuming e does not mention x).
487 An example where this really makes a difference is simplrun009.
489 Another reason it's good is because it makes SpecContr fire on functions.
491 f = \x. ....(f (\y.e))....
492 After floating we get
494 f = \x. ....(f lvl)...
495 and that is much easier for SpecConstr to generate a robust specialisation for.
497 The OLD CODE (given where this Note is referred to) prevents floating
498 of the example above, so I just don't understand the old code. I
499 don't understand the old comment either (which appears below). I
500 measured the effect on nofib of changing OLD CODE to 'True', and got
501 zeros everywhere, but a 4% win for 'puzzle'. Very small 0.5% loss for
502 'cse'; turns out to be because our arity analysis isn't good enough
503 yet (mentioned in Simon-nofib-notes).
506 Even if it escapes a value lambda, we only
507 float if it's not cheap (unless it'll get all the
508 way to the top). I've seen cases where we
509 float dozens of tiny free expressions, which cost
510 more to allocate than to evaluate.
511 NB: exprIsCheap is also true of bottom expressions, which
512 is good; we don't want to share them
514 It's only Really Bad to float a cheap expression out of a
515 strict context, because that builds a thunk that otherwise
516 would never be built. So another alternative would be to
518 || (strict_ctxt && not (exprIsBottom expr))
519 to the condition above. We should really try this out.
522 %************************************************************************
524 \subsection{Bindings}
526 %************************************************************************
528 The binding stuff works for top level too.
531 lvlBind :: TopLevelFlag -- Used solely to decide whether to clone
532 -> Level -- Context level; might be Top even for bindings nested in the RHS
533 -- of a top level binding
536 -> LvlM (LevelledBind, LevelEnv)
538 lvlBind top_lvl ctxt_lvl env (AnnNonRec bndr rhs@(rhs_fvs,_))
539 | isTyVar bndr -- Don't do anything for TyVar binders
540 -- (simplifier gets rid of them pronto)
541 = do rhs' <- lvlExpr ctxt_lvl env rhs
542 return (NonRec (TB bndr ctxt_lvl) rhs', env)
545 = do -- No type abstraction; clone existing binder
546 rhs' <- lvlExpr dest_lvl env rhs
547 (env', bndr') <- cloneVar top_lvl env bndr ctxt_lvl dest_lvl
548 return (NonRec (TB bndr' dest_lvl) rhs', env')
551 = do -- Yes, type abstraction; create a new binder, extend substitution, etc
552 rhs' <- lvlFloatRhs abs_vars dest_lvl env rhs
553 (env', [bndr']) <- newPolyBndrs dest_lvl env abs_vars [bndr_w_str]
554 return (NonRec (TB bndr' dest_lvl) rhs', env')
557 bind_fvs = rhs_fvs `unionVarSet` idFreeVars bndr
558 abs_vars = abstractVars dest_lvl env bind_fvs
559 dest_lvl = destLevel env bind_fvs (isFunction rhs) mb_bot
560 mb_bot = exprBotStrictness_maybe (deAnnotate rhs)
561 bndr_w_str = annotateBotStr bndr mb_bot
566 lvlBind top_lvl ctxt_lvl env (AnnRec pairs)
568 = do (new_env, new_bndrs) <- cloneRecVars top_lvl env bndrs ctxt_lvl dest_lvl
569 new_rhss <- mapM (lvlExpr ctxt_lvl new_env) rhss
570 return (Rec ([TB b dest_lvl | b <- new_bndrs] `zip` new_rhss), new_env)
572 | isSingleton pairs && count isId abs_vars > 1
573 = do -- Special case for self recursion where there are
574 -- several variables carried around: build a local loop:
575 -- poly_f = \abs_vars. \lam_vars . letrec f = \lam_vars. rhs in f lam_vars
576 -- This just makes the closures a bit smaller. If we don't do
577 -- this, allocation rises significantly on some programs
579 -- We could elaborate it for the case where there are several
580 -- mutually functions, but it's quite a bit more complicated
582 -- This all seems a bit ad hoc -- sigh
584 (bndr,rhs) = head pairs
585 (rhs_lvl, abs_vars_w_lvls) = lvlLamBndrs dest_lvl abs_vars
586 rhs_env = extendLvlEnv env abs_vars_w_lvls
587 (rhs_env', new_bndr) <- cloneVar NotTopLevel rhs_env bndr rhs_lvl rhs_lvl
589 (lam_bndrs, rhs_body) = collectAnnBndrs rhs
590 (body_lvl, new_lam_bndrs) = lvlLamBndrs rhs_lvl lam_bndrs
591 body_env = extendLvlEnv rhs_env' new_lam_bndrs
592 new_rhs_body <- lvlExpr body_lvl body_env rhs_body
593 (poly_env, [poly_bndr]) <- newPolyBndrs dest_lvl env abs_vars [bndr]
594 return (Rec [(TB poly_bndr dest_lvl,
595 mkLams abs_vars_w_lvls $
596 mkLams new_lam_bndrs $
597 Let (Rec [(TB new_bndr rhs_lvl, mkLams new_lam_bndrs new_rhs_body)])
598 (mkVarApps (Var new_bndr) lam_bndrs))],
601 | otherwise = do -- Non-null abs_vars
602 (new_env, new_bndrs) <- newPolyBndrs dest_lvl env abs_vars bndrs
603 new_rhss <- mapM (lvlFloatRhs abs_vars dest_lvl new_env) rhss
604 return (Rec ([TB b dest_lvl | b <- new_bndrs] `zip` new_rhss), new_env)
607 (bndrs,rhss) = unzip pairs
609 -- Finding the free vars of the binding group is annoying
610 bind_fvs = (unionVarSets [ idFreeVars bndr `unionVarSet` rhs_fvs
611 | (bndr, (rhs_fvs,_)) <- pairs])
615 dest_lvl = destLevel env bind_fvs (all isFunction rhss) Nothing
616 abs_vars = abstractVars dest_lvl env bind_fvs
618 ----------------------------------------------------
619 -- Three help functons for the type-abstraction case
621 lvlFloatRhs :: [CoreBndr] -> Level -> LevelEnv -> CoreExprWithFVs
622 -> UniqSM (Expr (TaggedBndr Level))
623 lvlFloatRhs abs_vars dest_lvl env rhs = do
624 rhs' <- lvlExpr rhs_lvl rhs_env rhs
625 return (mkLams abs_vars_w_lvls rhs')
627 (rhs_lvl, abs_vars_w_lvls) = lvlLamBndrs dest_lvl abs_vars
628 rhs_env = extendLvlEnv env abs_vars_w_lvls
632 %************************************************************************
634 \subsection{Deciding floatability}
636 %************************************************************************
639 lvlLamBndrs :: Level -> [CoreBndr] -> (Level, [TaggedBndr Level])
640 -- Compute the levels for the binders of a lambda group
641 -- The binders returned are exactly the same as the ones passed,
642 -- but they are now paired with a level
646 lvlLamBndrs lvl bndrs
647 = go (incMinorLvl lvl)
648 False -- Havn't bumped major level in this group
651 go old_lvl bumped_major rev_lvld_bndrs (bndr:bndrs)
652 | isId bndr && -- Go to the next major level if this is a value binder,
653 not bumped_major && -- and we havn't already gone to the next level (one jump per group)
654 not (isOneShotLambda bndr) -- and it isn't a one-shot lambda
655 = go new_lvl True (TB bndr new_lvl : rev_lvld_bndrs) bndrs
658 = go old_lvl bumped_major (TB bndr old_lvl : rev_lvld_bndrs) bndrs
661 new_lvl = incMajorLvl old_lvl
663 go old_lvl _ rev_lvld_bndrs []
664 = (old_lvl, reverse rev_lvld_bndrs)
665 -- a lambda like this (\x -> coerce t (\s -> ...))
666 -- This happens quite a bit in state-transformer programs
670 -- Destintion level is the max Id level of the expression
671 -- (We'll abstract the type variables, if any.)
672 destLevel :: LevelEnv -> VarSet -> Bool -> Maybe (Arity, StrictSig) -> Level
673 destLevel env fvs is_function mb_bot
674 | Just {} <- mb_bot = tOP_LEVEL -- Send bottoming bindings to the top
675 -- regardless; see Note [Bottoming floats]
677 && is_function = tOP_LEVEL -- Send functions to top level; see
678 -- the comments with isFunction
679 | otherwise = maxIdLevel env fvs
681 isFunction :: CoreExprWithFVs -> Bool
682 -- The idea here is that we want to float *functions* to
683 -- the top level. This saves no work, but
684 -- (a) it can make the host function body a lot smaller,
685 -- and hence inlinable.
686 -- (b) it can also save allocation when the function is recursive:
687 -- h = \x -> letrec f = \y -> ...f...y...x...
690 -- f = \x y -> ...(f x)...y...x...
692 -- No allocation for f now.
693 -- We may only want to do this if there are sufficiently few free
694 -- variables. We certainly only want to do it for values, and not for
695 -- constructors. So the simple thing is just to look for lambdas
696 isFunction (_, AnnLam b e) | isId b = True
697 | otherwise = isFunction e
698 isFunction (_, AnnNote _ e) = isFunction e
703 %************************************************************************
705 \subsection{Free-To-Level Monad}
707 %************************************************************************
710 type LevelEnv = (FloatOutSwitches,
711 VarEnv Level, -- Domain is *post-cloned* TyVars and Ids
712 Subst, -- Domain is pre-cloned Ids; tracks the in-scope set
713 -- so that subtitution is capture-avoiding
714 IdEnv ([Var], LevelledExpr)) -- Domain is pre-cloned Ids
715 -- We clone let-bound variables so that they are still
716 -- distinct when floated out; hence the SubstEnv/IdEnv.
717 -- (see point 3 of the module overview comment).
718 -- We also use these envs when making a variable polymorphic
719 -- because we want to float it out past a big lambda.
721 -- The Subst and IdEnv always implement the same mapping, but the
722 -- Subst maps to CoreExpr and the IdEnv to LevelledExpr
723 -- Since the range is always a variable or type application,
724 -- there is never any difference between the two, but sadly
725 -- the types differ. The SubstEnv is used when substituting in
726 -- a variable's IdInfo; the IdEnv when we find a Var.
728 -- In addition the IdEnv records a list of tyvars free in the
729 -- type application, just so we don't have to call freeVars on
730 -- the type application repeatedly.
732 -- The domain of the both envs is *pre-cloned* Ids, though
734 -- The domain of the VarEnv Level is the *post-cloned* Ids
736 initialEnv :: FloatOutSwitches -> LevelEnv
737 initialEnv float_lams = (float_lams, emptyVarEnv, emptySubst, emptyVarEnv)
739 floatLams :: LevelEnv -> Bool
740 floatLams (fos, _, _, _) = floatOutLambdas fos
742 floatConsts :: LevelEnv -> Bool
743 floatConsts (fos, _, _, _) = floatOutConstants fos
745 extendLvlEnv :: LevelEnv -> [TaggedBndr Level] -> LevelEnv
746 -- Used when *not* cloning
747 extendLvlEnv (float_lams, lvl_env, subst, id_env) prs
749 foldl add_lvl lvl_env prs,
750 foldl del_subst subst prs,
751 foldl del_id id_env prs)
753 add_lvl env (TB v l) = extendVarEnv env v l
754 del_subst env (TB v _) = extendInScope env v
755 del_id env (TB v _) = delVarEnv env v
756 -- We must remove any clone for this variable name in case of
757 -- shadowing. This bit me in the following case
758 -- (in nofib/real/gg/Spark.hs):
761 -- ... -> case e of wild {
762 -- ... -> ... wild ...
766 -- The inside occurrence of @wild@ was being replaced with @ds@,
767 -- incorrectly, because the SubstEnv was still lying around. Ouch!
770 extendInScopeEnv :: LevelEnv -> Var -> LevelEnv
771 extendInScopeEnv (fl, le, subst, ids) v = (fl, le, extendInScope subst v, ids)
773 extendInScopeEnvList :: LevelEnv -> [Var] -> LevelEnv
774 extendInScopeEnvList (fl, le, subst, ids) vs = (fl, le, extendInScopeList subst vs, ids)
776 -- extendCaseBndrLvlEnv adds the mapping case-bndr->scrut-var if it can
777 -- (see point 4 of the module overview comment)
778 extendCaseBndrLvlEnv :: LevelEnv -> Expr (TaggedBndr Level) -> Var -> Level
780 extendCaseBndrLvlEnv (float_lams, lvl_env, subst, id_env) (Var scrut_var) case_bndr lvl
782 extendVarEnv lvl_env case_bndr lvl,
783 extendIdSubst subst case_bndr (Var scrut_var),
784 extendVarEnv id_env case_bndr ([scrut_var], Var scrut_var))
786 extendCaseBndrLvlEnv env _scrut case_bndr lvl
787 = extendLvlEnv env [TB case_bndr lvl]
789 extendPolyLvlEnv :: Level -> LevelEnv -> [Var] -> [(Var, Var)] -> LevelEnv
790 extendPolyLvlEnv dest_lvl (float_lams, lvl_env, subst, id_env) abs_vars bndr_pairs
792 foldl add_lvl lvl_env bndr_pairs,
793 foldl add_subst subst bndr_pairs,
794 foldl add_id id_env bndr_pairs)
796 add_lvl env (_, v') = extendVarEnv env v' dest_lvl
797 add_subst env (v, v') = extendIdSubst env v (mkVarApps (Var v') abs_vars)
798 add_id env (v, v') = extendVarEnv env v ((v':abs_vars), mkVarApps (Var v') abs_vars)
800 extendCloneLvlEnv :: Level -> LevelEnv -> Subst -> [(Var, Var)] -> LevelEnv
801 extendCloneLvlEnv lvl (float_lams, lvl_env, _, id_env) new_subst bndr_pairs
803 foldl add_lvl lvl_env bndr_pairs,
805 foldl add_id id_env bndr_pairs)
807 add_lvl env (_, v') = extendVarEnv env v' lvl
808 add_id env (v, v') = extendVarEnv env v ([v'], Var v')
811 maxIdLevel :: LevelEnv -> VarSet -> Level
812 maxIdLevel (_, lvl_env,_,id_env) var_set
813 = foldVarSet max_in tOP_LEVEL var_set
815 max_in in_var lvl = foldr max_out lvl (case lookupVarEnv id_env in_var of
816 Just (abs_vars, _) -> abs_vars
820 | isId out_var = case lookupVarEnv lvl_env out_var of
821 Just lvl' -> maxLvl lvl' lvl
823 | otherwise = lvl -- Ignore tyvars in *maxIdLevel*
825 lookupVar :: LevelEnv -> Id -> LevelledExpr
826 lookupVar (_, _, _, id_env) v = case lookupVarEnv id_env v of
827 Just (_, expr) -> expr
830 abstractVars :: Level -> LevelEnv -> VarSet -> [Var]
831 -- Find the variables in fvs, free vars of the target expresion,
832 -- whose level is greater than the destination level
833 -- These are the ones we are going to abstract out
834 abstractVars dest_lvl (_, lvl_env, _, id_env) fvs
835 = map zap $ uniq $ sortLe le
836 [var | fv <- varSetElems fvs
837 , var <- absVarsOf id_env fv
839 -- NB: it's important to call abstract_me only on the OutIds the
840 -- come from absVarsOf (not on fv, which is an InId)
842 -- Sort the variables so the true type variables come first;
843 -- the tyvars scope over Ids and coercion vars
844 v1 `le` v2 = case (is_tv v1, is_tv v2) of
845 (True, False) -> True
846 (False, True) -> False
847 _ -> v1 <= v2 -- Same family
849 is_tv v = isTyVar v && not (isCoVar v)
851 uniq :: [Var] -> [Var]
852 -- Remove adjacent duplicates; the sort will have brought them together
853 uniq (v1:v2:vs) | v1 == v2 = uniq (v2:vs)
854 | otherwise = v1 : uniq (v2:vs)
857 abstract_me v = case lookupVarEnv lvl_env v of
858 Just lvl -> dest_lvl `ltLvl` lvl
861 -- We are going to lambda-abstract, so nuke any IdInfo,
862 -- and add the tyvars of the Id (if necessary)
863 zap v | isId v = WARN( isInlineRule (idUnfolding v) ||
864 not (isEmptySpecInfo (idSpecialisation v)),
865 text "absVarsOf: discarding info on" <+> ppr v )
866 setIdInfo v vanillaIdInfo
869 absVarsOf :: IdEnv ([Var], LevelledExpr) -> Var -> [Var]
870 -- If f is free in the expression, and f maps to poly_f a b c in the
871 -- current substitution, then we must report a b c as candidate type
874 -- Also, if x::a is an abstracted variable, then so is a; that is,
875 -- we must look in x's type
876 -- And similarly if x is a coercion variable.
878 | isId v = [av2 | av1 <- lookup_avs v
879 , av2 <- add_tyvars av1]
880 | isCoVar v = add_tyvars v
884 lookup_avs v = case lookupVarEnv id_env v of
885 Just (abs_vars, _) -> abs_vars
888 add_tyvars v = v : varSetElems (varTypeTyVars v)
892 type LvlM result = UniqSM result
894 initLvl :: UniqSupply -> UniqSM a -> a
900 newPolyBndrs :: Level -> LevelEnv -> [Var] -> [Id] -> UniqSM (LevelEnv, [Id])
901 newPolyBndrs dest_lvl env abs_vars bndrs = do
903 let new_bndrs = zipWith mk_poly_bndr bndrs uniqs
904 return (extendPolyLvlEnv dest_lvl env abs_vars (bndrs `zip` new_bndrs), new_bndrs)
906 mk_poly_bndr bndr uniq = transferPolyIdInfo bndr abs_vars $ -- Note [transferPolyIdInfo] in Id.lhs
907 mkSysLocal (mkFastString str) uniq poly_ty
909 str = "poly_" ++ occNameString (getOccName bndr)
910 poly_ty = mkPiTypes abs_vars (idType bndr)
912 newLvlVar :: [CoreBndr] -> Type -- Abstract wrt these bndrs
913 -> Maybe (Arity, StrictSig) -- Note [Bottoming floats]
915 newLvlVar vars body_ty mb_bot
916 = do { uniq <- getUniqueM
917 ; return (mkLocalIdWithInfo (mk_name uniq) (mkPiTypes vars body_ty) info) }
919 mk_name uniq = mkSystemVarName uniq (mkFastString "lvl")
920 arity = count isId vars
921 info = case mb_bot of
922 Nothing -> vanillaIdInfo
923 Just (bot_arity, sig) -> vanillaIdInfo
924 `setArityInfo` (arity + bot_arity)
925 `setStrictnessInfo` Just (increaseStrictSigArity arity sig)
927 -- The deeply tiresome thing is that we have to apply the substitution
928 -- to the rules inside each Id. Grr. But it matters.
930 cloneVar :: TopLevelFlag -> LevelEnv -> Id -> Level -> Level -> LvlM (LevelEnv, Id)
931 cloneVar TopLevel env v _ _
932 = return (extendInScopeEnv env v, v) -- Don't clone top level things
933 -- But do extend the in-scope env, to satisfy the in-scope invariant
935 cloneVar NotTopLevel env@(_,_,subst,_) v ctxt_lvl dest_lvl
936 = ASSERT( isId v ) do
937 us <- getUniqueSupplyM
939 (subst', v1) = cloneIdBndr subst us v
940 v2 = zap_demand ctxt_lvl dest_lvl v1
941 env' = extendCloneLvlEnv dest_lvl env subst' [(v,v2)]
944 cloneRecVars :: TopLevelFlag -> LevelEnv -> [Id] -> Level -> Level -> LvlM (LevelEnv, [Id])
945 cloneRecVars TopLevel env vs _ _
946 = return (extendInScopeEnvList env vs, vs) -- Don't clone top level things
947 cloneRecVars NotTopLevel env@(_,_,subst,_) vs ctxt_lvl dest_lvl
948 = ASSERT( all isId vs ) do
949 us <- getUniqueSupplyM
951 (subst', vs1) = cloneRecIdBndrs subst us vs
952 vs2 = map (zap_demand ctxt_lvl dest_lvl) vs1
953 env' = extendCloneLvlEnv dest_lvl env subst' (vs `zip` vs2)
956 -- VERY IMPORTANT: we must zap the demand info
957 -- if the thing is going to float out past a lambda,
958 -- or if it's going to top level (where things can't be strict)
959 zap_demand :: Level -> Level -> Id -> Id
960 zap_demand dest_lvl ctxt_lvl id
961 | ctxt_lvl == dest_lvl,
962 not (isTopLvl dest_lvl) = id -- Stays, and not going to top level
963 | otherwise = zapDemandIdInfo id -- Floats out