[project @ 2000-07-11 16:24:57 by simonmar]
[ghc-hetmet.git] / ghc / compiler / simplCore / SetLevels.lhs
1 %
2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
3 %
4 \section{SetLevels}
5
6                 ***************************
7                         Overview
8                 ***************************
9
10 * We attach binding levels to Core bindings, in preparation for floating
11   outwards (@FloatOut@).
12
13 * We also let-ify many expressions (notably case scrutinees), so they
14   will have a fighting chance of being floated sensible.
15
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.
21
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
24
25 * In the expression
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.
31
32 \begin{code}
33 module SetLevels (
34         setLevels,
35
36         Level(..), tOP_LEVEL,
37
38         incMinorLvl, ltMajLvl, ltLvl, isTopLvl
39     ) where
40
41 #include "HsVersions.h"
42
43 import CoreSyn
44
45 import CoreUtils        ( exprType, exprIsTrivial, exprIsBottom, mkPiType )
46 import CoreFVs          -- all of it
47 import Subst
48 import Id               ( Id, idType, idFreeTyVars, mkSysLocal, isOneShotLambda, modifyIdInfo, 
49                           idSpecialisation, idWorkerInfo, setIdInfo
50                         )
51 import IdInfo           ( workerExists, vanillaIdInfo, demandInfo, setDemandInfo )
52 import Var              ( Var, setVarUnique )
53 import VarSet
54 import VarEnv
55 import Name             ( getOccName )
56 import OccName          ( occNameUserString )
57 import Type             ( isUnLiftedType, Type )
58 import BasicTypes       ( TopLevelFlag(..) )
59 import Demand           ( isStrict, wwLazy )
60 import UniqSupply
61 import Util             ( sortLt, isSingleton, count )
62 import Outputable
63 \end{code}
64
65 %************************************************************************
66 %*                                                                      *
67 \subsection{Level numbers}
68 %*                                                                      *
69 %************************************************************************
70
71 \begin{code}
72 data Level = Level Int  -- Level number of enclosing lambdas
73                    Int  -- Number of big-lambda and/or case expressions between
74                         -- here and the nearest enclosing lambda
75 \end{code}
76
77 The {\em level number} on a (type-)lambda-bound variable is the
78 nesting depth of the (type-)lambda which binds it.  The outermost lambda
79 has level 1, so (Level 0 0) means that the variable is bound outside any lambda.
80
81 On an expression, it's the maximum level number of its free
82 (type-)variables.  On a let(rec)-bound variable, it's the level of its
83 RHS.  On a case-bound variable, it's the number of enclosing lambdas.
84
85 Top-level variables: level~0.  Those bound on the RHS of a top-level
86 definition but ``before'' a lambda; e.g., the \tr{x} in (levels shown
87 as ``subscripts'')...
88 \begin{verbatim}
89 a_0 = let  b_? = ...  in
90            x_1 = ... b ... in ...
91 \end{verbatim}
92
93 The main function @lvlExpr@ carries a ``context level'' (@ctxt_lvl@).
94 That's meant to be the level number of the enclosing binder in the
95 final (floated) program.  If the level number of a sub-expression is
96 less than that of the context, then it might be worth let-binding the
97 sub-expression so that it will indeed float. This context level starts
98 at @Level 0 0@.
99
100 \begin{code}
101 type LevelledExpr  = TaggedExpr Level
102 type LevelledArg   = TaggedArg  Level
103 type LevelledBind  = TaggedBind Level
104
105 tOP_LEVEL = Level 0 0
106
107 incMajorLvl :: Level -> Level
108 incMajorLvl (Level major minor) = Level (major+1) 0
109
110 incMinorLvl :: Level -> Level
111 incMinorLvl (Level major minor) = Level major (minor+1)
112
113 maxLvl :: Level -> Level -> Level
114 maxLvl l1@(Level maj1 min1) l2@(Level maj2 min2)
115   | (maj1 > maj2) || (maj1 == maj2 && min1 > min2) = l1
116   | otherwise                                      = l2
117
118 ltLvl :: Level -> Level -> Bool
119 ltLvl (Level maj1 min1) (Level maj2 min2)
120   = (maj1 < maj2) || (maj1 == maj2 && min1 < min2)
121
122 ltMajLvl :: Level -> Level -> Bool
123     -- Tells if one level belongs to a difft *lambda* level to another
124     -- But it returns True regardless if l1 is the top level
125     -- We always like to float to the top!      
126 ltMajLvl (Level 0 0)    _              = True
127 ltMajLvl (Level maj1 _) (Level maj2 _) = maj1 < maj2
128
129 isTopLvl :: Level -> Bool
130 isTopLvl (Level 0 0) = True
131 isTopLvl other       = False
132
133 instance Outputable Level where
134   ppr (Level maj min) = hcat [ char '<', int maj, char ',', int min, char '>' ]
135 \end{code}
136
137 %************************************************************************
138 %*                                                                      *
139 \subsection{Main level-setting code}
140 %*                                                                      *
141 %************************************************************************
142
143 \begin{code}
144 setLevels :: Bool               -- True <=> float lambdas to top level
145           -> [CoreBind]
146           -> UniqSupply
147           -> [LevelledBind]
148
149 setLevels float_lams binds us
150   = initLvl us (do_them binds)
151   where
152     -- "do_them"'s main business is to thread the monad along
153     -- It gives each top binding the same empty envt, because
154     -- things unbound in the envt have level number zero implicitly
155     do_them :: [CoreBind] -> LvlM [LevelledBind]
156
157     do_them [] = returnLvl []
158     do_them (b:bs)
159       = lvlTopBind init_env b   `thenLvl` \ (lvld_bind, _) ->
160         do_them bs              `thenLvl` \ lvld_binds ->
161         returnLvl (lvld_bind : lvld_binds)
162
163     init_env = initialEnv float_lams
164
165 lvlTopBind env (NonRec binder rhs)
166   = lvlBind TopLevel tOP_LEVEL env (AnnNonRec binder (freeVars rhs))
167                                         -- Rhs can have no free vars!
168
169 lvlTopBind env (Rec pairs)
170   = lvlBind TopLevel tOP_LEVEL env (AnnRec [(b,freeVars rhs) | (b,rhs) <- pairs])
171 \end{code}
172
173 %************************************************************************
174 %*                                                                      *
175 \subsection{Setting expression levels}
176 %*                                                                      *
177 %************************************************************************
178
179 \begin{code}
180 lvlExpr :: Level                -- ctxt_lvl: Level of enclosing expression
181         -> LevelEnv             -- Level of in-scope names/tyvars
182         -> CoreExprWithFVs      -- input expression
183         -> LvlM LevelledExpr    -- Result expression
184 \end{code}
185
186 The @ctxt_lvl@ is, roughly, the level of the innermost enclosing
187 binder.  Here's an example
188
189         v = \x -> ...\y -> let r = case (..x..) of
190                                         ..x..
191                            in ..
192
193 When looking at the rhs of @r@, @ctxt_lvl@ will be 1 because that's
194 the level of @r@, even though it's inside a level-2 @\y@.  It's
195 important that @ctxt_lvl@ is 1 and not 2 in @r@'s rhs, because we
196 don't want @lvlExpr@ to turn the scrutinee of the @case@ into an MFE
197 --- because it isn't a *maximal* free expression.
198
199 If there were another lambda in @r@'s rhs, it would get level-2 as well.
200
201 \begin{code}
202 lvlExpr _ _ (_, AnnType ty)   = returnLvl (Type ty)
203 lvlExpr _ env (_, AnnVar v)   = returnLvl (lookupVar env v)
204 lvlExpr _ env (_, AnnLit lit) = returnLvl (Lit lit)
205
206 lvlExpr ctxt_lvl env (_, AnnApp fun arg)
207   = lvl_fun fun                         `thenLvl` \ fun' ->
208     lvlMFE  False ctxt_lvl env arg      `thenLvl` \ arg' ->
209     returnLvl (App fun' arg')
210   where
211     lvl_fun (_, AnnCase _ _ _) = lvlMFE True ctxt_lvl env fun
212     lvl_fun other              = lvlExpr ctxt_lvl env fun
213         -- We don't do MFE on partial applications generally,
214         -- but we do if the function is big and hairy, like a case
215
216 lvlExpr ctxt_lvl env (_, AnnNote InlineMe expr)
217         -- Don't float anything out of an InlineMe
218   = lvlExpr tOP_LEVEL env expr          `thenLvl` \ expr' ->
219     returnLvl (Note InlineMe expr')
220
221 lvlExpr ctxt_lvl env (_, AnnNote note expr)
222   = lvlExpr ctxt_lvl env expr           `thenLvl` \ expr' ->
223     returnLvl (Note note expr')
224
225 -- We don't split adjacent lambdas.  That is, given
226 --      \x y -> (x+1,y)
227 -- we don't float to give 
228 --      \x -> let v = x+y in \y -> (v,y)
229 -- Why not?  Because partial applications are fairly rare, and splitting
230 -- lambdas makes them more expensive.
231
232 lvlExpr ctxt_lvl env expr@(_, AnnLam bndr rhs)
233   = lvlMFE True new_lvl new_env body    `thenLvl` \ new_body ->
234     returnLvl (glue_binders new_bndrs expr new_body)
235   where 
236     (bndrs, body)        = collect_binders expr
237     (new_lvl, new_bndrs) = lvlLamBndrs ctxt_lvl bndrs
238     new_env              = extendLvlEnv env new_bndrs
239
240 lvlExpr ctxt_lvl env (_, AnnLet bind body)
241   = lvlBind NotTopLevel ctxt_lvl env bind       `thenLvl` \ (bind', new_env) ->
242     lvlExpr ctxt_lvl new_env body               `thenLvl` \ body' ->
243     returnLvl (Let bind' body')
244
245 lvlExpr ctxt_lvl env (_, AnnCase expr case_bndr alts)
246   = lvlMFE True ctxt_lvl env expr       `thenLvl` \ expr' ->
247     let
248         alts_env = extendCaseBndrLvlEnv env expr' case_bndr incd_lvl
249     in
250     mapLvl (lvl_alt alts_env) alts      `thenLvl` \ alts' ->
251     returnLvl (Case expr' (case_bndr, incd_lvl) alts')
252   where
253       expr_type = exprType (deAnnotate expr)
254       incd_lvl  = incMinorLvl ctxt_lvl
255
256       lvl_alt alts_env (con, bs, rhs)
257         = lvlMFE True incd_lvl new_env rhs      `thenLvl` \ rhs' ->
258           returnLvl (con, bs', rhs')
259         where
260           bs'     = [ (b, incd_lvl) | b <- bs ]
261           new_env = extendLvlEnv alts_env bs'
262
263 collect_binders lam
264   = go [] lam
265   where
266     go rev_bndrs (_, AnnLam b e)  = go (b:rev_bndrs) e
267     go rev_bndrs (_, AnnNote n e) = go rev_bndrs e
268     go rev_bndrs rhs              = (reverse rev_bndrs, rhs)
269         -- Ignore notes, because we don't want to split
270         -- a lambda like this (\x -> coerce t (\s -> ...))
271         -- This happens quite a bit in state-transformer programs
272
273         -- glue_binders puts the lambda back together
274 glue_binders (b:bs) (_, AnnLam _ e)  body = Lam b (glue_binders bs e body)
275 glue_binders bs     (_, AnnNote n e) body = Note n (glue_binders bs e body)
276 glue_binders []     e                body = body
277 \end{code}
278
279 @lvlMFE@ is just like @lvlExpr@, except that it might let-bind
280 the expression, so that it can itself be floated.
281
282 \begin{code}
283 lvlMFE ::  Bool                 -- True <=> strict context [body of case or let]
284         -> Level                -- Level of innermost enclosing lambda/tylam
285         -> LevelEnv             -- Level of in-scope names/tyvars
286         -> CoreExprWithFVs      -- input expression
287         -> LvlM LevelledExpr    -- Result expression
288
289 lvlMFE strict_ctxt ctxt_lvl env (_, AnnType ty)
290   = returnLvl (Type ty)
291
292 lvlMFE strict_ctxt ctxt_lvl env ann_expr@(fvs, _)
293   |  isUnLiftedType ty                          -- Can't let-bind it
294   || not good_destination
295   || exprIsTrivial expr                         -- Is trivial
296   || (strict_ctxt && exprIsBottom expr)         -- Strict context and is bottom
297   =     -- Don't float it out
298     lvlExpr ctxt_lvl env ann_expr
299
300   | otherwise   -- Float it out!
301   = lvlFloatRhs abs_vars dest_lvl env ann_expr  `thenLvl` \ expr' ->
302     newLvlVar "lvl" abs_vars ty                 `thenLvl` \ var ->
303     returnLvl (Let (NonRec (var,dest_lvl) expr') 
304                    (mkVarApps (Var var) abs_vars))
305   where
306     expr     = deAnnotate ann_expr
307     ty       = exprType expr
308     dest_lvl = destLevel env fvs (isFunction ann_expr)
309     abs_vars = abstractVars dest_lvl env fvs
310
311     good_destination =  dest_lvl `ltMajLvl` ctxt_lvl            -- Escapes a value lambda
312                      || (isTopLvl dest_lvl && not strict_ctxt)  -- Goes to the top
313         -- A decision to float entails let-binding this thing, and we only do 
314         -- that if we'll escape a value lambda, or will go to the top level.
315         -- But beware
316         --      concat = /\ a -> foldr ..a.. (++) []
317         -- was getting turned into
318         --      concat = /\ a -> lvl a
319         --      lvl    = /\ a -> foldr ..a.. (++) []
320         -- which is pretty stupid.  Hence the strict_ctxt test
321 \end{code}
322
323
324 %************************************************************************
325 %*                                                                      *
326 \subsection{Bindings}
327 %*                                                                      *
328 %************************************************************************
329
330 The binding stuff works for top level too.
331
332 \begin{code}
333 lvlBind :: TopLevelFlag         -- Used solely to decide whether to clone
334         -> Level                -- Context level; might be Top even for bindings nested in the RHS
335                                 -- of a top level binding
336         -> LevelEnv
337         -> CoreBindWithFVs
338         -> LvlM (LevelledBind, LevelEnv)
339
340 lvlBind top_lvl ctxt_lvl env (AnnNonRec bndr rhs@(rhs_fvs,_))
341   | null abs_vars
342   =     -- No type abstraction; clone existing binder
343     lvlExpr ctxt_lvl env rhs                    `thenLvl` \ rhs' ->
344     cloneVar top_lvl env bndr ctxt_lvl dest_lvl `thenLvl` \ (env', bndr') ->
345     returnLvl (NonRec (bndr', dest_lvl) rhs', env') 
346
347   | otherwise
348   = -- Yes, type abstraction; create a new binder, extend substitution, etc
349     lvlFloatRhs abs_vars dest_lvl env rhs       `thenLvl` \ rhs' ->
350     newPolyBndrs dest_lvl env abs_vars [bndr]   `thenLvl` \ (env', [bndr']) ->
351     returnLvl (NonRec (bndr', dest_lvl) rhs', env')
352
353   where
354     bind_fvs = rhs_fvs `unionVarSet` idFreeVars bndr
355     abs_vars = abstractVars dest_lvl env bind_fvs
356
357     dest_lvl | isUnLiftedType (idType bndr) = destLevel env bind_fvs False `maxLvl` Level 1 0
358              | otherwise                    = destLevel env bind_fvs (isFunction rhs)
359         -- Hack alert!  We do have some unlifted bindings, for cheap primops, and 
360         -- it is ok to float them out; but not to the top level.  If they would otherwise
361         -- go to the top level, we pin them inside the topmost lambda
362 \end{code}
363
364
365 \begin{code}
366 lvlBind top_lvl ctxt_lvl env (AnnRec pairs)
367   | null abs_vars
368   = cloneVars top_lvl env bndrs ctxt_lvl dest_lvl       `thenLvl` \ (new_env, new_bndrs) ->
369     mapLvl (lvlExpr ctxt_lvl new_env) rhss              `thenLvl` \ new_rhss ->
370     returnLvl (Rec ((new_bndrs `zip` repeat dest_lvl) `zip` new_rhss), new_env)
371
372   | isSingleton pairs && count isId abs_vars > 1
373   =     -- Special case for self recursion where there are
374         -- several variables carried around: build a local loop:        
375         --      poly_f = \abs_vars. \lam_vars . letrec f = \lam_vars. rhs in f lam_vars
376         -- This just makes the closures a bit smaller.  If we don't do
377         -- this, allocation rises significantly on some programs
378         --
379         -- We could elaborate it for the case where there are several
380         -- mutually functions, but it's quite a bit more complicated
381         -- 
382         -- This all seems a bit ad hoc -- sigh
383     let
384         (bndr,rhs) = head pairs
385         (rhs_lvl, abs_vars_w_lvls) = lvlLamBndrs dest_lvl abs_vars
386         rhs_env = extendLvlEnv env abs_vars_w_lvls
387     in
388     cloneVar NotTopLevel rhs_env bndr rhs_lvl rhs_lvl   `thenLvl` \ (rhs_env', new_bndr) ->
389     let
390         (lam_bndrs, rhs_body)     = collect_binders rhs
391         (body_lvl, new_lam_bndrs) = lvlLamBndrs rhs_lvl lam_bndrs
392         body_env                  = extendLvlEnv rhs_env' new_lam_bndrs
393     in
394     lvlExpr body_lvl body_env rhs_body          `thenLvl` \ new_rhs_body ->
395     newPolyBndrs dest_lvl env abs_vars [bndr]   `thenLvl` \ (poly_env, [poly_bndr]) ->
396     returnLvl (Rec [((poly_bndr,dest_lvl), mkLams abs_vars_w_lvls $
397                                            glue_binders new_lam_bndrs rhs $
398                                            Let (Rec [((new_bndr,rhs_lvl), mkLams new_lam_bndrs new_rhs_body)]) 
399                                                 (mkVarApps (Var new_bndr) lam_bndrs))],
400                poly_env)
401
402   | otherwise
403   = newPolyBndrs dest_lvl env abs_vars bndrs            `thenLvl` \ (new_env, new_bndrs) ->
404     mapLvl (lvlFloatRhs abs_vars dest_lvl new_env) rhss `thenLvl` \ new_rhss ->
405     returnLvl (Rec ((new_bndrs `zip` repeat dest_lvl) `zip` new_rhss), new_env)
406
407   where
408     (bndrs,rhss) = unzip pairs
409
410         -- Finding the free vars of the binding group is annoying
411     bind_fvs        = (unionVarSets [ idFreeVars bndr `unionVarSet` rhs_fvs
412                                     | (bndr, (rhs_fvs,_)) <- pairs])
413                       `minusVarSet`
414                       mkVarSet bndrs
415
416     dest_lvl = destLevel env bind_fvs (all isFunction rhss)
417     abs_vars = abstractVars dest_lvl env bind_fvs
418
419 ----------------------------------------------------
420 -- Three help functons for the type-abstraction case
421
422 lvlFloatRhs abs_vars dest_lvl env rhs
423   = lvlExpr rhs_lvl rhs_env rhs `thenLvl` \ rhs' ->
424     returnLvl (mkLams abs_vars_w_lvls rhs')
425   where
426     (rhs_lvl, abs_vars_w_lvls) = lvlLamBndrs dest_lvl abs_vars
427     rhs_env = extendLvlEnv env abs_vars_w_lvls
428 \end{code}
429
430
431 %************************************************************************
432 %*                                                                      *
433 \subsection{Deciding floatability}
434 %*                                                                      *
435 %************************************************************************
436
437 \begin{code}
438 lvlLamBndrs :: Level -> [CoreBndr] -> (Level, [(CoreBndr, Level)])
439 -- Compute the levels for the binders of a lambda group
440 lvlLamBndrs lvl [] 
441   = (lvl, [])
442
443 lvlLamBndrs lvl bndrs
444   = go  (incMinorLvl lvl)
445         False   -- Havn't bumped major level in this group
446         [] bndrs
447   where
448     go old_lvl bumped_major rev_lvld_bndrs (bndr:bndrs)
449         | isId bndr &&                  -- Go to the next major level if this is a value binder,
450           not bumped_major &&           -- and we havn't already gone to the next level (one jump per group)
451           not (isOneShotLambda bndr)    -- and it isn't a one-shot lambda
452         = go new_lvl True ((bndr,new_lvl) : rev_lvld_bndrs) bndrs
453
454         | otherwise
455         = go old_lvl bumped_major ((bndr,old_lvl) : rev_lvld_bndrs) bndrs
456
457         where
458           new_lvl = incMajorLvl old_lvl
459
460     go old_lvl _ rev_lvld_bndrs []
461         = (old_lvl, reverse rev_lvld_bndrs)
462         -- a lambda like this (\x -> coerce t (\s -> ...))
463         -- This happens quite a bit in state-transformer programs
464 \end{code}
465
466 \begin{code}
467 abstractVars :: Level -> LevelEnv -> VarSet -> [Var]
468         -- Find the variables in fvs, free vars of the target expresion,
469         -- whose level is less than than the supplied level
470         -- These are the ones we are going to abstract out
471 abstractVars dest_lvl env fvs
472   = uniq (sortLt lt [var | fv <- varSetElems fvs, var <- absVarsOf dest_lvl env fv])
473   where
474         -- Sort the variables so we don't get 
475         -- mixed-up tyvars and Ids; it's just messy
476     v1 `lt` v2 = case (isId v1, isId v2) of
477                    (True, False) -> False
478                    (False, True) -> True
479                    other         -> v1 < v2     -- Same family
480     uniq :: [Var] -> [Var]
481         -- Remove adjacent duplicates; the sort will have brought them together
482     uniq (v1:v2:vs) | v1 == v2  = uniq (v2:vs)
483                     | otherwise = v1 : uniq (v2:vs)
484     uniq vs = vs
485
486   -- Destintion level is the max Id level of the expression
487   -- (We'll abstract the type variables, if any.)
488 destLevel :: LevelEnv -> VarSet -> Bool -> Level
489 destLevel env fvs is_function
490   |  floatLams env
491   && is_function = tOP_LEVEL            -- Send functions to top level; see
492                                         -- the comments with isFunction
493   | otherwise    = maxIdLevel env fvs
494
495 isFunction :: CoreExprWithFVs -> Bool
496 -- The idea here is that we want to float *functions* to
497 -- the top level.  This saves no work, but 
498 --      (a) it can make the host function body a lot smaller, 
499 --              and hence inlinable.  
500 --      (b) it can also save allocation when the function is recursive:
501 --          h = \x -> letrec f = \y -> ...f...y...x...
502 --                    in f x
503 --     becomes
504 --          f = \x y -> ...(f x)...y...x...
505 --          h = \x -> f x x
506 --     No allocation for f now.
507 -- We may only want to do this if there are sufficiently few free 
508 -- variables.  We certainly only want to do it for values, and not for
509 -- constructors.  So the simple thing is just to look for lambdas
510 isFunction (_, AnnLam b e) | isId b    = True
511                            | otherwise = isFunction e
512 isFunction (_, AnnNote n e)            = isFunction e
513 isFunction other                       = False
514 \end{code}
515
516
517 %************************************************************************
518 %*                                                                      *
519 \subsection{Free-To-Level Monad}
520 %*                                                                      *
521 %************************************************************************
522
523 \begin{code}
524 type LevelEnv = (Bool,                          -- True <=> Float lambdas too
525                  VarEnv Level,                  -- Domain is *post-cloned* TyVars and Ids
526                  SubstEnv,                      -- Domain is pre-cloned Ids
527                  IdEnv ([Var], LevelledExpr))   -- Domain is pre-cloned Ids
528         -- We clone let-bound variables so that they are still
529         -- distinct when floated out; hence the SubstEnv/IdEnv.
530         -- We also use these envs when making a variable polymorphic
531         -- because we want to float it out past a big lambda.
532         --
533         -- The two Envs always implement the same mapping, but the
534         -- SubstEnv maps to CoreExpr and the IdEnv to LevelledExpr
535         -- Since the range is always a variable or type application,
536         -- there is never any difference between the two, but sadly
537         -- the types differ.  The SubstEnv is used when substituting in
538         -- a variable's IdInfo; the IdEnv when we find a Var.
539         --
540         -- In addition the IdEnv records a list of tyvars free in the
541         -- type application, just so we don't have to call freeVars on
542         -- the type application repeatedly.
543         --
544         -- The domain of the both envs is *pre-cloned* Ids, though
545         --
546         -- The domain of the VarEnv Level is the *post-cloned* Ids
547
548 initialEnv :: Bool -> LevelEnv
549 initialEnv float_lams = (float_lams, emptyVarEnv, emptySubstEnv, emptyVarEnv)
550
551 floatLams :: LevelEnv -> Bool
552 floatLams (float_lams, _, _, _) = float_lams
553
554 extendLvlEnv :: LevelEnv -> [(Var,Level)] -> LevelEnv
555         -- Used when *not* cloning
556 extendLvlEnv (float_lams, lvl_env, subst_env, id_env) prs
557   = (float_lams, foldl add lvl_env prs, subst_env, id_env)
558   where
559     add env (v,l) = extendVarEnv env v l
560
561 -- extendCaseBndrLvlEnv adds the mapping case-bndr->scrut-var if it can
562 extendCaseBndrLvlEnv env scrut case_bndr lvl
563   = case scrut of
564         Var v -> extendCloneLvlEnv lvl env [(case_bndr, v)]
565         other -> extendLvlEnv          env [(case_bndr,lvl)]
566
567 extendPolyLvlEnv dest_lvl (float_lams, lvl_env, subst_env, id_env) abs_vars bndr_pairs
568   = (float_lams,
569      foldl add_lvl   lvl_env   bndr_pairs,
570      foldl add_subst subst_env bndr_pairs,
571      foldl add_id    id_env    bndr_pairs)
572   where
573      add_lvl   env (v,v') = extendVarEnv   env v' dest_lvl
574      add_subst env (v,v') = extendSubstEnv env v (DoneEx (mkVarApps (Var v') abs_vars))
575      add_id    env (v,v') = extendVarEnv   env v ((v':abs_vars), mkVarApps (Var v') abs_vars)
576
577 extendCloneLvlEnv lvl (float_lams, lvl_env, subst_env, id_env) bndr_pairs
578   = (float_lams,
579      foldl add_lvl lvl_env bndr_pairs,
580      foldl add_subst subst_env bndr_pairs,
581      foldl add_id    id_env    bndr_pairs)
582   where
583      add_lvl   env (v,v') = extendVarEnv   env v' lvl
584      add_subst env (v,v') = extendSubstEnv env v (DoneEx (Var v'))
585      add_id    env (v,v') = extendVarEnv   env v ([v'], Var v')
586
587
588 maxIdLevel :: LevelEnv -> VarSet -> Level
589 maxIdLevel (_, lvl_env,_,id_env) var_set
590   = foldVarSet max_in tOP_LEVEL var_set
591   where
592     max_in in_var lvl = foldr max_out lvl (case lookupVarEnv id_env in_var of
593                                                 Just (abs_vars, _) -> abs_vars
594                                                 Nothing            -> [in_var])
595
596     max_out out_var lvl 
597         | isId out_var = case lookupVarEnv lvl_env out_var of
598                                 Just lvl' -> maxLvl lvl' lvl
599                                 Nothing   -> lvl 
600         | otherwise    = lvl    -- Ignore tyvars in *maxIdLevel*
601
602 lookupVar :: LevelEnv -> Id -> LevelledExpr
603 lookupVar (_, _, _, id_env) v = case lookupVarEnv id_env v of
604                                        Just (_, expr) -> expr
605                                        other          -> Var v
606
607 absVarsOf :: Level -> LevelEnv -> Var -> [Var]
608         -- If f is free in the exression, and f maps to poly_f a b c in the
609         -- current substitution, then we must report a b c as candidate type
610         -- variables
611 absVarsOf dest_lvl (_, lvl_env, _, id_env) v 
612   | isId v
613   = [final_av | av <- lookup_avs v, abstract_me av, final_av <- add_tyvars av]
614
615   | otherwise
616   = if abstract_me v then [v] else []
617
618   where
619     abstract_me v = case lookupVarEnv lvl_env v of
620                         Just lvl -> dest_lvl `ltLvl` lvl
621                         Nothing  -> False
622
623     lookup_avs v = case lookupVarEnv id_env v of
624                         Just (abs_vars, _) -> abs_vars
625                         Nothing            -> [v]
626
627         -- We are going to lambda-abstract, so nuke any IdInfo,
628         -- and add the tyvars of the Id
629     add_tyvars v | isId v    =  zap v  : varSetElems (idFreeTyVars v)
630                  | otherwise = [v]
631
632     zap v = WARN( workerExists (idWorkerInfo v)
633                   || not (isEmptyCoreRules (idSpecialisation v)),
634                   text "absVarsOf: discarding info on" <+> ppr v )
635             setIdInfo v vanillaIdInfo
636 \end{code}
637
638 \begin{code}
639 type LvlM result = UniqSM result
640
641 initLvl         = initUs_
642 thenLvl         = thenUs
643 returnLvl       = returnUs
644 mapLvl          = mapUs
645 \end{code}
646
647 \begin{code}
648 newPolyBndrs dest_lvl env abs_vars bndrs
649   = getUniquesUs (length bndrs)         `thenLvl` \ uniqs ->
650     let
651         new_bndrs = zipWith mk_poly_bndr bndrs uniqs
652     in
653     returnLvl (extendPolyLvlEnv dest_lvl env abs_vars (bndrs `zip` new_bndrs), new_bndrs)
654   where
655     mk_poly_bndr bndr uniq = mkSysLocal (_PK_ str) uniq poly_ty
656                            where
657                              str     = "poly_" ++ occNameUserString (getOccName bndr)
658                              poly_ty = foldr mkPiType (idType bndr) abs_vars
659         
660
661 newLvlVar :: String 
662           -> [CoreBndr] -> Type         -- Abstract wrt these bndrs
663           -> LvlM Id
664 newLvlVar str vars body_ty      
665   = getUniqueUs `thenLvl` \ uniq ->
666     returnUs (mkSysLocal (_PK_ str) uniq (foldr mkPiType body_ty vars))
667     
668 -- The deeply tiresome thing is that we have to apply the substitution
669 -- to the rules inside each Id.  Grr.  But it matters.
670
671 cloneVar :: TopLevelFlag -> LevelEnv -> Id -> Level -> Level -> LvlM (LevelEnv, Id)
672 cloneVar TopLevel env v ctxt_lvl dest_lvl
673   = returnUs (env, v)   -- Don't clone top level things
674 cloneVar NotTopLevel env v ctxt_lvl dest_lvl
675   = ASSERT( isId v )
676     getUniqueUs `thenLvl` \ uniq ->
677     let
678       v'         = setVarUnique v uniq
679       v''        = subst_id_info env ctxt_lvl dest_lvl v'
680       env'       = extendCloneLvlEnv dest_lvl env [(v,v'')]
681     in
682     returnUs (env', v'')
683
684 cloneVars :: TopLevelFlag -> LevelEnv -> [Id] -> Level -> Level -> LvlM (LevelEnv, [Id])
685 cloneVars TopLevel env vs ctxt_lvl dest_lvl 
686   = returnUs (env, vs)  -- Don't clone top level things
687 cloneVars NotTopLevel env vs ctxt_lvl dest_lvl
688   = ASSERT( all isId vs )
689     getUniquesUs (length vs)    `thenLvl` \ uniqs ->
690     let
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'')
694     in
695     returnUs (env', vs'')
696
697 subst_id_info (_, _, subst_env, _) ctxt_lvl dest_lvl v
698     = modifyIdInfo (\info -> substIdInfo subst info (zap_dmd info)) v
699   where
700     subst = mkSubst emptyVarSet subst_env
701
702         -- VERY IMPORTANT: we must zap the demand info 
703         -- if the thing is going to float out past a lambda
704     zap_dmd info
705         | float_past_lam && isStrict (demandInfo info)
706         = setDemandInfo info wwLazy
707         | otherwise
708         = info
709
710     float_past_lam = ctxt_lvl `ltMajLvl` dest_lvl
711 \end{code}
712