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