48ffd7f22dec8d43edbe46660e12a7dbb0c51697
[ghc-hetmet.git] / ghc / compiler / specialise / Specialise.lhs
1 %
2 % (c) The GRASP/AQUA Project, Glasgow University, 1993-1996
3 %
4 \section[Specialise]{Stamping out overloading, and (optionally) polymorphism}
5
6 \begin{code}
7 module Specialise (
8         specProgram, 
9         idSpecVars
10     ) where
11
12 #include "HsVersions.h"
13
14 import MkId             ( mkUserLocal )
15 import Id               ( Id, DictVar, idType, mkTemplateLocals,
16
17                           getIdSpecialisation, setIdSpecialisation, isSpecPragmaId,
18
19                           IdSet, mkIdSet, addOneToIdSet, intersectIdSets, isEmptyIdSet, 
20                                  emptyIdSet, unionIdSets, minusIdSet, unitIdSet, elementOfIdSet,
21
22                           IdEnv, mkIdEnv, lookupIdEnv, addOneToIdEnv, delOneFromIdEnv
23                         )
24
25 import Type             ( Type, mkTyVarTy, splitSigmaTy, instantiateTy, isDictTy,
26                           tyVarsOfType, tyVarsOfTypes, applyTys, mkForAllTys
27                         )
28 import TyCon            ( TyCon )
29 import TyVar            ( TyVar, mkTyVar, mkSysTyVar,
30                           TyVarSet, mkTyVarSet, isEmptyTyVarSet, intersectTyVarSets,
31                                     elementOfTyVarSet, unionTyVarSets, emptyTyVarSet,
32                                     minusTyVarSet,
33                           TyVarEnv, mkTyVarEnv, delFromTyVarEnv
34                         )
35 import Kind             ( mkBoxedTypeKind )
36 import CoreSyn
37 import FreeVars         ( exprFreeVars )
38 import PprCore          ()      -- Instances 
39 import Name             ( NamedThing(..), getSrcLoc, mkSysLocalName, isLocallyDefined )
40 import SrcLoc           ( noSrcLoc )
41 import SpecEnv          ( addToSpecEnv, lookupSpecEnv, specEnvValues )
42
43 import UniqSupply       ( UniqSupply,
44                           UniqSM, initUs, thenUs, returnUs, getUnique, mapUs
45                         )
46 import Unique           ( mkAlphaTyVarUnique )
47 import FiniteMap
48 import Maybes           ( MaybeErr(..), maybeToBool, catMaybes )
49 import Bag
50 import List             ( partition )
51 import Util             ( zipEqual )
52 import Outputable
53
54
55 infixr 9 `thenSM`
56 \end{code}
57
58 %************************************************************************
59 %*                                                                      *
60 \subsection[notes-Specialise]{Implementation notes [SLPJ, Aug 18 1993]}
61 %*                                                                      *
62 %************************************************************************
63
64 These notes describe how we implement specialisation to eliminate
65 overloading.
66
67 The specialisation pass works on Core
68 syntax, complete with all the explicit dictionary application,
69 abstraction and construction as added by the type checker.  The
70 existing type checker remains largely as it is.
71
72 One important thought: the {\em types} passed to an overloaded
73 function, and the {\em dictionaries} passed are mutually redundant.
74 If the same function is applied to the same type(s) then it is sure to
75 be applied to the same dictionary(s)---or rather to the same {\em
76 values}.  (The arguments might look different but they will evaluate
77 to the same value.)
78
79 Second important thought: we know that we can make progress by
80 treating dictionary arguments as static and worth specialising on.  So
81 we can do without binding-time analysis, and instead specialise on
82 dictionary arguments and no others.
83
84 The basic idea
85 ~~~~~~~~~~~~~~
86 Suppose we have
87
88         let f = <f_rhs>
89         in <body>
90
91 and suppose f is overloaded.
92
93 STEP 1: CALL-INSTANCE COLLECTION
94
95 We traverse <body>, accumulating all applications of f to types and
96 dictionaries.
97
98 (Might there be partial applications, to just some of its types and
99 dictionaries?  In principle yes, but in practice the type checker only
100 builds applications of f to all its types and dictionaries, so partial
101 applications could only arise as a result of transformation, and even
102 then I think it's unlikely.  In any case, we simply don't accumulate such
103 partial applications.)
104
105 There's a choice of whether to collect details of all *polymorphic* functions
106 or simply all *overloaded* ones.  How to sort this out?
107   Pass in a predicate on the function to say if it is "interesting"?
108   This is dependent on the user flags: SpecialiseOverloaded
109                                        SpecialiseUnboxed
110                                        SpecialiseAll
111
112 STEP 2: EQUIVALENCES
113
114 So now we have a collection of calls to f:
115         f t1 t2 d1 d2
116         f t3 t4 d3 d4
117         ...
118 Notice that f may take several type arguments.  To avoid ambiguity, we
119 say that f is called at type t1/t2 and t3/t4.
120
121 We take equivalence classes using equality of the *types* (ignoring
122 the dictionary args, which as mentioned previously are redundant).
123
124 STEP 3: SPECIALISATION
125
126 For each equivalence class, choose a representative (f t1 t2 d1 d2),
127 and create a local instance of f, defined thus:
128
129         f@t1/t2 = <f_rhs> t1 t2 d1 d2
130
131 f_rhs presumably has some big lambdas and dictionary lambdas, so lots
132 of simplification will now result.  However we don't actually *do* that
133 simplification.  Rather, we leave it for the simplifier to do.  If we
134 *did* do it, though, we'd get more call instances from the specialised
135 RHS.  We can work out what they are by instantiating the call-instance
136 set from f's RHS with the types t1, t2.
137
138 Add this new id to f's IdInfo, to record that f has a specialised version.
139
140 Before doing any of this, check that f's IdInfo doesn't already
141 tell us about an existing instance of f at the required type/s.
142 (This might happen if specialisation was applied more than once, or
143 it might arise from user SPECIALIZE pragmas.)
144
145 Recursion
146 ~~~~~~~~~
147 Wait a minute!  What if f is recursive?  Then we can't just plug in
148 its right-hand side, can we?
149
150 But it's ok.  The type checker *always* creates non-recursive definitions
151 for overloaded recursive functions.  For example:
152
153         f x = f (x+x)           -- Yes I know its silly
154
155 becomes
156
157         f a (d::Num a) = let p = +.sel a d
158                          in
159                          letrec fl (y::a) = fl (p y y)
160                          in
161                          fl
162
163 We still have recusion for non-overloaded functions which we
164 speciailise, but the recursive call should get specialised to the
165 same recursive version.
166
167
168 Polymorphism 1
169 ~~~~~~~~~~~~~~
170
171 All this is crystal clear when the function is applied to *constant
172 types*; that is, types which have no type variables inside.  But what if
173 it is applied to non-constant types?  Suppose we find a call of f at type
174 t1/t2.  There are two possibilities:
175
176 (a) The free type variables of t1, t2 are in scope at the definition point
177 of f.  In this case there's no problem, we proceed just as before.  A common
178 example is as follows.  Here's the Haskell:
179
180         g y = let f x = x+x
181               in f y + f y
182
183 After typechecking we have
184
185         g a (d::Num a) (y::a) = let f b (d'::Num b) (x::b) = +.sel b d' x x
186                                 in +.sel a d (f a d y) (f a d y)
187
188 Notice that the call to f is at type type "a"; a non-constant type.
189 Both calls to f are at the same type, so we can specialise to give:
190
191         g a (d::Num a) (y::a) = let f@a (x::a) = +.sel a d x x
192                                 in +.sel a d (f@a y) (f@a y)
193
194
195 (b) The other case is when the type variables in the instance types
196 are *not* in scope at the definition point of f.  The example we are
197 working with above is a good case.  There are two instances of (+.sel a d),
198 but "a" is not in scope at the definition of +.sel.  Can we do anything?
199 Yes, we can "common them up", a sort of limited common sub-expression deal.
200 This would give:
201
202         g a (d::Num a) (y::a) = let +.sel@a = +.sel a d
203                                     f@a (x::a) = +.sel@a x x
204                                 in +.sel@a (f@a y) (f@a y)
205
206 This can save work, and can't be spotted by the type checker, because
207 the two instances of +.sel weren't originally at the same type.
208
209 Further notes on (b)
210
211 * There are quite a few variations here.  For example, the defn of
212   +.sel could be floated ouside the \y, to attempt to gain laziness.
213   It certainly mustn't be floated outside the \d because the d has to
214   be in scope too.
215
216 * We don't want to inline f_rhs in this case, because
217 that will duplicate code.  Just commoning up the call is the point.
218
219 * Nothing gets added to +.sel's IdInfo.
220
221 * Don't bother unless the equivalence class has more than one item!
222
223 Not clear whether this is all worth it.  It is of course OK to
224 simply discard call-instances when passing a big lambda.
225
226 Polymorphism 2 -- Overloading
227 ~~~~~~~~~~~~~~
228 Consider a function whose most general type is
229
230         f :: forall a b. Ord a => [a] -> b -> b
231
232 There is really no point in making a version of g at Int/Int and another
233 at Int/Bool, because it's only instancing the type variable "a" which
234 buys us any efficiency. Since g is completely polymorphic in b there
235 ain't much point in making separate versions of g for the different
236 b types.
237
238 That suggests that we should identify which of g's type variables
239 are constrained (like "a") and which are unconstrained (like "b").
240 Then when taking equivalence classes in STEP 2, we ignore the type args
241 corresponding to unconstrained type variable.  In STEP 3 we make
242 polymorphic versions.  Thus:
243
244         f@t1/ = /\b -> <f_rhs> t1 b d1 d2
245
246 We do this.
247
248
249 Dictionary floating
250 ~~~~~~~~~~~~~~~~~~~
251 Consider this
252
253         f a (d::Num a) = let g = ...
254                          in
255                          ...(let d1::Ord a = Num.Ord.sel a d in g a d1)...
256
257 Here, g is only called at one type, but the dictionary isn't in scope at the
258 definition point for g.  Usually the type checker would build a
259 definition for d1 which enclosed g, but the transformation system
260 might have moved d1's defn inward.  Solution: float dictionary bindings
261 outwards along with call instances.
262
263 Consider
264
265         f x = let g p q = p==q
266                   h r s = (r+s, g r s)
267               in
268               h x x
269
270
271 Before specialisation, leaving out type abstractions we have
272
273         f df x = let g :: Eq a => a -> a -> Bool
274                      g dg p q = == dg p q
275                      h :: Num a => a -> a -> (a, Bool)
276                      h dh r s = let deq = eqFromNum dh
277                                 in (+ dh r s, g deq r s)
278               in
279               h df x x
280
281 After specialising h we get a specialised version of h, like this:
282
283                     h' r s = let deq = eqFromNum df
284                              in (+ df r s, g deq r s)
285
286 But we can't naively make an instance for g from this, because deq is not in scope
287 at the defn of g.  Instead, we have to float out the (new) defn of deq
288 to widen its scope.  Notice that this floating can't be done in advance -- it only
289 shows up when specialisation is done.
290
291 User SPECIALIZE pragmas
292 ~~~~~~~~~~~~~~~~~~~~~~~
293 Specialisation pragmas can be digested by the type checker, and implemented
294 by adding extra definitions along with that of f, in the same way as before
295
296         f@t1/t2 = <f_rhs> t1 t2 d1 d2
297
298 Indeed the pragmas *have* to be dealt with by the type checker, because
299 only it knows how to build the dictionaries d1 and d2!  For example
300
301         g :: Ord a => [a] -> [a]
302         {-# SPECIALIZE f :: [Tree Int] -> [Tree Int] #-}
303
304 Here, the specialised version of g is an application of g's rhs to the
305 Ord dictionary for (Tree Int), which only the type checker can conjure
306 up.  There might not even *be* one, if (Tree Int) is not an instance of
307 Ord!  (All the other specialision has suitable dictionaries to hand
308 from actual calls.)
309
310 Problem.  The type checker doesn't have to hand a convenient <f_rhs>, because
311 it is buried in a complex (as-yet-un-desugared) binding group.
312 Maybe we should say
313
314         f@t1/t2 = f* t1 t2 d1 d2
315
316 where f* is the Id f with an IdInfo which says "inline me regardless!".
317 Indeed all the specialisation could be done in this way.
318 That in turn means that the simplifier has to be prepared to inline absolutely
319 any in-scope let-bound thing.
320
321
322 Again, the pragma should permit polymorphism in unconstrained variables:
323
324         h :: Ord a => [a] -> b -> b
325         {-# SPECIALIZE h :: [Int] -> b -> b #-}
326
327 We *insist* that all overloaded type variables are specialised to ground types,
328 (and hence there can be no context inside a SPECIALIZE pragma).
329 We *permit* unconstrained type variables to be specialised to
330         - a ground type
331         - or left as a polymorphic type variable
332 but nothing in between.  So
333
334         {-# SPECIALIZE h :: [Int] -> [c] -> [c] #-}
335
336 is *illegal*.  (It can be handled, but it adds complication, and gains the
337 programmer nothing.)
338
339
340 SPECIALISING INSTANCE DECLARATIONS
341 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
342 Consider
343
344         instance Foo a => Foo [a] where
345                 ...
346         {-# SPECIALIZE instance Foo [Int] #-}
347
348 The original instance decl creates a dictionary-function
349 definition:
350
351         dfun.Foo.List :: forall a. Foo a -> Foo [a]
352
353 The SPECIALIZE pragma just makes a specialised copy, just as for
354 ordinary function definitions:
355
356         dfun.Foo.List@Int :: Foo [Int]
357         dfun.Foo.List@Int = dfun.Foo.List Int dFooInt
358
359 The information about what instance of the dfun exist gets added to
360 the dfun's IdInfo in the same way as a user-defined function too.
361
362
363 Automatic instance decl specialisation?
364 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
365 Can instance decls be specialised automatically?  It's tricky.
366 We could collect call-instance information for each dfun, but
367 then when we specialised their bodies we'd get new call-instances
368 for ordinary functions; and when we specialised their bodies, we might get
369 new call-instances of the dfuns, and so on.  This all arises because of
370 the unrestricted mutual recursion between instance decls and value decls.
371
372 Still, there's no actual problem; it just means that we may not do all
373 the specialisation we could theoretically do.
374
375 Furthermore, instance decls are usually exported and used non-locally,
376 so we'll want to compile enough to get those specialisations done.
377
378 Lastly, there's no such thing as a local instance decl, so we can
379 survive solely by spitting out *usage* information, and then reading that
380 back in as a pragma when next compiling the file.  So for now,
381 we only specialise instance decls in response to pragmas.
382
383
384 SPITTING OUT USAGE INFORMATION
385 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
386
387 To spit out usage information we need to traverse the code collecting
388 call-instance information for all imported (non-prelude?) functions
389 and data types. Then we equivalence-class it and spit it out.
390
391 This is done at the top-level when all the call instances which escape
392 must be for imported functions and data types.
393
394 *** Not currently done ***
395
396
397 Partial specialisation by pragmas
398 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
399 What about partial specialisation:
400
401         k :: (Ord a, Eq b) => [a] -> b -> b -> [a]
402         {-# SPECIALIZE k :: Eq b => [Int] -> b -> b -> [a] #-}
403
404 or even
405
406         {-# SPECIALIZE k :: Eq b => [Int] -> [b] -> [b] -> [a] #-}
407
408 Seems quite reasonable.  Similar things could be done with instance decls:
409
410         instance (Foo a, Foo b) => Foo (a,b) where
411                 ...
412         {-# SPECIALIZE instance Foo a => Foo (a,Int) #-}
413         {-# SPECIALIZE instance Foo b => Foo (Int,b) #-}
414
415 Ho hum.  Things are complex enough without this.  I pass.
416
417
418 Requirements for the simplifer
419 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
420 The simplifier has to be able to take advantage of the specialisation.
421
422 * When the simplifier finds an application of a polymorphic f, it looks in
423 f's IdInfo in case there is a suitable instance to call instead.  This converts
424
425         f t1 t2 d1 d2   ===>   f_t1_t2
426
427 Note that the dictionaries get eaten up too!
428
429 * Dictionary selection operations on constant dictionaries must be
430   short-circuited:
431
432         +.sel Int d     ===>  +Int
433
434 The obvious way to do this is in the same way as other specialised
435 calls: +.sel has inside it some IdInfo which tells that if it's applied
436 to the type Int then it should eat a dictionary and transform to +Int.
437
438 In short, dictionary selectors need IdInfo inside them for constant
439 methods.
440
441 * Exactly the same applies if a superclass dictionary is being
442   extracted:
443
444         Eq.sel Int d   ===>   dEqInt
445
446 * Something similar applies to dictionary construction too.  Suppose
447 dfun.Eq.List is the function taking a dictionary for (Eq a) to
448 one for (Eq [a]).  Then we want
449
450         dfun.Eq.List Int d      ===> dEq.List_Int
451
452 Where does the Eq [Int] dictionary come from?  It is built in
453 response to a SPECIALIZE pragma on the Eq [a] instance decl.
454
455 In short, dfun Ids need IdInfo with a specialisation for each
456 constant instance of their instance declaration.
457
458 All this uses a single mechanism: the SpecEnv inside an Id
459
460
461 What does the specialisation IdInfo look like?
462 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
463
464 The SpecEnv of an Id maps a list of types (the template) to an expression
465
466         [Type]  |->  Expr
467
468 For example, if f has this SpecInfo:
469
470         [Int, a]  ->  \d:Ord Int. f' a
471
472 it means that we can replace the call
473
474         f Int t  ===>  (\d. f' t)
475
476 This chucks one dictionary away and proceeds with the
477 specialised version of f, namely f'.
478
479
480 What can't be done this way?
481 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
482 There is no way, post-typechecker, to get a dictionary for (say)
483 Eq a from a dictionary for Eq [a].  So if we find
484
485         ==.sel [t] d
486
487 we can't transform to
488
489         eqList (==.sel t d')
490
491 where
492         eqList :: (a->a->Bool) -> [a] -> [a] -> Bool
493
494 Of course, we currently have no way to automatically derive
495 eqList, nor to connect it to the Eq [a] instance decl, but you
496 can imagine that it might somehow be possible.  Taking advantage
497 of this is permanently ruled out.
498
499 Still, this is no great hardship, because we intend to eliminate
500 overloading altogether anyway!
501
502
503
504 A note about non-tyvar dictionaries
505 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
506 Some Ids have types like
507
508         forall a,b,c. Eq a -> Ord [a] -> tau
509
510 This seems curious at first, because we usually only have dictionary
511 args whose types are of the form (C a) where a is a type variable.
512 But this doesn't hold for the functions arising from instance decls,
513 which sometimes get arguements with types of form (C (T a)) for some
514 type constructor T.
515
516 Should we specialise wrt this compound-type dictionary?  We used to say
517 "no", saying:
518         "This is a heuristic judgement, as indeed is the fact that we 
519         specialise wrt only dictionaries.  We choose *not* to specialise
520         wrt compound dictionaries because at the moment the only place
521         they show up is in instance decls, where they are simply plugged
522         into a returned dictionary.  So nothing is gained by specialising
523         wrt them."
524
525 But it is simpler and more uniform to specialise wrt these dicts too;
526 and in future GHC is likely to support full fledged type signatures 
527 like
528         f ;: Eq [(a,b)] => ...
529
530
531 %************************************************************************
532 %*                                                                      *
533 \subsubsection{The new specialiser}
534 %*                                                                      *
535 %************************************************************************
536
537 Our basic game plan is this.  For let(rec) bound function
538         f :: (C a, D c) => (a,b,c,d) -> Bool
539
540 * Find any specialised calls of f, (f ts ds), where 
541   ts are the type arguments t1 .. t4, and
542   ds are the dictionary arguments d1 .. d2.
543
544 * Add a new definition for f1 (say):
545
546         f1 = /\ b d -> (..body of f..) t1 b t3 d d1 d2
547
548   Note that we abstract over the unconstrained type arguments.
549
550 * Add the mapping
551
552         [t1,b,t3,d]  |->  \d1 d2 -> f1 b d
553
554   to the specialisations of f.  This will be used by the
555   simplifier to replace calls 
556                 (f t1 t2 t3 t4) da db
557   by
558                 (\d1 d1 -> f1 t2 t4) da db
559
560   All the stuff about how many dictionaries to discard, and what types
561   to apply the specialised function to, are handled by the fact that the
562   SpecEnv contains a template for the result of the specialisation.
563
564 We don't build *partial* specialisations for f.  For example:
565
566   f :: Eq a => a -> a -> Bool
567   {-# SPECIALISE f :: (Eq b, Eq c) => (b,c) -> (b,c) -> Bool #-}
568
569 Here, little is gained by making a specialised copy of f.
570 There's a distinct danger that the specialised version would
571 first build a dictionary for (Eq b, Eq c), and then select the (==) 
572 method from it!  Even if it didn't, not a great deal is saved.
573
574 We do, however, generate polymorphic, but not overloaded, specialisations:
575
576   f :: Eq a => [a] -> b -> b -> b
577   {#- SPECIALISE f :: [Int] -> b -> b -> b #-}
578
579 Hence, the invariant is this: 
580
581         *** no specialised version is overloaded ***
582
583
584 %************************************************************************
585 %*                                                                      *
586 \subsubsection{The exported function}
587 %*                                                                      *
588 %************************************************************************
589
590 \begin{code}
591 specProgram :: UniqSupply -> [CoreBinding] -> [CoreBinding]
592 specProgram us binds
593   = initSM us (go binds         `thenSM` \ (binds', uds') ->
594                returnSM (dumpAllDictBinds uds' binds')
595               )
596   where
597     go []           = returnSM ([], emptyUDs)
598     go (bind:binds) = go binds          `thenSM` \ (binds', uds) ->
599                       specBind bind uds `thenSM` \ (bind', uds') ->
600                       returnSM (bind' ++ binds', uds')
601 \end{code}
602
603 %************************************************************************
604 %*                                                                      *
605 \subsubsection{@specExpr@: the main function}
606 %*                                                                      *
607 %************************************************************************
608
609 \begin{code}
610 specExpr :: CoreExpr -> SpecM (CoreExpr, UsageDetails)
611
612 ---------------- First the easy cases --------------------
613 specExpr e@(Var _)    = returnSM (e, emptyUDs)
614 specExpr e@(Lit _)    = returnSM (e, emptyUDs)
615 specExpr e@(Con _ _)  = returnSM (e, emptyUDs)
616 specExpr e@(Prim _ _) = returnSM (e, emptyUDs)
617
618 specExpr (Note note body)
619   = specExpr body       `thenSM` \ (body', uds) ->
620     returnSM (Note note body', uds)
621
622
623 ---------------- Applications might generate a call instance --------------------
624 specExpr e@(App fun arg)
625   = go fun [arg]
626   where
627     go (App fun arg) args = go fun (arg:args)
628     go (Var f)       args = returnSM (e, mkCallUDs f args)
629     go other         args = specExpr other      `thenSM` \ (e', uds) ->
630                             returnSM (foldl App e' args, uds)
631
632 ---------------- Lambda/case require dumping of usage details --------------------
633 specExpr e@(Lam _ _)
634   = specExpr body       `thenSM` \ (body', uds) ->
635     let
636         (filtered_uds, body'') = dumpUDs bndrs uds body'
637     in
638     returnSM (foldr Lam body'' bndrs, filtered_uds)
639   where
640     (bndrs, body) = go [] e
641
642         -- More efficient to collect a group of binders together all at once
643     go bndrs (Lam bndr e) = go (bndr:bndrs) e
644     go bndrs e            = (reverse bndrs, e)
645
646
647 specExpr (Case scrut alts)
648   = specExpr scrut      `thenSM` \ (scrut', uds_scrut) ->
649     spec_alts alts      `thenSM` \ (alts', uds_alts) ->
650     returnSM (Case scrut' alts', uds_scrut `plusUDs` uds_alts)
651   where
652     spec_alts (AlgAlts alts deflt)
653         = mapAndCombineSM spec_alg_alt alts     `thenSM` \ (alts', uds1) ->
654           spec_deflt deflt                      `thenSM` \ (deflt', uds2) ->
655           returnSM (AlgAlts alts' deflt', uds1 `plusUDs` uds2)
656
657     spec_alts (PrimAlts alts deflt)
658         = mapAndCombineSM spec_prim_alt alts    `thenSM` \ (alts', uds1) ->
659           spec_deflt deflt                      `thenSM` \ (deflt', uds2) ->
660           returnSM (PrimAlts alts' deflt', uds1 `plusUDs` uds2)
661
662     spec_alg_alt (con, args, rhs)
663         = specExpr rhs          `thenSM` \ (rhs', uds) ->
664           let
665              (uds', rhs'') = dumpUDs (map ValBinder args) uds rhs'
666           in
667           returnSM ((con, args, rhs''), uds')
668
669     spec_prim_alt (lit, rhs)
670         = specExpr rhs          `thenSM` \ (rhs', uds) ->
671           returnSM ((lit, rhs'), uds)
672
673     spec_deflt NoDefault = returnSM (NoDefault, emptyUDs)
674     spec_deflt (BindDefault arg rhs)
675         = specExpr rhs          `thenSM` \ (rhs', uds) ->
676           let
677              (uds', rhs'') = dumpUDs [ValBinder arg] uds rhs'
678           in
679           returnSM (BindDefault arg rhs'', uds')
680
681 ---------------- Finally, let is the interesting case --------------------
682 specExpr (Let bind body)
683   =     -- Deal with the body
684     specExpr body                               `thenSM` \ (body', body_uds) ->
685
686         -- Deal with the bindings
687     specBind bind body_uds                      `thenSM` \ (binds', uds) ->
688
689         -- All done
690     returnSM (foldr Let body' binds', uds)
691 \end{code}
692
693 %************************************************************************
694 %*                                                                      *
695 \subsubsection{Dealing with a binding}
696 %*                                                                      *
697 %************************************************************************
698
699 \begin{code}
700 specBind :: CoreBinding
701          -> UsageDetails                -- Info on how the scope of the binding
702          -> SpecM ([CoreBinding],       -- New bindings
703                    UsageDetails)        -- And info to pass upstream
704
705 specBind (NonRec bndr rhs) body_uds
706   | isDictTy (idType bndr)
707   =     -- It's a dictionary binding
708         -- Pick it up and float it outwards.
709     specExpr rhs                                `thenSM` \ (rhs', rhs_uds) ->
710     let
711         all_uds = rhs_uds `plusUDs` addDictBind body_uds bndr rhs'
712     in
713     returnSM ([], all_uds)
714
715   | isSpecPragmaId bndr
716   = specExpr rhs                                `thenSM` \ (rhs', rhs_uds) ->
717     returnSM ([], rhs_uds `plusUDs` body_uds)
718
719   | otherwise
720   =   -- Deal with the RHS, specialising it according
721       -- to the calls found in the body
722     specDefn (calls body_uds) (bndr,rhs)        `thenSM` \ ((bndr',rhs'), spec_defns, spec_uds) ->
723     let
724         (all_uds, (dict_binds, dump_calls)) 
725                 = splitUDs [ValBinder bndr]
726                            (body_uds `plusUDs` spec_uds)
727                         -- It's important that the `plusUDs` is this way round,
728                         -- because body_uds may bind dictionaries that are
729                         -- used in the calls passed to specDefn.  So the
730                         -- dictionary bindings in spec_uds may mention 
731                         -- dictionaries bound in body_uds.
732
733         -- If we make specialisations then we Rec the whole lot together
734         -- If not, leave it as a NonRec
735         new_bind | null spec_defns = NonRec bndr' rhs'
736                  | otherwise       = Rec ((bndr',rhs'):spec_defns)
737     in
738     returnSM ( new_bind : mkDictBinds dict_binds, all_uds )
739
740 specBind (Rec pairs) body_uds
741   = mapSM (specDefn (calls body_uds)) pairs     `thenSM` \ stuff ->
742     let
743         (pairs', spec_defns_s, spec_uds_s) = unzip3 stuff
744         spec_defns = concat spec_defns_s
745         spec_uds   = plusUDList spec_uds_s
746
747         (all_uds, (dict_binds, dump_calls)) 
748                 = splitUDs (map (ValBinder . fst) pairs)
749                            (body_uds `plusUDs` spec_uds)
750                         -- See notes for non-rec case
751
752         new_bind = Rec (spec_defns ++ pairs')
753     in
754     returnSM (  new_bind : mkDictBinds dict_binds, all_uds )
755     
756 specDefn :: CallDetails                 -- Info on how it is used in its scope
757          -> (Id, CoreExpr)              -- The thing being bound and its un-processed RHS
758          -> SpecM ((Id, CoreExpr),      -- The thing and its processed RHS
759                                         --      the Id may now have specialisations attached
760                    [(Id,CoreExpr)],     -- Extra, specialised bindings
761                    UsageDetails         -- Stuff to fling upwards from the RHS and its
762             )                           --      specialised versions
763
764 specDefn calls (fn, rhs)
765         -- The first case is the interesting one
766   |  n_tyvars == length rhs_tyvars      -- Rhs of fn's defn has right number of big lambdas
767   && n_dicts  <= length rhs_bndrs       -- and enough dict args
768   && not (null calls_for_me)            -- And there are some calls to specialise
769   =   -- Specialise the body of the function
770     specExpr body                                       `thenSM` \ (body', body_uds) ->
771     let
772         (float_uds, bound_uds@(dict_binds,_)) = splitUDs rhs_bndrs body_uds
773     in
774
775       -- Make a specialised version for each call in calls_for_me
776     mapSM (spec_call bound_uds) calls_for_me            `thenSM` \ stuff ->
777     let
778         (spec_defns, spec_uds, spec_env_stuff) = unzip3 stuff
779
780         fn'  = addIdSpecialisations fn spec_env_stuff
781         rhs' = foldr Lam (mkDictLets dict_binds body') rhs_bndrs 
782     in
783     returnSM ((fn',rhs'), 
784               spec_defns, 
785               float_uds `plusUDs` plusUDList spec_uds)
786
787   | otherwise   -- No calls or RHS doesn't fit our preconceptions
788   = specExpr rhs                        `thenSM` \ (rhs', rhs_uds) ->
789     returnSM ((fn, rhs'), [], rhs_uds)
790   
791   where
792     fn_type              = idType fn
793     (tyvars, theta, tau) = splitSigmaTy fn_type
794     n_tyvars             = length tyvars
795     n_dicts              = length theta
796
797     (rhs_tyvars, rhs_ids, rhs_body) = collectBinders rhs
798     rhs_dicts = take n_dicts rhs_ids
799     rhs_bndrs = map TyBinder rhs_tyvars ++ map ValBinder rhs_dicts
800     body      = mkValLam (drop n_dicts rhs_ids) rhs_body
801                 -- Glue back on the non-dict lambdas
802
803     calls_for_me = case lookupFM calls fn of
804                         Nothing -> []
805                         Just cs -> fmToList cs
806
807     ----------------------------------------------------------
808         -- Specialise to one particular call pattern
809     spec_call :: ProtoUsageDetails          -- From the original body, captured by
810                                             -- the dictionary lambdas
811               -> ([Maybe Type], [DictVar])  -- Call instance
812               -> SpecM ((Id,CoreExpr),            -- Specialised definition
813                         UsageDetails,             -- Usage details from specialised body
814                         ([TyVar], [Type], CoreExpr))       -- Info for the Id's SpecEnv
815     spec_call bound_uds (call_ts, call_ds)
816       = ASSERT( length call_ts == n_tyvars && length call_ds == n_dicts )
817                 -- Calls are only recorded for properly-saturated applications
818         
819         -- Supppose the call is for f [Just t1, Nothing, Just t3, Nothing] [d1, d2]
820
821                 -- Construct the new binding
822                 --      f1 = /\ b d -> (..rhs of f..) t1 b t3 d d1 d2
823                 -- and the type of this binder
824         let
825           mk_spec_ty Nothing   = newTyVarSM   `thenSM` \ tyvar ->
826                                  returnSM (Just tyvar, mkTyVarTy tyvar)
827           mk_spec_ty (Just ty) = returnSM (Nothing,    ty)
828         in
829         mapSM mk_spec_ty call_ts   `thenSM` \ stuff ->
830         let
831            (maybe_spec_tyvars, spec_tys) = unzip stuff
832            spec_tyvars = catMaybes maybe_spec_tyvars
833            spec_rhs    = mkTyLam spec_tyvars $
834                          mkGenApp rhs (map TyArg spec_tys ++ map VarArg call_ds)
835            spec_id_ty  = mkForAllTys spec_tyvars (instantiateTy ty_env tau)
836            ty_env      = mkTyVarEnv (zipEqual "spec_call" tyvars spec_tys)
837         in
838
839         newIdSM fn spec_id_ty           `thenSM` \ spec_f ->
840
841
842                 -- Construct the stuff for f's spec env
843                 --      [b,d] [t1,b,t3,d]  |->  \d1 d2 -> f1 b d
844                 -- The only awkward bit is that d1,d2 might well be global
845                 -- dictionaries, so it's tidier to make new local variables
846                 -- for the lambdas in the RHS, rather than lambda-bind the
847                 -- dictionaries themselves.
848                 --
849                 -- In fact we use the standard template locals, so that the
850                 -- they don't need to be "tidied" before putting in interface files
851         let
852            arg_ds        = mkTemplateLocals (map idType call_ds)
853            spec_env_rhs  = mkValLam arg_ds $
854                            mkTyApp (Var spec_f) $
855                            map mkTyVarTy spec_tyvars
856            spec_env_info = (spec_tyvars, spec_tys, spec_env_rhs)
857         in
858
859                 -- Specialise the UDs from f's RHS
860         let
861                 -- Only the overloaded tyvars should be free in the uds
862            ty_env   = [ (rhs_tyvar,ty) 
863                       | (rhs_tyvar, Just ty) <- zipEqual "specUDs1" rhs_tyvars call_ts
864                       ]
865            dict_env = zipEqual "specUDs2" rhs_dicts call_ds
866         in
867         specUDs ty_env dict_env bound_uds                       `thenSM` \ spec_uds ->
868
869         returnSM ((spec_f, spec_rhs),
870                   spec_uds,
871                   spec_env_info
872         )
873 \end{code}
874
875 %************************************************************************
876 %*                                                                      *
877 \subsubsection{UsageDetails and suchlike}
878 %*                                                                      *
879 %************************************************************************
880
881 \begin{code}
882 type FreeDicts = IdSet
883
884 data UsageDetails 
885   = MkUD {
886         dict_binds :: !(Bag DictBind),
887                         -- Floated dictionary bindings
888                         -- The order is important; 
889                         -- in ds1 `union` ds2, bindings in ds2 can depend on those in ds1
890                         -- (Remember, Bags preserve order in GHC.)
891                         -- The FreeDicts is the free vars of the RHS
892
893         calls     :: !CallDetails
894     }
895
896 type DictBind = (DictVar, CoreExpr, TyVarSet, FreeDicts)
897                         -- The FreeDicts are the free dictionaries (only)
898                         -- of the RHS of the dictionary bindings
899                         -- Similarly the TyVarSet
900
901 emptyUDs = MkUD { dict_binds = emptyBag, calls = emptyFM }
902
903 type ProtoUsageDetails = ([DictBind],
904                           [(Id, [Maybe Type], [DictVar])]
905                          )
906
907 ------------------------------------------------------------                    
908 type CallDetails  = FiniteMap Id CallInfo
909 type CallInfo     = FiniteMap [Maybe Type]      -- Nothing => unconstrained type argument
910                               [DictVar]         -- Dict args
911         -- The finite maps eliminate duplicates
912         -- The list of types and dictionaries is guaranteed to
913         -- match the type of f
914
915 callDetailsToList calls = [ (id,tys,dicts)
916                           | (id,fm) <- fmToList calls,
917                             (tys,dicts) <- fmToList fm
918                           ]
919
920 listToCallDetails calls  = foldr (unionCalls . singleCall) emptyFM calls
921
922 unionCalls :: CallDetails -> CallDetails -> CallDetails
923 unionCalls c1 c2 = plusFM_C plusFM c1 c2
924
925 singleCall (id, tys, dicts) = unitFM id (unitFM tys dicts)
926
927 mkCallUDs f args 
928   | null theta
929   || length spec_tys /= n_tyvars
930   || length dicts    /= n_dicts
931   = emptyUDs    -- Not overloaded
932
933   | otherwise
934   = MkUD {dict_binds = emptyBag, 
935           calls = singleCall (f, spec_tys, dicts)
936     }
937   where
938     (tyvars, theta, tau) = splitSigmaTy (idType f)
939     constrained_tyvars   = foldr (unionTyVarSets . tyVarsOfTypes . snd) emptyTyVarSet theta 
940     n_tyvars             = length tyvars
941     n_dicts              = length theta
942
943     spec_tys = [mk_spec_ty tv ty | (tv, TyArg ty) <- tyvars `zip` args]
944     dicts    = [d | (_, VarArg d) <- theta `zip` (drop n_tyvars args)]
945     
946     mk_spec_ty tyvar ty | tyvar `elementOfTyVarSet` constrained_tyvars
947                         = Just ty
948                         | otherwise
949                         = Nothing
950
951 ------------------------------------------------------------                    
952 plusUDs :: UsageDetails -> UsageDetails -> UsageDetails
953 plusUDs (MkUD {dict_binds = db1, calls = calls1})
954         (MkUD {dict_binds = db2, calls = calls2})
955   = MkUD {dict_binds, calls}
956   where
957     dict_binds = db1    `unionBags`   db2 
958     calls      = calls1 `unionCalls`  calls2
959
960 plusUDList = foldr plusUDs emptyUDs
961
962 mkDB dict rhs = (dict, rhs, db_ftvs, db_fvs)
963               where
964                 db_ftvs = tyVarsOfType (idType dict)    -- Superset of RHS fvs
965                 db_fvs  = dictRhsFVs rhs
966
967 addDictBind uds dict rhs = uds { dict_binds = mkDB dict rhs `consBag` dict_binds uds }
968
969 dumpAllDictBinds (MkUD {dict_binds = dbs}) binds
970   = foldrBag add binds dbs
971   where
972     add (dict,rhs,_,_) binds = NonRec dict rhs : binds
973
974 mkDictBinds :: [DictBind] -> [CoreBinding]
975 mkDictBinds = map (\(d,r,_,_) -> NonRec d r)
976
977 mkDictLets :: [DictBind] -> CoreExpr -> CoreExpr
978 mkDictLets dbs body = foldr mk body dbs
979                     where
980                       mk (d,r,_,_) e = Let (NonRec d r) e 
981
982 dumpUDs :: [CoreBinder]
983         -> UsageDetails -> CoreExpr
984         -> (UsageDetails, CoreExpr)
985 dumpUDs bndrs uds body
986   = (free_uds, mkDictLets dict_binds body)
987   where
988     (free_uds, (dict_binds, _)) = splitUDs bndrs uds
989
990 splitUDs :: [CoreBinder]
991          -> UsageDetails
992          -> (UsageDetails,              -- These don't mention the binders
993              ProtoUsageDetails)         -- These do
994              
995 splitUDs bndrs uds@(MkUD {dict_binds = orig_dbs, 
996                           calls      = orig_calls})
997
998   = if isEmptyBag dump_dbs && null dump_calls then
999         -- Common case: binder doesn't affect floats
1000         (uds, ([],[]))  
1001
1002     else
1003         -- Binders bind some of the fvs of the floats
1004         (MkUD {dict_binds = free_dbs, 
1005                calls      = listToCallDetails free_calls},
1006          (bagToList dump_dbs, dump_calls)
1007         )
1008
1009   where
1010     tyvar_set    = mkTyVarSet [tv | TyBinder tv <- bndrs]
1011     id_set       = mkIdSet    [id | ValBinder id <- bndrs]
1012
1013     (free_dbs, dump_dbs, dump_idset) 
1014           = foldlBag dump_db (emptyBag, emptyBag, id_set) orig_dbs
1015                 -- Important that it's foldl not foldr;
1016                 -- we're accumulating the set of dumped ids in dump_set
1017
1018         -- Filter out any calls that mention things that are being dumped
1019         -- Don't need to worry about the tyvars because the dicts will
1020         -- spot the captured ones; any fully polymorphic arguments will
1021         -- be Nothings in the call details
1022     orig_call_list = callDetailsToList orig_calls
1023     (dump_calls, free_calls) = partition captured orig_call_list
1024     captured (id,tys,dicts)  = any (`elementOfIdSet` dump_idset) (id:dicts)
1025
1026     dump_db (free_dbs, dump_dbs, dump_idset) db@(dict, rhs, ftvs, fvs)
1027         |  isEmptyIdSet    (dump_idset `intersectIdSets`    fvs)
1028         && isEmptyTyVarSet (tyvar_set  `intersectTyVarSets` ftvs)
1029         = (free_dbs `snocBag` db, dump_dbs, dump_idset)
1030
1031         | otherwise     -- Dump it
1032         = (free_dbs, dump_dbs `snocBag` db,
1033            dump_idset `addOneToIdSet` dict)
1034 \end{code}
1035
1036 Given a type and value substitution, specUDs creates a specialised copy of
1037 the given UDs
1038
1039 \begin{code}
1040 specUDs :: [(TyVar,Type)] -> [(DictVar,DictVar)] -> ProtoUsageDetails -> SpecM UsageDetails
1041 specUDs tv_env_list dict_env_list (dbs, calls)
1042   = specDBs dict_env_list dbs           `thenSM` \ (dict_env_list', dbs') ->
1043     let
1044         dict_env = mkIdEnv dict_env_list'
1045     in
1046     returnSM (MkUD { dict_binds = dbs',
1047                      calls      = listToCallDetails (map (inst_call dict_env) calls)
1048     })
1049   where
1050     bound_tyvars = mkTyVarSet (map fst tv_env_list)
1051     tv_env   = mkTyVarEnv tv_env_list   -- Doesn't change
1052
1053     inst_call dict_env (id, tys, dicts) = (id, map inst_maybe_ty tys, 
1054                                                map (lookupId dict_env) dicts)
1055
1056     inst_maybe_ty Nothing   = Nothing
1057     inst_maybe_ty (Just ty) = Just (instantiateTy tv_env ty)
1058
1059     specDBs dict_env []
1060         = returnSM (dict_env, emptyBag)
1061     specDBs dict_env ((dict, rhs, ftvs, fvs) : dbs)
1062         = newIdSM dict (instantiateTy tv_env (idType dict))     `thenSM` \ dict' ->
1063           let
1064             rhs'      = foldl App (foldr Lam rhs (t_bndrs ++ d_bndrs)) (t_args ++ d_args)
1065             (t_bndrs, t_args) = unzip [(TyBinder tv, TyArg ty)  | (tv,ty) <- tv_env_list,
1066                                                                    tv `elementOfTyVarSet` ftvs]
1067             (d_bndrs, d_args) = unzip [(ValBinder d, VarArg d') | (d,d')  <- dict_env,
1068                                                                    d `elementOfIdSet` fvs]
1069             dict_env' = (dict,dict') : dict_env
1070             ftvs' = tyVarsOfTypes [ty | TyArg ty <- t_args] `unionTyVarSets`
1071                     (ftvs `minusTyVarSet` bound_tyvars)
1072             fvs'  = mkIdSet [d | VarArg d <- d_args] `unionIdSets`
1073                     (fvs `minusIdSet` mkIdSet [d | ValBinder d <- d_bndrs])
1074           in
1075           specDBs dict_env' dbs         `thenSM` \ (dict_env'', dbs') ->
1076           returnSM ( dict_env'', (dict', rhs', ftvs', fvs') `consBag` dbs' )
1077 \end{code}
1078
1079 %************************************************************************
1080 %*                                                                      *
1081 \subsubsection{Boring helper functions}
1082 %*                                                                      *
1083 %************************************************************************
1084
1085 \begin{code}
1086 lookupId:: IdEnv Id -> Id -> Id
1087 lookupId env id = case lookupIdEnv env id of
1088                         Nothing  -> id
1089                         Just id' -> id'
1090
1091 dictRhsFVs :: CoreExpr -> IdSet
1092 dictRhsFVs e = exprFreeVars isLocallyDefined e
1093
1094 addIdSpecialisations id spec_stuff
1095   = (if not (null errs) then
1096         pprTrace "Duplicate specialisations" (vcat (map ppr errs))
1097      else \x -> x
1098     )
1099     setIdSpecialisation id new_spec_env
1100   where
1101     (new_spec_env, errs) = foldr add (getIdSpecialisation id, []) spec_stuff
1102
1103     add (tyvars, tys, template) (spec_env, errs)
1104         = case addToSpecEnv True spec_env tyvars tys template of
1105                 Succeeded spec_env' -> (spec_env', errs)
1106                 Failed err          -> (spec_env, err:errs)
1107
1108 -- Given an Id, isSpecVars returns all its specialisations.
1109 -- We extract these from its SpecEnv.
1110 -- This is used by the occurrence analyser and free-var finder;
1111 -- we regard an Id's specialisations as free in the Id's definition.
1112
1113 idSpecVars :: Id -> [Id]
1114 idSpecVars id 
1115   = map get_spec (specEnvValues (getIdSpecialisation id))
1116   where
1117     -- get_spec is another cheapo function like dictRhsFVs
1118     -- It knows what these specialisation temlates look like,
1119     -- and just goes for the jugular
1120     get_spec (App f _) = get_spec f
1121     get_spec (Lam _ b) = get_spec b
1122     get_spec (Var v)   = v
1123
1124 ----------------------------------------
1125 type SpecM a = UniqSM a
1126
1127 thenSM    = thenUs
1128 returnSM  = returnUs
1129 getUniqSM = getUnique
1130 mapSM     = mapUs
1131 initSM    = initUs
1132
1133 mapAndCombineSM f []     = returnSM ([], emptyUDs)
1134 mapAndCombineSM f (x:xs) = f x  `thenSM` \ (y, uds1) ->
1135                            mapAndCombineSM f xs `thenSM` \ (ys, uds2) ->
1136                            returnSM (y:ys, uds1 `plusUDs` uds2)
1137
1138 newIdSM old_id new_ty
1139   = getUnique           `thenSM` \ uniq ->
1140     returnSM (mkUserLocal (getOccName old_id) 
1141                           uniq
1142                           new_ty
1143                           (getSrcLoc old_id)
1144     )
1145
1146 newTyVarSM
1147   = getUnique           `thenSM` \ uniq ->
1148     returnSM (mkSysTyVar uniq mkBoxedTypeKind)
1149 \end{code}
1150
1151
1152                 Old (but interesting) stuff about unboxed bindings
1153                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1154
1155 What should we do when a value is specialised to a *strict* unboxed value?
1156
1157         map_*_* f (x:xs) = let h = f x
1158                                t = map f xs
1159                            in h:t
1160
1161 Could convert let to case:
1162
1163         map_*_Int# f (x:xs) = case f x of h# ->
1164                               let t = map f xs
1165                               in h#:t
1166
1167 This may be undesirable since it forces evaluation here, but the value
1168 may not be used in all branches of the body. In the general case this
1169 transformation is impossible since the mutual recursion in a letrec
1170 cannot be expressed as a case.
1171
1172 There is also a problem with top-level unboxed values, since our
1173 implementation cannot handle unboxed values at the top level.
1174
1175 Solution: Lift the binding of the unboxed value and extract it when it
1176 is used:
1177
1178         map_*_Int# f (x:xs) = let h = case (f x) of h# -> _Lift h#
1179                                   t = map f xs
1180                               in case h of
1181                                  _Lift h# -> h#:t
1182
1183 Now give it to the simplifier and the _Lifting will be optimised away.
1184
1185 The benfit is that we have given the specialised "unboxed" values a
1186 very simplep lifted semantics and then leave it up to the simplifier to
1187 optimise it --- knowing that the overheads will be removed in nearly
1188 all cases.
1189
1190 In particular, the value will only be evaluted in the branches of the
1191 program which use it, rather than being forced at the point where the
1192 value is bound. For example:
1193
1194         filtermap_*_* p f (x:xs)
1195           = let h = f x
1196                 t = ...
1197             in case p x of
1198                 True  -> h:t
1199                 False -> t
1200    ==>
1201         filtermap_*_Int# p f (x:xs)
1202           = let h = case (f x) of h# -> _Lift h#
1203                 t = ...
1204             in case p x of
1205                 True  -> case h of _Lift h#
1206                            -> h#:t
1207                 False -> t
1208
1209 The binding for h can still be inlined in the one branch and the
1210 _Lifting eliminated.
1211
1212
1213 Question: When won't the _Lifting be eliminated?
1214
1215 Answer: When they at the top-level (where it is necessary) or when
1216 inlining would duplicate work (or possibly code depending on
1217 options). However, the _Lifting will still be eliminated if the
1218 strictness analyser deems the lifted binding strict.
1219