2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
6 ***************************
8 ***************************
10 * We attach binding levels to Core bindings, in preparation for floating
11 outwards (@FloatOut@).
13 * We also let-ify many expressions (notably case scrutinees), so they
14 will have a fighting chance of being floated sensible.
16 * 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.)
19 NOTE: Very tiresomely, we must apply this substitution to
20 the rules stored inside a variable too.
22 We do *not* clone top-level bindings, because some of them must not change,
23 but we *do* clone bindings that are heading for the top level
26 case x of wild { p -> ...wild... }
27 we substitute x for wild in the RHS of the case alternatives:
28 case x of wild { p -> ...x... }
29 This means that a sub-expression involving x is not "trapped" inside the RHS.
30 And it's not inconvenient because we already have a substitution.
38 incMinorLvl, ltMajLvl, ltLvl, isTopLvl
41 #include "HsVersions.h"
45 import CoreUtils ( exprType, exprIsTrivial, exprIsBottom )
46 import CoreFVs -- all of it
47 import Id ( Id, idType, idFreeTyVars, mkSysLocal, isOneShotLambda, modifyIdInfo,
48 idSpecialisation, idWorkerInfo, setIdInfo
50 import IdInfo ( workerExists, vanillaIdInfo, demandInfo, setDemandInfo )
51 import Var ( Var, TyVar, setVarUnique )
55 import Name ( getOccName )
56 import OccName ( occNameUserString )
57 import Type ( isUnLiftedType, mkPiType, Type )
58 import BasicTypes ( TopLevelFlag(..) )
59 import Demand ( isStrict, wwLazy )
63 import Util ( sortLt, isSingleton, count )
67 %************************************************************************
69 \subsection{Level numbers}
71 %************************************************************************
74 data Level = Level Int -- Level number of enclosing lambdas
75 Int -- Number of big-lambda and/or case expressions between
76 -- here and the nearest enclosing lambda
79 The {\em level number} on a (type-)lambda-bound variable is the
80 nesting depth of the (type-)lambda which binds it. The outermost lambda
81 has level 1, so (Level 0 0) means that the variable is bound outside any lambda.
83 On an expression, it's the maximum level number of its free
84 (type-)variables. On a let(rec)-bound variable, it's the level of its
85 RHS. On a case-bound variable, it's the number of enclosing lambdas.
87 Top-level variables: level~0. Those bound on the RHS of a top-level
88 definition but ``before'' a lambda; e.g., the \tr{x} in (levels shown
91 a_0 = let b_? = ... in
92 x_1 = ... b ... in ...
95 The main function @lvlExpr@ carries a ``context level'' (@ctxt_lvl@).
96 That's meant to be the level number of the enclosing binder in the
97 final (floated) program. If the level number of a sub-expression is
98 less than that of the context, then it might be worth let-binding the
99 sub-expression so that it will indeed float. This context level starts
103 type LevelledExpr = TaggedExpr Level
104 type LevelledArg = TaggedArg Level
105 type LevelledBind = TaggedBind Level
107 tOP_LEVEL = Level 0 0
109 incMajorLvl :: Level -> Level
110 incMajorLvl (Level major minor) = Level (major+1) 0
112 incMinorLvl :: Level -> Level
113 incMinorLvl (Level major minor) = Level major (minor+1)
115 maxLvl :: Level -> Level -> Level
116 maxLvl l1@(Level maj1 min1) l2@(Level maj2 min2)
117 | (maj1 > maj2) || (maj1 == maj2 && min1 > min2) = l1
120 ltLvl :: Level -> Level -> Bool
121 ltLvl (Level maj1 min1) (Level maj2 min2)
122 = (maj1 < maj2) || (maj1 == maj2 && min1 < min2)
124 ltMajLvl :: Level -> Level -> Bool
125 -- Tells if one level belongs to a difft *lambda* level to another
126 -- But it returns True regardless if l1 is the top level
127 -- We always like to float to the top!
128 ltMajLvl (Level 0 0) _ = True
129 ltMajLvl (Level maj1 _) (Level maj2 _) = maj1 < maj2
131 isTopLvl :: Level -> Bool
132 isTopLvl (Level 0 0) = True
133 isTopLvl other = False
135 instance Outputable Level where
136 ppr (Level maj min) = hcat [ char '<', int maj, char ',', int min, char '>' ]
139 %************************************************************************
141 \subsection{Main level-setting code}
143 %************************************************************************
146 setLevels :: Bool -- True <=> float lambdas to top level
151 setLevels float_lams binds us
152 = initLvl us (do_them binds)
154 -- "do_them"'s main business is to thread the monad along
155 -- It gives each top binding the same empty envt, because
156 -- things unbound in the envt have level number zero implicitly
157 do_them :: [CoreBind] -> LvlM [LevelledBind]
159 do_them [] = returnLvl []
161 = lvlTopBind init_env b `thenLvl` \ (lvld_bind, _) ->
162 do_them bs `thenLvl` \ lvld_binds ->
163 returnLvl (lvld_bind : lvld_binds)
165 init_env = initialEnv float_lams
167 lvlTopBind env (NonRec binder rhs)
168 = lvlBind TopLevel tOP_LEVEL env (AnnNonRec binder (freeVars rhs))
169 -- Rhs can have no free vars!
171 lvlTopBind env (Rec pairs)
172 = lvlBind TopLevel tOP_LEVEL env (AnnRec [(b,freeVars rhs) | (b,rhs) <- pairs])
175 %************************************************************************
177 \subsection{Setting expression levels}
179 %************************************************************************
182 lvlExpr :: Level -- ctxt_lvl: Level of enclosing expression
183 -> LevelEnv -- Level of in-scope names/tyvars
184 -> CoreExprWithFVs -- input expression
185 -> LvlM LevelledExpr -- Result expression
188 The @ctxt_lvl@ is, roughly, the level of the innermost enclosing
189 binder. Here's an example
191 v = \x -> ...\y -> let r = case (..x..) of
195 When looking at the rhs of @r@, @ctxt_lvl@ will be 1 because that's
196 the level of @r@, even though it's inside a level-2 @\y@. It's
197 important that @ctxt_lvl@ is 1 and not 2 in @r@'s rhs, because we
198 don't want @lvlExpr@ to turn the scrutinee of the @case@ into an MFE
199 --- because it isn't a *maximal* free expression.
201 If there were another lambda in @r@'s rhs, it would get level-2 as well.
204 lvlExpr _ _ (_, AnnType ty) = returnLvl (Type ty)
205 lvlExpr _ env (_, AnnVar v) = returnLvl (lookupVar env v)
206 lvlExpr _ env (_, AnnLit lit) = returnLvl (Lit lit)
208 lvlExpr ctxt_lvl env (_, AnnApp fun arg)
209 = lvl_fun fun `thenLvl` \ fun' ->
210 lvlMFE False ctxt_lvl env arg `thenLvl` \ arg' ->
211 returnLvl (App fun' arg')
213 lvl_fun (_, AnnCase _ _ _) = lvlMFE True ctxt_lvl env fun
214 lvl_fun other = lvlExpr ctxt_lvl env fun
215 -- We don't do MFE on partial applications generally,
216 -- but we do if the function is big and hairy, like a case
218 lvlExpr ctxt_lvl env (_, AnnNote InlineMe expr)
219 -- Don't float anything out of an InlineMe
220 = lvlExpr tOP_LEVEL env expr `thenLvl` \ expr' ->
221 returnLvl (Note InlineMe expr')
223 lvlExpr ctxt_lvl env (_, AnnNote note expr)
224 = lvlExpr ctxt_lvl env expr `thenLvl` \ expr' ->
225 returnLvl (Note note expr')
227 -- We don't split adjacent lambdas. That is, given
229 -- we don't float to give
230 -- \x -> let v = x+y in \y -> (v,y)
231 -- Why not? Because partial applications are fairly rare, and splitting
232 -- lambdas makes them more expensive.
234 lvlExpr ctxt_lvl env expr@(_, AnnLam bndr rhs)
235 = lvlMFE True new_lvl new_env body `thenLvl` \ new_body ->
236 returnLvl (glue_binders new_bndrs expr new_body)
238 (bndrs, body) = collect_binders expr
239 (new_lvl, new_bndrs) = lvlLamBndrs ctxt_lvl bndrs
240 new_env = extendLvlEnv env new_bndrs
242 lvlExpr ctxt_lvl env (_, AnnLet bind body)
243 = lvlBind NotTopLevel ctxt_lvl env bind `thenLvl` \ (bind', new_env) ->
244 lvlExpr ctxt_lvl new_env body `thenLvl` \ body' ->
245 returnLvl (Let bind' body')
247 lvlExpr ctxt_lvl env (_, AnnCase expr case_bndr alts)
248 = lvlMFE True ctxt_lvl env expr `thenLvl` \ expr' ->
250 alts_env = extendCaseBndrLvlEnv env expr' case_bndr incd_lvl
252 mapLvl (lvl_alt alts_env) alts `thenLvl` \ alts' ->
253 returnLvl (Case expr' (case_bndr, incd_lvl) alts')
255 expr_type = exprType (deAnnotate expr)
256 incd_lvl = incMinorLvl ctxt_lvl
258 lvl_alt alts_env (con, bs, rhs)
259 = lvlMFE True incd_lvl new_env rhs `thenLvl` \ rhs' ->
260 returnLvl (con, bs', rhs')
262 bs' = [ (b, incd_lvl) | b <- bs ]
263 new_env = extendLvlEnv alts_env bs'
268 go rev_bndrs (_, AnnLam b e) = go (b:rev_bndrs) e
269 go rev_bndrs (_, AnnNote n e) = go rev_bndrs e
270 go rev_bndrs rhs = (reverse rev_bndrs, rhs)
271 -- Ignore notes, because we don't want to split
272 -- a lambda like this (\x -> coerce t (\s -> ...))
273 -- This happens quite a bit in state-transformer programs
275 -- glue_binders puts the lambda back together
276 glue_binders (b:bs) (_, AnnLam _ e) body = Lam b (glue_binders bs e body)
277 glue_binders bs (_, AnnNote n e) body = Note n (glue_binders bs e body)
278 glue_binders [] e body = body
281 @lvlMFE@ is just like @lvlExpr@, except that it might let-bind
282 the expression, so that it can itself be floated.
285 lvlMFE :: Bool -- True <=> strict context [body of case or let]
286 -> Level -- Level of innermost enclosing lambda/tylam
287 -> LevelEnv -- Level of in-scope names/tyvars
288 -> CoreExprWithFVs -- input expression
289 -> LvlM LevelledExpr -- Result expression
291 lvlMFE strict_ctxt ctxt_lvl env (_, AnnType ty)
292 = returnLvl (Type ty)
294 lvlMFE strict_ctxt ctxt_lvl env ann_expr@(fvs, _)
295 | isUnLiftedType ty -- Can't let-bind it
296 || not good_destination
297 || exprIsTrivial expr -- Is trivial
298 || (strict_ctxt && exprIsBottom expr) -- Strict context and is bottom
299 = -- Don't float it out
300 lvlExpr ctxt_lvl env ann_expr
302 | otherwise -- Float it out!
303 = lvlFloatRhs abs_vars dest_lvl env ann_expr `thenLvl` \ expr' ->
304 newLvlVar "lvl" abs_vars ty `thenLvl` \ var ->
305 returnLvl (Let (NonRec (var,dest_lvl) expr')
306 (mkVarApps (Var var) abs_vars))
308 expr = deAnnotate ann_expr
310 dest_lvl = destLevel env fvs (isFunction ann_expr)
311 abs_vars = abstractVars dest_lvl env fvs
313 good_destination = dest_lvl `ltMajLvl` ctxt_lvl -- Escapes a value lambda
314 || (isTopLvl dest_lvl && not strict_ctxt) -- Goes to the top
315 -- A decision to float entails let-binding this thing, and we only do
316 -- that if we'll escape a value lambda, or will go to the top level.
318 -- concat = /\ a -> foldr ..a.. (++) []
319 -- was getting turned into
320 -- concat = /\ a -> lvl a
321 -- lvl = /\ a -> foldr ..a.. (++) []
322 -- which is pretty stupid. Hence the strict_ctxt test
326 %************************************************************************
328 \subsection{Bindings}
330 %************************************************************************
332 The binding stuff works for top level too.
335 lvlBind :: TopLevelFlag -- Used solely to decide whether to clone
336 -> Level -- Context level; might be Top even for bindings nested in the RHS
337 -- of a top level binding
340 -> LvlM (LevelledBind, LevelEnv)
342 lvlBind top_lvl ctxt_lvl env (AnnNonRec bndr rhs@(rhs_fvs,_))
344 = -- No type abstraction; clone existing binder
345 lvlExpr ctxt_lvl env rhs `thenLvl` \ rhs' ->
346 cloneVar top_lvl env bndr ctxt_lvl dest_lvl `thenLvl` \ (env', bndr') ->
347 returnLvl (NonRec (bndr', dest_lvl) rhs', env')
350 = -- Yes, type abstraction; create a new binder, extend substitution, etc
351 lvlFloatRhs abs_vars dest_lvl env rhs `thenLvl` \ rhs' ->
352 newPolyBndrs dest_lvl env abs_vars [bndr] `thenLvl` \ (env', [bndr']) ->
353 returnLvl (NonRec (bndr', dest_lvl) rhs', env')
356 bind_fvs = rhs_fvs `unionVarSet` idFreeVars bndr
357 abs_vars = abstractVars dest_lvl env bind_fvs
359 dest_lvl | isUnLiftedType (idType bndr) = destLevel env bind_fvs False `maxLvl` Level 1 0
360 | otherwise = destLevel env bind_fvs (isFunction rhs)
361 -- Hack alert! We do have some unlifted bindings, for cheap primops, and
362 -- it is ok to float them out; but not to the top level. If they would otherwise
363 -- go to the top level, we pin them inside the topmost lambda
368 lvlBind top_lvl ctxt_lvl env (AnnRec pairs)
370 = cloneVars top_lvl env bndrs ctxt_lvl dest_lvl `thenLvl` \ (new_env, new_bndrs) ->
371 mapLvl (lvlExpr ctxt_lvl new_env) rhss `thenLvl` \ new_rhss ->
372 returnLvl (Rec ((new_bndrs `zip` repeat dest_lvl) `zip` new_rhss), new_env)
374 | isSingleton pairs && count isId abs_vars > 1
375 = -- Special case for self recursion where there are
376 -- several variables carried around: build a local loop:
377 -- poly_f = \abs_vars. \lam_vars . letrec f = \lam_vars. rhs in f lam_vars
378 -- This just makes the closures a bit smaller. If we don't do
379 -- this, allocation rises significantly on some programs
381 -- We could elaborate it for the case where there are several
382 -- mutually functions, but it's quite a bit more complicated
384 -- This all seems a bit ad hoc -- sigh
386 (bndr,rhs) = head pairs
387 (rhs_lvl, abs_vars_w_lvls) = lvlLamBndrs dest_lvl abs_vars
388 rhs_env = extendLvlEnv env abs_vars_w_lvls
390 cloneVar NotTopLevel rhs_env bndr rhs_lvl rhs_lvl `thenLvl` \ (rhs_env', new_bndr) ->
392 (lam_bndrs, rhs_body) = collect_binders rhs
393 (body_lvl, new_lam_bndrs) = lvlLamBndrs rhs_lvl lam_bndrs
394 body_env = extendLvlEnv rhs_env' new_lam_bndrs
396 lvlExpr body_lvl body_env rhs_body `thenLvl` \ new_rhs_body ->
397 newPolyBndrs dest_lvl env abs_vars [bndr] `thenLvl` \ (poly_env, [poly_bndr]) ->
398 returnLvl (Rec [((poly_bndr,dest_lvl), mkLams abs_vars_w_lvls $
399 glue_binders new_lam_bndrs rhs $
400 Let (Rec [((new_bndr,rhs_lvl), mkLams new_lam_bndrs new_rhs_body)])
401 (mkVarApps (Var new_bndr) lam_bndrs))],
405 = newPolyBndrs dest_lvl env abs_vars bndrs `thenLvl` \ (new_env, new_bndrs) ->
406 mapLvl (lvlFloatRhs abs_vars dest_lvl new_env) rhss `thenLvl` \ new_rhss ->
407 returnLvl (Rec ((new_bndrs `zip` repeat dest_lvl) `zip` new_rhss), new_env)
410 (bndrs,rhss) = unzip pairs
412 -- Finding the free vars of the binding group is annoying
413 bind_fvs = (unionVarSets [ idFreeVars bndr `unionVarSet` rhs_fvs
414 | (bndr, (rhs_fvs,_)) <- pairs])
418 dest_lvl = destLevel env bind_fvs (all isFunction rhss)
419 abs_vars = abstractVars dest_lvl env bind_fvs
421 ----------------------------------------------------
422 -- Three help functons for the type-abstraction case
424 lvlFloatRhs abs_vars dest_lvl env rhs
425 = lvlExpr rhs_lvl rhs_env rhs `thenLvl` \ rhs' ->
426 returnLvl (mkLams abs_vars_w_lvls rhs')
428 (rhs_lvl, abs_vars_w_lvls) = lvlLamBndrs dest_lvl abs_vars
429 rhs_env = extendLvlEnv env abs_vars_w_lvls
433 %************************************************************************
435 \subsection{Deciding floatability}
437 %************************************************************************
440 lvlLamBndrs :: Level -> [CoreBndr] -> (Level, [(CoreBndr, Level)])
441 -- Compute the levels for the binders of a lambda group
445 lvlLamBndrs lvl bndrs
446 = go (incMinorLvl lvl)
447 False -- Havn't bumped major level in this group
450 go old_lvl bumped_major rev_lvld_bndrs (bndr:bndrs)
451 | isId bndr && -- Go to the next major level if this is a value binder,
452 not bumped_major && -- and we havn't already gone to the next level (one jump per group)
453 not (isOneShotLambda bndr) -- and it isn't a one-shot lambda
454 = go new_lvl True ((bndr,new_lvl) : rev_lvld_bndrs) bndrs
457 = go old_lvl bumped_major ((bndr,old_lvl) : rev_lvld_bndrs) bndrs
460 new_lvl = incMajorLvl old_lvl
462 go old_lvl _ rev_lvld_bndrs []
463 = (old_lvl, reverse rev_lvld_bndrs)
464 -- a lambda like this (\x -> coerce t (\s -> ...))
465 -- This happens quite a bit in state-transformer programs
469 abstractVars :: Level -> LevelEnv -> VarSet -> [Var]
470 -- Find the variables in fvs, free vars of the target expresion,
471 -- whose level is less than than the supplied level
472 -- These are the ones we are going to abstract out
473 abstractVars dest_lvl env fvs
474 = uniq (sortLt lt [var | fv <- varSetElems fvs, var <- absVarsOf dest_lvl env fv])
476 -- Sort the variables so we don't get
477 -- mixed-up tyvars and Ids; it's just messy
478 v1 `lt` v2 = case (isId v1, isId v2) of
479 (True, False) -> False
480 (False, True) -> True
481 other -> v1 < v2 -- Same family
482 uniq :: [Var] -> [Var]
483 -- Remove adjacent duplicates; the sort will have brought them together
484 uniq (v1:v2:vs) | v1 == v2 = uniq (v2:vs)
485 | otherwise = v1 : uniq (v2:vs)
488 -- Destintion level is the max Id level of the expression
489 -- (We'll abstract the type variables, if any.)
490 destLevel :: LevelEnv -> VarSet -> Bool -> Level
491 destLevel env fvs is_function
493 && is_function = tOP_LEVEL -- Send functions to top level; see
494 -- the comments with isFunction
495 | otherwise = maxIdLevel env fvs
497 isFunction :: CoreExprWithFVs -> Bool
498 -- The idea here is that we want to float *functions* to
499 -- the top level. This saves no work, but
500 -- (a) it can make the host function body a lot smaller,
501 -- and hence inlinable.
502 -- (b) it can also save allocation when the function is recursive:
503 -- h = \x -> letrec f = \y -> ...f...y...x...
506 -- f = \x y -> ...(f x)...y...x...
508 -- No allocation for f now.
509 -- We may only want to do this if there are sufficiently few free
510 -- variables. We certainly only want to do it for values, and not for
511 -- constructors. So the simple thing is just to look for lambdas
512 isFunction (_, AnnLam b e) | isId b = True
513 | otherwise = isFunction e
514 isFunction (_, AnnNote n e) = isFunction e
515 isFunction other = False
519 %************************************************************************
521 \subsection{Free-To-Level Monad}
523 %************************************************************************
526 type LevelEnv = (Bool, -- True <=> Float lambdas too
527 VarEnv Level, -- Domain is *post-cloned* TyVars and Ids
528 SubstEnv, -- Domain is pre-cloned Ids
529 IdEnv ([Var], LevelledExpr)) -- Domain is pre-cloned Ids
530 -- We clone let-bound variables so that they are still
531 -- distinct when floated out; hence the SubstEnv/IdEnv.
532 -- We also use these envs when making a variable polymorphic
533 -- because we want to float it out past a big lambda.
535 -- The two Envs always implement the same mapping, but the
536 -- SubstEnv maps to CoreExpr and the IdEnv to LevelledExpr
537 -- Since the range is always a variable or type application,
538 -- there is never any difference between the two, but sadly
539 -- the types differ. The SubstEnv is used when substituting in
540 -- a variable's IdInfo; the IdEnv when we find a Var.
542 -- In addition the IdEnv records a list of tyvars free in the
543 -- type application, just so we don't have to call freeVars on
544 -- the type application repeatedly.
546 -- The domain of the both envs is *pre-cloned* Ids, though
548 -- The domain of the VarEnv Level is the *post-cloned* Ids
550 initialEnv :: Bool -> LevelEnv
551 initialEnv float_lams = (float_lams, emptyVarEnv, emptySubstEnv, emptyVarEnv)
553 floatLams :: LevelEnv -> Bool
554 floatLams (float_lams, _, _, _) = float_lams
556 extendLvlEnv :: LevelEnv -> [(Var,Level)] -> LevelEnv
557 -- Used when *not* cloning
558 extendLvlEnv (float_lams, lvl_env, subst_env, id_env) prs
559 = (float_lams, foldl add lvl_env prs, subst_env, id_env)
561 add env (v,l) = extendVarEnv env v l
563 -- extendCaseBndrLvlEnv adds the mapping case-bndr->scrut-var if it can
564 extendCaseBndrLvlEnv env scrut case_bndr lvl
566 Var v -> extendCloneLvlEnv lvl env [(case_bndr, v)]
567 other -> extendLvlEnv env [(case_bndr,lvl)]
569 extendPolyLvlEnv dest_lvl (float_lams, lvl_env, subst_env, id_env) abs_vars bndr_pairs
571 foldl add_lvl lvl_env bndr_pairs,
572 foldl add_subst subst_env bndr_pairs,
573 foldl add_id id_env bndr_pairs)
575 add_lvl env (v,v') = extendVarEnv env v' dest_lvl
576 add_subst env (v,v') = extendSubstEnv env v (DoneEx (mkVarApps (Var v') abs_vars))
577 add_id env (v,v') = extendVarEnv env v ((v':abs_vars), mkVarApps (Var v') abs_vars)
579 extendCloneLvlEnv lvl (float_lams, lvl_env, subst_env, id_env) bndr_pairs
581 foldl add_lvl lvl_env bndr_pairs,
582 foldl add_subst subst_env bndr_pairs,
583 foldl add_id id_env bndr_pairs)
585 add_lvl env (v,v') = extendVarEnv env v' lvl
586 add_subst env (v,v') = extendSubstEnv env v (DoneEx (Var v'))
587 add_id env (v,v') = extendVarEnv env v ([v'], Var v')
590 maxIdLevel :: LevelEnv -> VarSet -> Level
591 maxIdLevel (_, lvl_env,_,id_env) var_set
592 = foldVarSet max_in tOP_LEVEL var_set
594 max_in in_var lvl = foldr max_out lvl (case lookupVarEnv id_env in_var of
595 Just (abs_vars, _) -> abs_vars
599 | isId out_var = case lookupVarEnv lvl_env out_var of
600 Just lvl' -> maxLvl lvl' lvl
602 | otherwise = lvl -- Ignore tyvars in *maxIdLevel*
604 lookupVar :: LevelEnv -> Id -> LevelledExpr
605 lookupVar (_, _, _, id_env) v = case lookupVarEnv id_env v of
606 Just (_, expr) -> expr
609 absVarsOf :: Level -> LevelEnv -> Var -> [Var]
610 -- If f is free in the exression, and f maps to poly_f a b c in the
611 -- current substitution, then we must report a b c as candidate type
613 absVarsOf dest_lvl (_, lvl_env, _, id_env) v
615 = [final_av | av <- lookup_avs v, abstract_me av, final_av <- add_tyvars av]
618 = if abstract_me v then [v] else []
621 abstract_me v = case lookupVarEnv lvl_env v of
622 Just lvl -> dest_lvl `ltLvl` lvl
625 lookup_avs v = case lookupVarEnv id_env v of
626 Just (abs_vars, _) -> abs_vars
629 -- We are going to lambda-abstract, so nuke any IdInfo,
630 -- and add the tyvars of the Id
631 add_tyvars v | isId v = zap v : varSetElems (idFreeTyVars v)
634 zap v = WARN( workerExists (idWorkerInfo v)
635 || not (isEmptyCoreRules (idSpecialisation v)),
636 text "absVarsOf: discarding info on" <+> ppr v )
637 setIdInfo v vanillaIdInfo
641 type LvlM result = UniqSM result
650 newPolyBndrs dest_lvl env abs_vars bndrs
651 = getUniquesUs (length bndrs) `thenLvl` \ uniqs ->
653 new_bndrs = zipWith mk_poly_bndr bndrs uniqs
655 returnLvl (extendPolyLvlEnv dest_lvl env abs_vars (bndrs `zip` new_bndrs), new_bndrs)
657 mk_poly_bndr bndr uniq = mkSysLocal (_PK_ str) uniq poly_ty
659 str = "poly_" ++ occNameUserString (getOccName bndr)
660 poly_ty = foldr mkPiType (idType bndr) abs_vars
664 -> [CoreBndr] -> Type -- Abstract wrt these bndrs
666 newLvlVar str vars body_ty
667 = getUniqueUs `thenLvl` \ uniq ->
668 returnUs (mkSysLocal (_PK_ str) uniq (foldr mkPiType body_ty vars))
670 -- The deeply tiresome thing is that we have to apply the substitution
671 -- to the rules inside each Id. Grr. But it matters.
673 cloneVar :: TopLevelFlag -> LevelEnv -> Id -> Level -> Level -> LvlM (LevelEnv, Id)
674 cloneVar TopLevel env v ctxt_lvl dest_lvl
675 = returnUs (env, v) -- Don't clone top level things
676 cloneVar NotTopLevel env v ctxt_lvl dest_lvl
677 = getUniqueUs `thenLvl` \ uniq ->
679 v' = setVarUnique v uniq
680 v'' = subst_id_info env ctxt_lvl dest_lvl v'
681 env' = extendCloneLvlEnv dest_lvl env [(v,v'')]
685 cloneVars :: TopLevelFlag -> LevelEnv -> [Id] -> Level -> Level -> LvlM (LevelEnv, [Id])
686 cloneVars TopLevel env vs ctxt_lvl dest_lvl
687 = returnUs (env, vs) -- Don't clone top level things
688 cloneVars NotTopLevel env vs ctxt_lvl dest_lvl
689 = getUniquesUs (length vs) `thenLvl` \ uniqs ->
691 vs' = zipWith setVarUnique vs uniqs
692 vs'' = map (subst_id_info env' ctxt_lvl dest_lvl) vs'
693 env' = extendCloneLvlEnv dest_lvl env (vs `zip` vs'')
695 returnUs (env', vs'')
697 subst_id_info (_, _, subst_env, _) ctxt_lvl dest_lvl v
698 = modifyIdInfo (\info -> substIdInfo subst info (zap_dmd info)) v
700 subst = mkSubst emptyVarSet subst_env
702 -- VERY IMPORTANT: we must zap the demand info
703 -- if the thing is going to float out past a lambda
705 | float_past_lam && isStrict (demandInfo info)
706 = setDemandInfo info wwLazy
710 float_past_lam = ctxt_lvl `ltMajLvl` dest_lvl