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