80ecd77ea2cbece63353b800ae62473a09804fcc
[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 #include "HsVersions.h"
8
9 module Specialise (
10         specProgram,
11         initSpecData,
12
13         SpecialiseData(..)
14     ) where
15
16 IMP_Ubiq(){-uitous-}
17 IMPORT_1_3(List(partition))
18
19 import Bag              ( emptyBag, unitBag, isEmptyBag, unionBags,
20                           partitionBag, listToBag, bagToList
21                         )
22 import Class            ( GenClass{-instance Eq-} )
23 import CmdLineOpts      ( opt_SpecialiseImports, opt_D_simplifier_stats,
24                           opt_CompilingGhcInternals, opt_SpecialiseTrace,
25                           opt_SpecialiseOverloaded, opt_SpecialiseUnboxed,
26                           opt_SpecialiseAll
27                         )
28 import CoreLift         ( mkLiftedId, liftExpr, bindUnlift, applyBindUnlifts )
29 import CoreSyn
30 import CoreUtils        ( coreExprType, squashableDictishCcExpr )
31 import FiniteMap        ( addListToFM_C, FiniteMap )
32 import Kind             ( mkBoxedTypeKind )
33 import Id               ( idType, isDefaultMethodId_maybe, toplevelishId,
34                           isSuperDictSelId_maybe, isBottomingId,
35                           isConstMethodId_maybe, isDataCon,
36                           isImportedId, mkIdWithNewUniq,
37                           dataConTyCon, applyTypeEnvToId,
38                           nullIdEnv, addOneToIdEnv, growIdEnvList,
39                           lookupIdEnv, SYN_IE(IdEnv),
40                           emptyIdSet, mkIdSet, unitIdSet,
41                           elementOfIdSet, minusIdSet,
42                           unionIdSets, unionManyIdSets, SYN_IE(IdSet),
43                           GenId{-instance Eq-}
44                         )
45 import Literal          ( Literal{-instance Outputable-} )
46 import Maybes           ( catMaybes, firstJust, maybeToBool )
47 import Name             ( isLocallyDefined )
48 import Outputable       ( interppSP, Outputable(..){-instance * []-} )
49 import PprStyle         ( PprStyle(..) )
50 import PprType          ( pprGenType, pprParendGenType, pprMaybeTy,
51                           GenType{-instance Outputable-}, GenTyVar{-ditto-},
52                           TyCon{-ditto-}
53                         )
54 import Pretty           ( ppHang, ppCat, ppStr, ppAboves, ppBesides,
55                           ppInt, ppSP, ppInterleave, ppNil, SYN_IE(Pretty)
56                         )
57 import PrimOp           ( PrimOp(..) )
58 import SpecUtils
59 import Type             ( mkTyVarTy, mkTyVarTys, isTyVarTy, getAppDataTyConExpandingDicts,
60                           tyVarsOfTypes, applyTypeEnvToTy, isUnboxedType, isDictTy
61                         )
62 import TyCon            ( TyCon{-instance Eq-} )
63 import TyVar            ( cloneTyVar, mkSysTyVar,
64                           elementOfTyVarSet, SYN_IE(TyVarSet),
65                           nullTyVarEnv, growTyVarEnvList, SYN_IE(TyVarEnv),
66                           GenTyVar{-instance Eq-}
67                         )
68 import TysWiredIn       ( liftDataCon )
69 import Unique           ( Unique{-instance Eq-} )
70 import UniqSet          ( mkUniqSet, unionUniqSets, uniqSetToList )
71 import UniqSupply       ( splitUniqSupply, getUniques, getUnique )
72 import Util             ( equivClasses, mapAccumL, assoc, zipEqual, zipWithEqual,
73                           thenCmp, panic, pprTrace, pprPanic, assertPanic
74                         )
75
76 infixr 9 `thenSM`
77
78 --ToDo:kill
79 data SpecInfo = SpecInfo [Maybe Type] Int Id
80 lookupSpecEnv = panic "Specialise.lookupSpecEnv (ToDo)"
81 addIdSpecialisation = panic "Specialise.addIdSpecialisation (ToDo)"
82 cmpUniTypeMaybeList = panic "Specialise.cmpUniTypeMaybeList (ToDo)"
83 getIdSpecialisation = panic "Specialise.getIdSpecialisation (ToDo)"
84 isClassOpId = panic "Specialise.isClassOpId (ToDo)"
85 isLocalGenTyCon = panic "Specialise.isLocalGenTyCon (ToDo)"
86 isLocalSpecTyCon = panic "Specialise.isLocalSpecTyCon (ToDo)"
87 isSpecId_maybe = panic "Specialise.isSpecId_maybe (ToDo)"
88 isSpecPragmaId_maybe = panic "Specialise.isSpecPragmaId_maybe (ToDo)"
89 lookupClassInstAtSimpleType = panic "Specialise.lookupClassInstAtSimpleType (ToDo)"
90 mkSpecEnv = panic "Specialise.mkSpecEnv (ToDo)"
91 mkSpecId = panic "Specialise.mkSpecId (ToDo)"
92 selectIdInfoForSpecId = panic "Specialise.selectIdInfoForSpecId (ToDo)"
93 specialiseTy = panic "Specialise.specialiseTy (ToDo)"
94 \end{code}
95
96 %************************************************************************
97 %*                                                                      *
98 \subsection[notes-Specialise]{Implementation notes [SLPJ, Aug 18 1993]}
99 %*                                                                      *
100 %************************************************************************
101
102 These notes describe how we implement specialisation to eliminate
103 overloading, and optionally to eliminate unboxed polymorphism, and
104 full polymorphism.
105
106 The specialisation pass is a partial evaluator which works on Core
107 syntax, complete with all the explicit dictionary application,
108 abstraction and construction as added by the type checker.  The
109 existing type checker remains largely as it is.
110
111 One important thought: the {\em types} passed to an overloaded
112 function, and the {\em dictionaries} passed are mutually redundant.
113 If the same function is applied to the same type(s) then it is sure to
114 be applied to the same dictionary(s)---or rather to the same {\em
115 values}.  (The arguments might look different but they will evaluate
116 to the same value.)
117
118 Second important thought: we know that we can make progress by
119 treating dictionary arguments as static and worth specialising on.  So
120 we can do without binding-time analysis, and instead specialise on
121 dictionary arguments and no others.
122
123 The basic idea
124 ~~~~~~~~~~~~~~
125 Suppose we have
126
127         let f = <f_rhs>
128         in <body>
129
130 and suppose f is overloaded.
131
132 STEP 1: CALL-INSTANCE COLLECTION
133
134 We traverse <body>, accumulating all applications of f to types and
135 dictionaries.
136
137 (Might there be partial applications, to just some of its types and
138 dictionaries?  In principle yes, but in practice the type checker only
139 builds applications of f to all its types and dictionaries, so partial
140 applications could only arise as a result of transformation, and even
141 then I think it's unlikely.  In any case, we simply don't accumulate such
142 partial applications.)
143
144 There's a choice of whether to collect details of all *polymorphic* functions
145 or simply all *overloaded* ones.  How to sort this out?
146   Pass in a predicate on the function to say if it is "interesting"?
147   This is dependent on the user flags: SpecialiseOverloaded
148                                        SpecialiseUnboxed
149                                        SpecialiseAll
150
151 STEP 2: EQUIVALENCES
152
153 So now we have a collection of calls to f:
154         f t1 t2 d1 d2
155         f t3 t4 d3 d4
156         ...
157 Notice that f may take several type arguments.  To avoid ambiguity, we
158 say that f is called at type t1/t2 and t3/t4.
159
160 We take equivalence classes using equality of the *types* (ignoring
161 the dictionary args, which as mentioned previously are redundant).
162
163 STEP 3: SPECIALISATION
164
165 For each equivalence class, choose a representative (f t1 t2 d1 d2),
166 and create a local instance of f, defined thus:
167
168         f@t1/t2 = <f_rhs> t1 t2 d1 d2
169
170 (f_rhs presumably has some big lambdas and dictionary lambdas, so lots
171 of simplification will now result.)  Then we should recursively do
172 everything again.
173
174 The new id has its own unique, but its print-name (if exported) has
175 an explicit representation of the instance types t1/t2.
176
177 Add this new id to f's IdInfo, to record that f has a specialised version.
178
179 Before doing any of this, check that f's IdInfo doesn't already
180 tell us about an existing instance of f at the required type/s.
181 (This might happen if specialisation was applied more than once, or
182 it might arise from user SPECIALIZE pragmas.)
183
184 Recursion
185 ~~~~~~~~~
186 Wait a minute!  What if f is recursive?  Then we can't just plug in
187 its right-hand side, can we?
188
189 But it's ok.  The type checker *always* creates non-recursive definitions
190 for overloaded recursive functions.  For example:
191
192         f x = f (x+x)           -- Yes I know its silly
193
194 becomes
195
196         f a (d::Num a) = let p = +.sel a d
197                          in
198                          letrec fl (y::a) = fl (p y y)
199                          in
200                          fl
201
202 We still have recusion for non-overloadd functions which we
203 speciailise, but the recursive call should get speciailised to the
204 same recursive version.
205
206
207 Polymorphism 1
208 ~~~~~~~~~~~~~~
209
210 All this is crystal clear when the function is applied to *constant
211 types*; that is, types which have no type variables inside.  But what if
212 it is applied to non-constant types?  Suppose we find a call of f at type
213 t1/t2.  There are two possibilities:
214
215 (a) The free type variables of t1, t2 are in scope at the definition point
216 of f.  In this case there's no problem, we proceed just as before.  A common
217 example is as follows.  Here's the Haskell:
218
219         g y = let f x = x+x
220               in f y + f y
221
222 After typechecking we have
223
224         g a (d::Num a) (y::a) = let f b (d'::Num b) (x::b) = +.sel b d' x x
225                                 in +.sel a d (f a d y) (f a d y)
226
227 Notice that the call to f is at type type "a"; a non-constant type.
228 Both calls to f are at the same type, so we can specialise to give:
229
230         g a (d::Num a) (y::a) = let f@a (x::a) = +.sel a d x x
231                                 in +.sel a d (f@a y) (f@a y)
232
233
234 (b) The other case is when the type variables in the instance types
235 are *not* in scope at the definition point of f.  The example we are
236 working with above is a good case.  There are two instances of (+.sel a d),
237 but "a" is not in scope at the definition of +.sel.  Can we do anything?
238 Yes, we can "common them up", a sort of limited common sub-expression deal.
239 This would give:
240
241         g a (d::Num a) (y::a) = let +.sel@a = +.sel a d
242                                     f@a (x::a) = +.sel@a x x
243                                 in +.sel@a (f@a y) (f@a y)
244
245 This can save work, and can't be spotted by the type checker, because
246 the two instances of +.sel weren't originally at the same type.
247
248 Further notes on (b)
249
250 * There are quite a few variations here.  For example, the defn of
251   +.sel could be floated ouside the \y, to attempt to gain laziness.
252   It certainly mustn't be floated outside the \d because the d has to
253   be in scope too.
254
255 * We don't want to inline f_rhs in this case, because
256 that will duplicate code.  Just commoning up the call is the point.
257
258 * Nothing gets added to +.sel's IdInfo.
259
260 * Don't bother unless the equivalence class has more than one item!
261
262 Not clear whether this is all worth it.  It is of course OK to
263 simply discard call-instances when passing a big lambda.
264
265 Polymorphism 2 -- Overloading
266 ~~~~~~~~~~~~~~
267 Consider a function whose most general type is
268
269         f :: forall a b. Ord a => [a] -> b -> b
270
271 There is really no point in making a version of g at Int/Int and another
272 at Int/Bool, because it's only instancing the type variable "a" which
273 buys us any efficiency. Since g is completely polymorphic in b there
274 ain't much point in making separate versions of g for the different
275 b types.
276
277 That suggests that we should identify which of g's type variables
278 are constrained (like "a") and which are unconstrained (like "b").
279 Then when taking equivalence classes in STEP 2, we ignore the type args
280 corresponding to unconstrained type variable.  In STEP 3 we make
281 polymorphic versions.  Thus:
282
283         f@t1/ = /\b -> <f_rhs> t1 b d1 d2
284
285 This seems pretty simple, and a Good Thing.
286
287 Polymorphism 3 -- Unboxed
288 ~~~~~~~~~~~~~~
289
290 If we are speciailising at unboxed types we must speciailise
291 regardless of the overloading constraint.  In the exaple above it is
292 worth speciailising at types Int/Int#, Int/Bool# and a/Int#, Int#/Int#
293 etc.
294
295 Note that specialising an overloaded type at an uboxed type requires
296 an unboxed instance -- we cannot default to an unspecialised version!
297
298
299 Dictionary floating
300 ~~~~~~~~~~~~~~~~~~~
301 Consider
302
303         f x = let g p q = p==q
304                   h r s = (r+s, g r s)
305               in
306               h x x
307
308
309 Before specialisation, leaving out type abstractions we have
310
311         f df x = let g :: Eq a => a -> a -> Bool
312                      g dg p q = == dg p q
313                      h :: Num a => a -> a -> (a, Bool)
314                      h dh r s = let deq = eqFromNum dh
315                                 in (+ dh r s, g deq r s)
316               in
317               h df x x
318
319 After specialising h we get a specialised version of h, like this:
320
321                     h' r s = let deq = eqFromNum df
322                              in (+ df r s, g deq r s)
323
324 But we can't naively make an instance for g from this, because deq is not in scope
325 at the defn of g.  Instead, we have to float out the (new) defn of deq
326 to widen its scope.  Notice that this floating can't be done in advance -- it only
327 shows up when specialisation is done.
328
329 DELICATE MATTER: the way we tell a dictionary binding is by looking to
330 see if it has a Dict type.  If the type has been "undictify'd", so that
331 it looks like a tuple, then the dictionary binding won't be floated, and
332 an opportunity to specialise might be lost.
333
334 User SPECIALIZE pragmas
335 ~~~~~~~~~~~~~~~~~~~~~~~
336 Specialisation pragmas can be digested by the type checker, and implemented
337 by adding extra definitions along with that of f, in the same way as before
338
339         f@t1/t2 = <f_rhs> t1 t2 d1 d2
340
341 Indeed the pragmas *have* to be dealt with by the type checker, because
342 only it knows how to build the dictionaries d1 and d2!  For example
343
344         g :: Ord a => [a] -> [a]
345         {-# SPECIALIZE f :: [Tree Int] -> [Tree Int] #-}
346
347 Here, the specialised version of g is an application of g's rhs to the
348 Ord dictionary for (Tree Int), which only the type checker can conjure
349 up.  There might not even *be* one, if (Tree Int) is not an instance of
350 Ord!  (All the other specialision has suitable dictionaries to hand
351 from actual calls.)
352
353 Problem.  The type checker doesn't have to hand a convenient <f_rhs>, because
354 it is buried in a complex (as-yet-un-desugared) binding group.
355 Maybe we should say
356
357         f@t1/t2 = f* t1 t2 d1 d2
358
359 where f* is the Id f with an IdInfo which says "inline me regardless!".
360 Indeed all the specialisation could be done in this way.
361 That in turn means that the simplifier has to be prepared to inline absolutely
362 any in-scope let-bound thing.
363
364
365 Again, the pragma should permit polymorphism in unconstrained variables:
366
367         h :: Ord a => [a] -> b -> b
368         {-# SPECIALIZE h :: [Int] -> b -> b #-}
369
370 We *insist* that all overloaded type variables are specialised to ground types,
371 (and hence there can be no context inside a SPECIALIZE pragma).
372 We *permit* unconstrained type variables to be specialised to
373         - a ground type
374         - or left as a polymorphic type variable
375 but nothing in between.  So
376
377         {-# SPECIALIZE h :: [Int] -> [c] -> [c] #-}
378
379 is *illegal*.  (It can be handled, but it adds complication, and gains the
380 programmer nothing.)
381
382
383 SPECIALISING INSTANCE DECLARATIONS
384 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
385 Consider
386
387         instance Foo a => Foo [a] where
388                 ...
389         {-# SPECIALIZE instance Foo [Int] #-}
390
391 The original instance decl creates a dictionary-function
392 definition:
393
394         dfun.Foo.List :: forall a. Foo a -> Foo [a]
395
396 The SPECIALIZE pragma just makes a specialised copy, just as for
397 ordinary function definitions:
398
399         dfun.Foo.List@Int :: Foo [Int]
400         dfun.Foo.List@Int = dfun.Foo.List Int dFooInt
401
402 The information about what instance of the dfun exist gets added to
403 the dfun's IdInfo in the same way as a user-defined function too.
404
405 In fact, matters are a little bit more complicated than this.
406 When we make one of these specialised instances, we are defining
407 a constant dictionary, and so we want immediate access to its constant
408 methods and superclasses.  Indeed, these constant methods and superclasses
409 must be in the IdInfo for the class selectors!  We need help from the
410 typechecker to sort this out, perhaps by generating a separate IdInfo
411 for each.
412
413 Automatic instance decl specialisation?
414 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
415 Can instance decls be specialised automatically?  It's tricky.
416 We could collect call-instance information for each dfun, but
417 then when we specialised their bodies we'd get new call-instances
418 for ordinary functions; and when we specialised their bodies, we might get
419 new call-instances of the dfuns, and so on.  This all arises because of
420 the unrestricted mutual recursion between instance decls and value decls.
421
422 Furthermore, instance decls are usually exported and used non-locally,
423 so we'll want to compile enough to get those specialisations done.
424
425 Lastly, there's no such thing as a local instance decl, so we can
426 survive solely by spitting out *usage* information, and then reading that
427 back in as a pragma when next compiling the file.  So for now,
428 we only specialise instance decls in response to pragmas.
429
430 That means that even if an instance decl ain't otherwise exported it
431 needs to be spat out as with a SPECIALIZE pragma.  Furthermore, it needs
432 something to say which module defined the instance, so the usage info
433 can be fed into the right reqts info file.  Blegh.
434
435
436 SPECIAILISING DATA DECLARATIONS
437 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
438
439 With unboxed specialisation (or full specialisation) we also require
440 data types (and their constructors) to be speciailised on unboxed
441 type arguments.
442
443 In addition to normal call instances we gather TyCon call instances at
444 unboxed types, determine equivalence classes for the locally defined
445 TyCons and build speciailised data constructor Ids for each TyCon and
446 substitute these in the Con calls.
447
448 We need the list of local TyCons to partition the TyCon instance info.
449 We pass out a FiniteMap from local TyCons to Specialised Instances to
450 give to the interface and code genertors.
451
452 N.B. The specialised data constructors reference the original data
453 constructor and type constructor which do not have the updated
454 specialisation info attached.  Any specialisation info must be
455 extracted from the TyCon map returned.
456
457
458 SPITTING OUT USAGE INFORMATION
459 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
460
461 To spit out usage information we need to traverse the code collecting
462 call-instance information for all imported (non-prelude?) functions
463 and data types. Then we equivalence-class it and spit it out.
464
465 This is done at the top-level when all the call instances which escape
466 must be for imported functions and data types.
467
468
469 Partial specialisation by pragmas
470 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
471 What about partial specialisation:
472
473         k :: (Ord a, Eq b) => [a] -> b -> b -> [a]
474         {-# SPECIALIZE k :: Eq b => [Int] -> b -> b -> [a] #-}
475
476 or even
477
478         {-# SPECIALIZE k :: Eq b => [Int] -> [b] -> [b] -> [a] #-}
479
480 Seems quite reasonable.  Similar things could be done with instance decls:
481
482         instance (Foo a, Foo b) => Foo (a,b) where
483                 ...
484         {-# SPECIALIZE instance Foo a => Foo (a,Int) #-}
485         {-# SPECIALIZE instance Foo b => Foo (Int,b) #-}
486
487 Ho hum.  Things are complex enough without this.  I pass.
488
489
490 Requirements for the simplifer
491 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
492 The simplifier has to be able to take advantage of the specialisation.
493
494 * When the simplifier finds an application of a polymorphic f, it looks in
495 f's IdInfo in case there is a suitable instance to call instead.  This converts
496
497         f t1 t2 d1 d2   ===>   f_t1_t2
498
499 Note that the dictionaries get eaten up too!
500
501 * Dictionary selection operations on constant dictionaries must be
502   short-circuited:
503
504         +.sel Int d     ===>  +Int
505
506 The obvious way to do this is in the same way as other specialised
507 calls: +.sel has inside it some IdInfo which tells that if it's applied
508 to the type Int then it should eat a dictionary and transform to +Int.
509
510 In short, dictionary selectors need IdInfo inside them for constant
511 methods.
512
513 * Exactly the same applies if a superclass dictionary is being
514   extracted:
515
516         Eq.sel Int d   ===>   dEqInt
517
518 * Something similar applies to dictionary construction too.  Suppose
519 dfun.Eq.List is the function taking a dictionary for (Eq a) to
520 one for (Eq [a]).  Then we want
521
522         dfun.Eq.List Int d      ===> dEq.List_Int
523
524 Where does the Eq [Int] dictionary come from?  It is built in
525 response to a SPECIALIZE pragma on the Eq [a] instance decl.
526
527 In short, dfun Ids need IdInfo with a specialisation for each
528 constant instance of their instance declaration.
529
530
531 What does the specialisation IdInfo look like?
532 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
533
534         SpecInfo
535                 [Maybe Type] -- Instance types
536                 Int             -- No of dicts to eat
537                 Id              -- Specialised version
538
539 For example, if f has this SpecInfo:
540
541         SpecInfo [Just t1, Nothing, Just t3] 2 f'
542
543 then
544
545         f t1 t2 t3 d1 d2  ===>  f t2
546
547 The "Nothings" identify type arguments in which the specialised
548 version is polymorphic.
549
550 What can't be done this way?
551 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
552 There is no way, post-typechecker, to get a dictionary for (say)
553 Eq a from a dictionary for Eq [a].  So if we find
554
555         ==.sel [t] d
556
557 we can't transform to
558
559         eqList (==.sel t d')
560
561 where
562         eqList :: (a->a->Bool) -> [a] -> [a] -> Bool
563
564 Of course, we currently have no way to automatically derive
565 eqList, nor to connect it to the Eq [a] instance decl, but you
566 can imagine that it might somehow be possible.  Taking advantage
567 of this is permanently ruled out.
568
569 Still, this is no great hardship, because we intend to eliminate
570 overloading altogether anyway!
571
572
573 Mutter mutter
574 ~~~~~~~~~~~~~
575 What about types/classes mentioned in SPECIALIZE pragmas spat out,
576 but not otherwise exported.  Even if they are exported, what about
577 their original names.
578
579 Suggestion: use qualified names in pragmas, omitting module for
580 prelude and "this module".
581
582
583 Mutter mutter 2
584 ~~~~~~~~~~~~~~~
585 Consider this
586
587         f a (d::Num a) = let g = ...
588                          in
589                          ...(let d1::Ord a = Num.Ord.sel a d in g a d1)...
590
591 Here, g is only called at one type, but the dictionary isn't in scope at the
592 definition point for g.  Usually the type checker would build a
593 definition for d1 which enclosed g, but the transformation system
594 might have moved d1's defn inward.
595
596
597 Unboxed bindings
598 ~~~~~~~~~~~~~~~~
599
600 What should we do when a value is specialised to a *strict* unboxed value?
601
602         map_*_* f (x:xs) = let h = f x
603                                t = map f xs
604                            in h:t
605
606 Could convert let to case:
607
608         map_*_Int# f (x:xs) = case f x of h# ->
609                               let t = map f xs
610                               in h#:t
611
612 This may be undesirable since it forces evaluation here, but the value
613 may not be used in all branches of the body. In the general case this
614 transformation is impossible since the mutual recursion in a letrec
615 cannot be expressed as a case.
616
617 There is also a problem with top-level unboxed values, since our
618 implementation cannot handle unboxed values at the top level.
619
620 Solution: Lift the binding of the unboxed value and extract it when it
621 is used:
622
623         map_*_Int# f (x:xs) = let h = case (f x) of h# -> _Lift h#
624                                   t = map f xs
625                               in case h of
626                                  _Lift h# -> h#:t
627
628 Now give it to the simplifier and the _Lifting will be optimised away.
629
630 The benfit is that we have given the specialised "unboxed" values a
631 very simple lifted semantics and then leave it up to the simplifier to
632 optimise it --- knowing that the overheads will be removed in nearly
633 all cases.
634
635 In particular, the value will only be evaluted in the branches of the
636 program which use it, rather than being forced at the point where the
637 value is bound. For example:
638
639         filtermap_*_* p f (x:xs)
640           = let h = f x
641                 t = ...
642             in case p x of
643                 True  -> h:t
644                 False -> t
645    ==>
646         filtermap_*_Int# p f (x:xs)
647           = let h = case (f x) of h# -> _Lift h#
648                 t = ...
649             in case p x of
650                 True  -> case h of _Lift h#
651                            -> h#:t
652                 False -> t
653
654 The binding for h can still be inlined in the one branch and the
655 _Lifting eliminated.
656
657
658 Question: When won't the _Lifting be eliminated?
659
660 Answer: When they at the top-level (where it is necessary) or when
661 inlining would duplicate work (or possibly code depending on
662 options). However, the _Lifting will still be eliminated if the
663 strictness analyser deems the lifted binding strict.
664
665
666
667 %************************************************************************
668 %*                                                                      *
669 \subsubsection[CallInstances]{@CallInstances@ data type}
670 %*                                                                      *
671 %************************************************************************
672
673 \begin{code}
674 type FreeVarsSet   = IdSet
675 type FreeTyVarsSet = TyVarSet
676
677 data CallInstance
678   = CallInstance
679                 Id                -- This Id; *new* ie *cloned* id
680                 [Maybe Type]      -- Specialised at these types (*new*, cloned)
681                                   -- Nothing => no specialisation on this type arg
682                                   --          is required (flag dependent).
683                 [CoreArg]         -- And these dictionaries; all ValArgs
684                 FreeVarsSet       -- Free vars of the dict-args in terms of *new* ids
685                 (Maybe SpecInfo)  -- For specialisation with explicit SpecId
686 \end{code}
687
688 \begin{code}
689 pprCI :: CallInstance -> Pretty
690 pprCI (CallInstance id spec_tys dicts _ maybe_specinfo)
691   = ppHang (ppCat [ppStr "Call inst for", ppr PprDebug id])
692          4 (ppAboves [ppCat (ppStr "types" : [pprMaybeTy PprDebug ty | ty <- spec_tys]),
693                       case maybe_specinfo of
694                         Nothing -> ppCat (ppStr "dicts" : [ppr_arg PprDebug dict | dict <- dicts])
695                         Just (SpecInfo _ _ spec_id)
696                                 -> ppCat [ppStr "Explicit SpecId", ppr PprDebug spec_id]
697                      ])
698
699 -- ToDo: instance Outputable CoreArg?
700 ppr_arg sty (TyArg  t) = ppr sty t
701 ppr_arg sty (LitArg i) = ppr sty i
702 ppr_arg sty (VarArg v) = ppr sty v
703
704 isUnboxedCI :: CallInstance -> Bool
705 isUnboxedCI (CallInstance _ spec_tys _ _ _)
706   = any isUnboxedType (catMaybes spec_tys)
707
708 isExplicitCI :: CallInstance -> Bool
709 isExplicitCI (CallInstance _ _ _ _ (Just _))
710   = True
711 isExplicitCI (CallInstance _ _ _ _ Nothing)
712   = False
713 \end{code}
714
715 Comparisons are based on the {\em types}, ignoring the dictionary args:
716
717 \begin{code}
718
719 cmpCI :: CallInstance -> CallInstance -> TAG_
720 cmpCI (CallInstance id1 tys1 _ _ _) (CallInstance id2 tys2 _ _ _)
721   = cmp id1 id2 `thenCmp` cmpUniTypeMaybeList tys1 tys2
722
723 cmpCI_tys :: CallInstance -> CallInstance -> TAG_
724 cmpCI_tys (CallInstance _ tys1 _ _ _) (CallInstance _ tys2 _ _ _)
725   = cmpUniTypeMaybeList tys1 tys2
726
727 eqCI_tys :: CallInstance -> CallInstance -> Bool
728 eqCI_tys c1 c2
729   = case cmpCI_tys c1 c2 of { EQ_ -> True; other -> False }
730
731 isCIofTheseIds :: [Id] -> CallInstance -> Bool
732 isCIofTheseIds ids (CallInstance ci_id _ _ _ _)
733   = any ((==) ci_id) ids
734
735 singleCI :: Id -> [Maybe Type] -> [CoreArg] -> UsageDetails
736 singleCI id tys dicts
737   = UsageDetails (unitBag (CallInstance id tys dicts fv_set Nothing))
738                  emptyBag [] emptyIdSet 0 0
739   where
740     fv_set = mkIdSet (id : [dict | (VarArg dict) <- dicts])
741
742 explicitCI :: Id -> [Maybe Type] -> SpecInfo -> UsageDetails
743 explicitCI id tys specinfo
744   = UsageDetails (unitBag call_inst) emptyBag [] emptyIdSet 0 0
745   where
746     call_inst = CallInstance id tys dicts fv_set (Just specinfo)
747     dicts  = panic "Specialise:explicitCI:dicts"
748     fv_set = unitIdSet id
749
750 -- We do not process the CIs for top-level dfuns or defms
751 -- Instead we require an explicit SPEC inst pragma for dfuns
752 -- and an explict method within any instances for the defms
753
754 getCIids :: Bool -> [Id] -> [Id]
755 getCIids True ids = filter not_dict_or_defm ids
756 getCIids _    ids = ids
757
758 not_dict_or_defm id
759   = not (isDictTy (idType id) || maybeToBool (isDefaultMethodId_maybe id))
760
761 getCIs :: Bool -> [Id] -> UsageDetails -> ([CallInstance], UsageDetails)
762 getCIs top_lev ids (UsageDetails cis tycon_cis dbs fvs c i)
763   = let
764         (cis_here, cis_not_here) = partitionBag (isCIofTheseIds (getCIids top_lev ids)) cis
765         cis_here_list = bagToList cis_here
766     in
767     -- pprTrace "getCIs:"
768     -- (ppHang (ppBesides [ppStr "{",
769     --                     interppSP PprDebug ids,
770     --                     ppStr "}"])
771     --       4 (ppAboves (map pprCI cis_here_list)))
772     (cis_here_list, UsageDetails cis_not_here tycon_cis dbs fvs c i)
773
774 dumpCIs :: Bag CallInstance     -- The call instances
775         -> Bool                 -- True <=> top level bound Ids
776         -> Bool                 -- True <=> dict bindings to be floated (specBind only)
777         -> [CallInstance]       -- Call insts for bound ids (instBind only)
778         -> [Id]                 -- Bound ids *new*
779         -> [Id]                 -- Full bound ids: includes dumped dicts
780         -> Bag CallInstance     -- Kept call instances
781
782         -- CIs are dumped if:
783         --   1) they are a CI for one of the bound ids, or
784         --   2) they mention any of the dicts in a local unfloated binding
785         --
786         -- For top-level bindings we allow the call instances to
787         -- float past a dict bind and place all the top-level binds
788         -- in a *global* Rec.
789         -- We leave it to the simplifier will sort it all out ...
790
791 dumpCIs cis top_lev floating inst_cis bound_ids full_ids
792  = (if not (isEmptyBag cis_of_bound_id) &&
793        not (isEmptyBag cis_of_bound_id_without_inst_cis)
794     then
795        pprTrace ("dumpCIs: dumping CI which was not instantiated ... \n" ++
796                  "         (may be a non-HM recursive call)\n")
797        (ppHang (ppBesides [ppStr "{",
798                            interppSP PprDebug bound_ids,
799                            ppStr "}"])
800              4 (ppAboves [ppStr "Dumping CIs:",
801                           ppAboves (map pprCI (bagToList cis_of_bound_id)),
802                           ppStr "Instantiating CIs:",
803                           ppAboves (map pprCI inst_cis)]))
804     else id) (
805    if top_lev || floating then
806        cis_not_bound_id
807    else
808        (if not (isEmptyBag cis_dump_unboxed)
809         then pprTrace "dumpCIs: bound dictionary arg ... WITH UNBOXED TYPES!\n"
810              (ppHang (ppBesides [ppStr "{",
811                                  interppSP PprDebug full_ids,
812                                  ppStr "}"])
813                    4 (ppAboves (map pprCI (bagToList cis_dump))))
814         else id)
815        cis_keep_not_bound_id
816    )
817  where
818    (cis_of_bound_id, cis_not_bound_id)
819       = partitionBag (isCIofTheseIds (getCIids top_lev bound_ids)) cis
820
821    (cis_dump, cis_keep_not_bound_id)
822       = partitionBag ok_to_dump_ci cis_not_bound_id
823
824    ok_to_dump_ci (CallInstance _ _ _ fv_set _)
825         = any (\ i -> i `elementOfIdSet` fv_set) full_ids
826
827    (_, cis_of_bound_id_without_inst_cis) = partitionBag have_inst_ci cis_of_bound_id
828    have_inst_ci ci = any (eqCI_tys ci) inst_cis
829
830    (cis_dump_unboxed, _) = partitionBag isUnboxedCI cis_dump
831
832 \end{code}
833
834 Any call instances of a bound_id can be safely dumped, because any
835 recursive calls should be at the same instance as the parent instance.
836
837    letrec f = /\a -> \x::a -> ...(f t x')...
838
839 Here, the type, t, at which f is used in its own RHS should be
840 just "a"; that is, the recursive call is at the same type as
841 the original call. That means that when specialising f at some
842 type, say Int#, we shouldn't find any *new* instances of f
843 arising from specialising f's RHS.  The only instance we'll find
844 is another call of (f Int#).
845
846 We check this in dumpCIs by passing in all the instantiated call
847 instances (inst_cis) and reporting any dumped cis (cis_of_bound_id)
848 for which there is no such instance.
849
850 We also report CIs dumped due to a bound dictionary arg if they
851 contain unboxed types.
852
853 %************************************************************************
854 %*                                                                      *
855 \subsubsection[TyConInstances]{@TyConInstances@ data type}
856 %*                                                                      *
857 %************************************************************************
858
859 \begin{code}
860 data TyConInstance
861   = TyConInstance TyCon                 -- Type Constructor
862                   [Maybe Type]  -- Applied to these specialising types
863
864 cmpTyConI :: TyConInstance -> TyConInstance -> TAG_
865 cmpTyConI (TyConInstance tc1 tys1) (TyConInstance tc2 tys2)
866   = cmp tc1 tc2 `thenCmp` cmpUniTypeMaybeList tys1 tys2
867
868 cmpTyConI_tys :: TyConInstance -> TyConInstance -> TAG_
869 cmpTyConI_tys (TyConInstance _ tys1) (TyConInstance _ tys2)
870   = cmpUniTypeMaybeList tys1 tys2
871
872 singleTyConI :: TyCon -> [Maybe Type] -> UsageDetails
873 singleTyConI ty_con spec_tys
874   = UsageDetails emptyBag (unitBag (TyConInstance ty_con spec_tys)) [] emptyIdSet 0 0
875
876 isTyConIofThisTyCon :: TyCon -> TyConInstance -> Bool
877 isTyConIofThisTyCon ty_con (TyConInstance inst_ty_con _) = ty_con == inst_ty_con
878
879 isLocalSpecTyConI :: Bool -> TyConInstance -> Bool
880 isLocalSpecTyConI comp_prel (TyConInstance inst_ty_con _) = isLocalSpecTyCon comp_prel inst_ty_con
881
882 getLocalSpecTyConIs :: Bool -> UsageDetails -> ([TyConInstance], UsageDetails)
883 getLocalSpecTyConIs comp_prel (UsageDetails cis tycon_cis dbs fvs c i)
884   = let
885         (tycon_cis_local, tycon_cis_global)
886           = partitionBag (isLocalSpecTyConI comp_prel) tycon_cis
887         tycon_cis_local_list = bagToList tycon_cis_local
888     in
889     (tycon_cis_local_list, UsageDetails cis tycon_cis_global dbs fvs c i)
890 \end{code}
891
892
893 %************************************************************************
894 %*                                                                      *
895 \subsubsection[UsageDetails]{@UsageDetails@ data type}
896 %*                                                                      *
897 %************************************************************************
898
899 \begin{code}
900 data UsageDetails
901   = UsageDetails
902         (Bag CallInstance)      -- The collection of call-instances
903         (Bag TyConInstance)     -- Constructor call-instances
904         [DictBindDetails]       -- Dictionary bindings in data-dependence order!
905         FreeVarsSet             -- Free variables (excl imported ones, incl top level) (cloned)
906         Int                     -- no. of spec calls
907         Int                     -- no. of spec insts
908 \end{code}
909
910 The DictBindDetails are fully processed; their call-instance information is
911 incorporated in the call-instances of the
912 UsageDetails which includes the DictBindDetails.  The free vars in a usage details
913 will *include* the binders of the DictBind details.
914
915 A @DictBindDetails@ contains bindings for dictionaries *only*.
916
917 \begin{code}
918 data DictBindDetails
919   = DictBindDetails
920         [Id]                    -- Main binders, originally visible in scope of binding (cloned)
921         CoreBinding     -- Fully processed
922         FreeVarsSet             -- Free in binding group (cloned)
923         FreeTyVarsSet           -- Free in binding group
924 \end{code}
925
926 \begin{code}
927 emptyUDs    :: UsageDetails
928 unionUDs    :: UsageDetails -> UsageDetails -> UsageDetails
929 unionUDList :: [UsageDetails] -> UsageDetails
930
931 -- tickSpecCall :: Bool -> UsageDetails -> UsageDetails
932 tickSpecInsts :: UsageDetails -> UsageDetails
933
934 -- tickSpecCall found (UsageDetails cis ty_cis dbs fvs c i)
935 -- = UsageDetails cis ty_cis dbs fvs (c + (if found then 1 else 0)) i
936
937 tickSpecInsts (UsageDetails cis ty_cis dbs fvs c i)
938  = UsageDetails cis ty_cis dbs fvs c (i+1)
939
940 emptyUDs = UsageDetails emptyBag emptyBag [] emptyIdSet 0 0
941
942 unionUDs (UsageDetails cis1 tycon_cis1 dbs1 fvs1 c1 i1) (UsageDetails cis2 tycon_cis2 dbs2 fvs2 c2 i2)
943  = UsageDetails (unionBags cis1 cis2) (unionBags tycon_cis1 tycon_cis2)
944                 (dbs1 ++ dbs2) (fvs1 `unionIdSets` fvs2) (c1+c2) (i1+i2)
945         -- The append here is really redundant, since the bindings don't
946         -- scope over each other.  ToDo.
947
948 unionUDList = foldr unionUDs emptyUDs
949
950 singleFvUDs (VarArg v) | not (isImportedId v)
951  = UsageDetails emptyBag emptyBag [] (unitIdSet v) 0 0
952 singleFvUDs other
953  = emptyUDs
954
955 singleConUDs con = UsageDetails emptyBag emptyBag [] (unitIdSet con) 0 0
956
957 dumpDBs :: [DictBindDetails]
958         -> Bool                 -- True <=> top level bound Ids
959         -> [TyVar]              -- TyVars being bound (cloned)
960         -> [Id]                 -- Ids being bound (cloned)
961         -> FreeVarsSet          -- Fvs of body
962         -> ([CoreBinding],      -- These ones have to go here
963             [DictBindDetails],  -- These can float further
964             [Id],               -- Incoming list + names of dicts bound here
965             FreeVarsSet         -- Incoming fvs + fvs of dicts bound here
966            )
967
968         -- It is just to complex to try to float top-level
969         -- dict bindings with constant methods, inst methods,
970         -- auxillary derived instance defns and user instance
971         -- defns all getting in the way.
972         -- So we dump all dbinds as soon as we get to the top
973         -- level and place them in a *global* Rec.
974         -- We leave it to the simplifier will sort it all out ...
975
976 dumpDBs [] top_lev bound_tyvars bound_ids fvs
977   = ([], [], bound_ids, fvs)
978
979 dumpDBs ((db@(DictBindDetails dbinders dbind db_fvs db_ftv)):dbs)
980         top_lev bound_tyvars bound_ids fvs
981   | top_lev
982     || any (\ i -> i `elementOfIdSet`    db_fvs) bound_ids
983     || any (\ t -> t `elementOfTyVarSet` db_ftv) bound_tyvars
984   = let         -- Ha!  Dump it!
985         (dbinds_here, dbs_outer, full_bound_ids, full_fvs)
986            = dumpDBs dbs top_lev bound_tyvars (dbinders ++ bound_ids) (db_fvs `unionIdSets` fvs)
987     in
988     (dbind : dbinds_here, dbs_outer, full_bound_ids, full_fvs)
989
990   | otherwise   -- This one can float out further
991   = let
992         (dbinds_here, dbs_outer, full_bound_ids, full_fvs)
993            = dumpDBs dbs top_lev bound_tyvars bound_ids fvs
994     in
995     (dbinds_here, db : dbs_outer, full_bound_ids, full_fvs)
996
997
998
999 dumpUDs :: UsageDetails
1000         -> Bool                 -- True <=> top level bound Ids
1001         -> Bool                 -- True <=> dict bindings to be floated (specBind only)
1002         -> [CallInstance]       -- Call insts for bound Ids (instBind only)
1003         -> [Id]                 -- Ids which are just being bound; *new*
1004         -> [TyVar]              -- TyVars which are just being bound
1005         -> ([CoreBinding],      -- Bindings from UsageDetails which mention the ids
1006             UsageDetails)       -- The above bindings removed, and
1007                                 -- any call-instances which mention the ids dumped too
1008
1009 dumpUDs (UsageDetails cis tycon_cis dbs fvs c i) top_lev floating inst_cis bound_ids tvs
1010   = let
1011         (dict_binds_here, dbs_outer, full_bound_ids, full_fvs)
1012                   = dumpDBs dbs top_lev tvs bound_ids fvs
1013         cis_outer = dumpCIs cis top_lev floating inst_cis bound_ids full_bound_ids
1014         fvs_outer = full_fvs `minusIdSet` (mkIdSet full_bound_ids)
1015     in
1016     (dict_binds_here, UsageDetails cis_outer tycon_cis dbs_outer fvs_outer c i)
1017 \end{code}
1018
1019 \begin{code}
1020 addDictBinds :: [Id] -> CoreBinding -> UsageDetails     -- Dict binding and RHS usage
1021              -> UsageDetails                                    -- The usage to augment
1022              -> UsageDetails
1023 addDictBinds dbinders dbind (UsageDetails db_cis db_tycon_cis db_dbs db_fvs db_c db_i)
1024                             (UsageDetails cis    tycon_cis    dbs    fvs    c    i)
1025   = UsageDetails (db_cis `unionBags` cis)
1026                  (db_tycon_cis `unionBags` tycon_cis)
1027                  (db_dbs ++ [DictBindDetails dbinders dbind db_fvs db_ftvs] ++ dbs)
1028                  fvs c i
1029                  -- NB: We ignore counts from dictbinds since it is not user code
1030   where
1031         -- The free tyvars of the dictionary bindings should really be
1032         -- gotten from the RHSs, but I'm pretty sure it's good enough just
1033         -- to look at the type of the dictionary itself.
1034         -- Doing the proper job would entail keeping track of free tyvars as
1035         -- well as free vars, which would be a bore.
1036     db_ftvs = tyVarsOfTypes (map idType dbinders)
1037 \end{code}
1038
1039 %************************************************************************
1040 %*                                                                      *
1041 \subsection[cloning-binders]{The Specialising IdEnv and CloneInfo}
1042 %*                                                                      *
1043 %************************************************************************
1044
1045 @SpecIdEnv@ maps old Ids to their new "clone". There are three cases:
1046
1047 1) (NoLift LitArg l) : an Id which is bound to a literal
1048
1049 2) (NoLift LitArg l) : an Id bound to a "new" Id
1050    The new Id is a possibly-type-specialised clone of the original
1051
1052 3) Lifted lifted_id unlifted_id :
1053
1054    This indicates that the original Id has been specialised to an
1055    unboxed value which must be lifted (see "Unboxed bindings" above)
1056      @unlifted_id@ is the unboxed clone of the original Id
1057      @lifted_id@ is a *lifted* version of the original Id
1058
1059    When you lookup Ids which are Lifted, you have to insert a case
1060    expression to un-lift the value (done with @bindUnlift@)
1061
1062    You also have to insert a case to lift the value in the binding
1063    (done with @liftExpr@)
1064
1065
1066 \begin{code}
1067 type SpecIdEnv = IdEnv CloneInfo
1068
1069 data CloneInfo
1070  = NoLift CoreArg       -- refers to cloned id or literal
1071
1072  | Lifted Id            -- lifted, cloned id
1073           Id            -- unlifted, cloned id
1074
1075 \end{code}
1076
1077 %************************************************************************
1078 %*                                                                      *
1079 \subsection[specialise-data]{Data returned by specialiser}
1080 %*                                                                      *
1081 %************************************************************************
1082
1083 \begin{code}
1084 data SpecialiseData
1085  = SpecData Bool
1086                 -- True <=> Specialisation performed
1087             Bool
1088                 -- False <=> Specialisation completed with errors
1089
1090             [TyCon]
1091                 -- Local tycons declared in this module
1092
1093             [TyCon]
1094                 -- Those in-scope data types for which we want to
1095                 -- generate code for their constructors.
1096                 -- Namely: data types declared in this module +
1097                 --         any big tuples used in this module
1098                 -- The initial (and default) value is the local tycons
1099
1100             (FiniteMap TyCon [(Bool, [Maybe Type])])
1101                 -- TyCon specialisations to be generated
1102                 -- We generate specialialised code (Bool=True) for data types
1103                 -- defined in this module and any tuples used in this module
1104                 -- The initial (and default) value is the specialisations
1105                 -- requested by source-level SPECIALIZE data pragmas (Bool=True)
1106                 -- and _SPECIALISE_ pragmas (Bool=False) in the interface files
1107
1108             (Bag (Id,[Maybe Type]))
1109                 -- Imported specialisation errors
1110             (Bag (Id,[Maybe Type]))
1111                 -- Imported specialisation warnings
1112             (Bag (TyCon,[Maybe Type]))
1113                 -- Imported TyCon specialisation errors
1114
1115 initSpecData local_tycons tycon_specs
1116  = SpecData False True local_tycons local_tycons tycon_specs emptyBag emptyBag emptyBag
1117 \end{code}
1118
1119 ToDo[sansom]: Transformation data to process specialisation requests.
1120
1121 %************************************************************************
1122 %*                                                                      *
1123 \subsection[specProgram]{Specialising a core program}
1124 %*                                                                      *
1125 %************************************************************************
1126
1127 \begin{code}
1128 specProgram :: UniqSupply
1129             -> [CoreBinding]    -- input ...
1130             -> SpecialiseData
1131             -> ([CoreBinding],  -- main result
1132                 SpecialiseData)         -- result specialise data
1133
1134 specProgram uniqs binds
1135            (SpecData False _ local_tycons _ init_specs init_errs init_warn init_tyerrs)
1136   = case (initSM (specTyConsAndScope (specTopBinds binds)) uniqs) of
1137       (final_binds, tycon_specs_list,
1138         UsageDetails import_cis import_tycis _ fvs spec_calls spec_insts)
1139          -> let
1140                 used_conids   = filter isDataCon (uniqSetToList fvs)
1141                 used_tycons   = map dataConTyCon used_conids
1142                 used_gen      = filter isLocalGenTyCon used_tycons
1143                 gen_tycons    = uniqSetToList (mkUniqSet local_tycons `unionUniqSets` mkUniqSet used_gen)
1144
1145                 result_specs  = addListToFM_C (++) init_specs tycon_specs_list
1146
1147                 uniq_cis      = map head (equivClasses cmpCI (bagToList import_cis))
1148                 cis_list      = [(id, tys) | CallInstance id tys _ _ _ <- uniq_cis]
1149                 (cis_unboxed, cis_other) = partition (isUnboxedSpecialisation . snd) cis_list
1150                 cis_warn      = init_warn `unionBags` listToBag cis_other
1151                 cis_errs      = init_errs `unionBags` listToBag cis_unboxed
1152
1153                 uniq_tycis    = map head (equivClasses cmpTyConI (bagToList import_tycis))
1154                 tycis_unboxed = [(con, tys) | TyConInstance con tys <- uniq_tycis]
1155                 tycis_errs    = init_tyerrs `unionBags` listToBag tycis_unboxed
1156
1157                 no_errs       = isEmptyBag cis_errs && isEmptyBag tycis_errs
1158                                   && (not opt_SpecialiseImports || isEmptyBag cis_warn)
1159             in
1160             (if opt_D_simplifier_stats then
1161                 pprTrace "\nSpecialiser Stats:\n" (ppAboves [
1162                                         ppBesides [ppStr "SpecCalls  ", ppInt spec_calls],
1163                                         ppBesides [ppStr "SpecInsts  ", ppInt spec_insts],
1164                                         ppSP])
1165              else id)
1166
1167             (final_binds,
1168              SpecData True no_errs local_tycons gen_tycons result_specs
1169                                    cis_errs cis_warn tycis_errs)
1170
1171 specProgram uniqs binds (SpecData True _ _ _ _ _ _ _)
1172   = panic "Specialise:specProgram: specialiser called more than once"
1173
1174 -- It may be possible safely to call the specialiser more than once,
1175 -- but I am not sure there is any benefit in doing so (Patrick)
1176
1177 -- ToDo: What about unfoldings performed after specialisation ???
1178 \end{code}
1179
1180 %************************************************************************
1181 %*                                                                      *
1182 \subsection[specTyConsAndScope]{Specialising data constructors within tycons}
1183 %*                                                                      *
1184 %************************************************************************
1185
1186 In the specialiser we just collect up the specialisations which will
1187 be required. We don't create the specialised constructors in
1188 Core. These are only introduced when we convert to StgSyn.
1189
1190 ToDo: Perhaps this collection should be done in CoreToStg to ensure no inconsistencies!
1191
1192 \begin{code}
1193 specTyConsAndScope :: SpecM ([CoreBinding], UsageDetails)
1194                    -> SpecM ([CoreBinding], [(TyCon,[(Bool,[Maybe Type])])], UsageDetails)
1195
1196 specTyConsAndScope scopeM
1197   = scopeM                      `thenSM` \ (binds, scope_uds) ->
1198     let
1199        (tycons_cis, gotci_scope_uds)
1200          = getLocalSpecTyConIs opt_CompilingGhcInternals scope_uds
1201
1202        tycon_specs_list = collectTyConSpecs tycons_cis
1203     in
1204     (if opt_SpecialiseTrace && not (null tycon_specs_list) then
1205          pprTrace "Specialising TyCons:\n"
1206          (ppAboves [ if not (null specs) then
1207                          ppHang (ppCat [(ppr PprDebug tycon), ppStr "at types"])
1208                               4 (ppAboves (map pp_specs specs))
1209                      else ppNil
1210                    | (tycon, specs) <- tycon_specs_list])
1211     else id) (
1212     returnSM (binds, tycon_specs_list, gotci_scope_uds)
1213     )
1214   where
1215     collectTyConSpecs []
1216       = []
1217     collectTyConSpecs tycons_cis@(TyConInstance tycon _ : _)
1218       = (tycon, tycon_specs) : collectTyConSpecs other_tycons_cis
1219       where
1220         (tycon_cis, other_tycons_cis) = partition (isTyConIofThisTyCon tycon) tycons_cis
1221         uniq_cis = map head (equivClasses cmpTyConI_tys tycon_cis)
1222         tycon_specs = [(False, spec_tys) | TyConInstance _ spec_tys <- uniq_cis]
1223
1224     pp_specs (False, spec_tys) = ppInterleave ppNil [pprMaybeTy PprDebug spec_ty | spec_ty <- spec_tys]
1225
1226 \end{code}
1227
1228 %************************************************************************
1229 %*                                                                      *
1230 \subsection[specTopBinds]{Specialising top-level bindings}
1231 %*                                                                      *
1232 %************************************************************************
1233
1234 \begin{code}
1235 specTopBinds :: [CoreBinding]
1236              -> SpecM ([CoreBinding], UsageDetails)
1237
1238 specTopBinds binds
1239   = spec_top_binds binds    `thenSM`  \ (binds, UsageDetails cis tycis dbind_details fvs c i) ->
1240     let
1241         -- Add bindings for floated dbinds and collect fvs
1242         -- In actual fact many of these bindings are dead code since dict
1243         -- arguments are dropped when a specialised call is created
1244         -- The simplifier should be able to cope ...
1245
1246         (dbinders_s, dbinds, dfvs_s)
1247            = unzip3 [(dbinders, dbind, dfvs) | DictBindDetails dbinders dbind dfvs _ <- dbind_details]
1248
1249         full_fvs  = fvs `unionIdSets` unionManyIdSets dfvs_s
1250         fvs_outer = full_fvs `minusIdSet` (mkIdSet (concat dbinders_s))
1251
1252         -- It is just to complex to try to sort out top-level dependencies
1253         -- So we just place all the top-level binds in a *global* Rec and
1254         -- leave it to the simplifier to sort it all out ...
1255     in
1256     ASSERT(null dbinds)
1257     returnSM ([Rec (pairsFromCoreBinds binds)], UsageDetails cis tycis [] fvs_outer c i)
1258
1259   where
1260     spec_top_binds (first_bind:rest_binds)
1261       = specBindAndScope True first_bind (
1262             spec_top_binds rest_binds `thenSM` \ (rest_binds, rest_uds) ->
1263             returnSM (ItsABinds rest_binds, rest_uds)
1264         )                       `thenSM` \ (first_binds, ItsABinds rest_binds, all_uds) ->
1265         returnSM (first_binds ++ rest_binds, all_uds)
1266
1267     spec_top_binds []
1268       = returnSM ([], emptyUDs)
1269 \end{code}
1270
1271 %************************************************************************
1272 %*                                                                      *
1273 \subsection[specExpr]{Specialising expressions}
1274 %*                                                                      *
1275 %************************************************************************
1276
1277 \begin{code}
1278 specExpr :: CoreExpr
1279          -> [CoreArg]           -- The arguments:
1280                                 --    TypeArgs are speced
1281                                 --    ValArgs are unprocessed
1282          -> SpecM (CoreExpr,    -- Result expression with specialised versions installed
1283                    UsageDetails)-- Details of usage of enclosing binders in the result
1284                                 -- expression.
1285
1286 specExpr (Var v) args
1287   = lookupId v                  `thenSM` \ vlookup ->
1288     case vlookup of
1289        Lifted vl vu
1290              -> -- Binding has been lifted, need to extract un-lifted value
1291                 -- NB: a function binding will never be lifted => args always null
1292                 --     i.e. no call instance required or call to be constructed
1293                 ASSERT (null args)
1294                 returnSM (bindUnlift vl vu (Var vu), singleFvUDs (VarArg vl))
1295
1296        NoLift vatom@(VarArg new_v)
1297              -> mapSM specOutArg args                   `thenSM` \ arg_info ->
1298                 mkCallInstance v new_v arg_info         `thenSM` \ call_uds ->
1299                 mkCall new_v arg_info                   `thenSM` \ call ->
1300                 let
1301                     uds = unionUDList [call_uds,
1302                                        singleFvUDs vatom,
1303                                        unionUDList [uds | (_,uds,_) <- arg_info]
1304                                       ]
1305                 in
1306                 returnSM (call, {- tickSpecCall speced -} uds)
1307
1308 specExpr expr@(Lit _) null_args
1309   = ASSERT (null null_args)
1310     returnSM (expr, emptyUDs)
1311
1312 specExpr (Con con args) null_args
1313   = ASSERT (null null_args)
1314     let
1315         (targs, vargs) = partition_args args
1316     in
1317     mapAndUnzipSM  specTyArg  targs `thenSM` \ (targs, tys) ->
1318     mapAndUnzip3SM specValArg vargs `thenSM` \ (vargs, args_uds_s, unlifts) ->
1319     mkTyConInstance con tys         `thenSM` \ con_uds ->
1320     returnSM (applyBindUnlifts unlifts (Con con (targs ++ vargs)),
1321               unionUDList args_uds_s `unionUDs` con_uds)
1322
1323 specExpr (Prim op@(CCallOp str is_asm may_gc arg_tys res_ty) args) null_args
1324   = ASSERT (null null_args)
1325     let
1326         (targs, vargs) = partition_args args
1327     in
1328     ASSERT (null targs)
1329     mapSM specTy arg_tys            `thenSM` \ arg_tys ->
1330     specTy res_ty                   `thenSM` \ res_ty ->
1331     mapAndUnzip3SM specValArg vargs `thenSM` \ (vargs, args_uds_s, unlifts) ->
1332     returnSM (applyBindUnlifts unlifts (Prim (CCallOp str is_asm may_gc arg_tys res_ty) vargs),
1333               unionUDList args_uds_s)
1334
1335 specExpr (Prim prim args) null_args
1336   = ASSERT (null null_args)
1337     let
1338         (targs, vargs) = partition_args args
1339     in
1340     mapAndUnzipSM  specTyArg  targs `thenSM` \ (targs, tys) ->
1341     mapAndUnzip3SM specValArg vargs `thenSM` \ (vargs, args_uds_s, unlifts) ->
1342     -- specPrimOp prim tys              `thenSM` \ (prim, tys, prim_uds) ->
1343     returnSM (applyBindUnlifts unlifts (Prim prim (targs ++ vargs)),
1344               unionUDList args_uds_s {-`unionUDs` prim_uds-} )
1345
1346 {- ToDo: specPrimOp
1347
1348 specPrimOp :: PrimOp
1349            -> [Type]
1350            -> SpecM (PrimOp,
1351                      [Type],
1352                      UsageDetails)
1353
1354 -- Checks that PrimOp can handle (possibly unboxed) tys passed
1355 --   and/or chooses PrimOp specialised to any unboxed tys
1356 -- Errors are dealt with by returning a PrimOp call instance
1357 --   which will result in a cis_errs message
1358
1359 -- ToDo: Deal with checkSpecTyApp for Prim in CoreLint
1360 -}
1361
1362
1363 specExpr (App fun arg) args
1364   =     -- If TyArg, arg will be processed; otherwise, left alone
1365     preSpecArg arg                      `thenSM` \ new_arg    ->
1366     specExpr   fun (new_arg : args)     `thenSM` \ (expr,uds) ->
1367     returnSM (expr, uds)
1368
1369 specExpr (Lam (ValBinder binder) body) (arg : args) | isValArg arg
1370   = lookup_arg arg `thenSM` \ arg ->
1371     bindId binder arg (specExpr body args)
1372   where
1373     lookup_arg (LitArg l) = returnSM (NoLift (LitArg l))
1374     lookup_arg (VarArg v) = lookupId v
1375
1376 specExpr (Lam (ValBinder binder) body) []
1377   = specLambdaOrCaseBody [binder] body [] `thenSM` \ ([binder], body, uds) ->
1378     returnSM (Lam (ValBinder binder) body, uds)
1379
1380 specExpr (Lam (TyBinder tyvar) body) (TyArg ty : args)
1381   =     -- Type lambda with argument; argument already spec'd
1382     bindTyVar tyvar ty ( specExpr body args )
1383
1384 specExpr (Lam (TyBinder tyvar) body) []
1385   =     -- No arguments
1386     cloneTyVarSM tyvar          `thenSM` \ new_tyvar ->
1387     bindTyVar tyvar (mkTyVarTy new_tyvar) (
1388         specExpr body []        `thenSM` \ (body, body_uds) ->
1389         let
1390             (binds_here, final_uds) = dumpUDs body_uds False False [] [] [new_tyvar]
1391         in
1392         returnSM (Lam (TyBinder new_tyvar)
1393                       (mkCoLetsNoUnboxed binds_here body),
1394                   final_uds)
1395     )
1396
1397 specExpr (Case scrutinee alts) args
1398   = specExpr scrutinee []               `thenSM` \ (scrutinee, scrut_uds) ->
1399     specAlts alts scrutinee_type args   `thenSM` \ (alts, alts_uds) ->
1400     returnSM (Case scrutinee alts, scrut_uds `unionUDs`  alts_uds)
1401   where
1402     scrutinee_type = coreExprType scrutinee
1403
1404 specExpr (Let bind body) args
1405   = specBindAndScope False bind (
1406         specExpr body args      `thenSM` \ (body, body_uds) ->
1407         returnSM (ItsAnExpr body, body_uds)
1408     )                           `thenSM` \ (binds, ItsAnExpr body, all_uds) ->
1409     returnSM (mkCoLetsUnboxedToCase binds body, all_uds)
1410
1411 specExpr (SCC cc expr) args
1412   = specExpr expr []                `thenSM` \ (expr, expr_uds) ->
1413     mapAndUnzip3SM specOutArg args  `thenSM` \ (args, args_uds_s, unlifts) ->
1414     let
1415         scc_expr
1416           = if squashableDictishCcExpr cc expr -- can toss the _scc_
1417             then expr
1418             else SCC cc expr
1419     in
1420     returnSM (applyBindUnlifts unlifts (mkGenApp scc_expr args),
1421               unionUDList args_uds_s `unionUDs` expr_uds)
1422
1423 specExpr (Coerce _ _ _) args = panic "Specialise.specExpr:Coerce"
1424
1425 -- ToDo: This may leave some unspec'd dictionaries!!
1426 \end{code}
1427
1428 %************************************************************************
1429 %*                                                                      *
1430 \subsubsection{Specialising a lambda}
1431 %*                                                                      *
1432 %************************************************************************
1433
1434 \begin{code}
1435 specLambdaOrCaseBody :: [Id]                    -- The binders
1436                      -> CoreExpr                -- The body
1437                      -> [CoreArg]               -- Its args
1438                      -> SpecM ([Id],            -- New binders
1439                                CoreExpr,        -- New body
1440                                UsageDetails)
1441
1442 specLambdaOrCaseBody bound_ids body args
1443  = cloneLambdaOrCaseBinders bound_ids   `thenSM` \ (new_ids, clone_infos) ->
1444    bindIds bound_ids clone_infos (
1445
1446         specExpr body args      `thenSM` \ (body, body_uds) ->
1447
1448         let
1449             -- Dump any dictionary bindings (and call instances)
1450             -- from the scope which mention things bound here
1451             (binds_here, final_uds) = dumpUDs body_uds False False [] new_ids []
1452         in
1453         returnSM (new_ids, mkCoLetsNoUnboxed binds_here body, final_uds)
1454    )
1455
1456 -- ToDo: Opportunity here to common-up dictionaries with same type,
1457 -- thus avoiding recomputation.
1458 \end{code}
1459
1460 A variable bound in a lambda or case is normally monomorphic so no
1461 specialised versions will be required. This is just as well since we
1462 do not know what code to specialise!
1463
1464 Unfortunately this is not always the case. For example a class Foo
1465 with polymorphic methods gives rise to a dictionary with polymorphic
1466 components as follows:
1467
1468 \begin{verbatim}
1469 class Foo a where
1470   op1 :: a -> b -> a
1471   op2 :: a -> c -> a
1472
1473 instance Foo Int where
1474   op1 = op1Int
1475   op2 = op2Int
1476
1477 ... op1 1 3# ...
1478
1479 ==>
1480
1481 d.Foo.Int :: ( \/b . Int -> b -> Int, \/c . Int -> c -> Int )
1482 d.Foo.Int = (op1_Int, op2_Int)
1483
1484 op1 = /\ a b -> \ dFoo -> case dFoo of (meth1, _) -> meth1 b
1485
1486 ... op1 {Int Int#} d.Foo.Int 1 3# ...
1487 \end{verbatim}
1488
1489 N.B. The type of the dictionary is not Hindley Milner!
1490
1491 Now we must specialise op1 at {* Int#} which requires a version of
1492 meth1 at {Int#}. But since meth1 was extracted from a dictionary we do
1493 not have access to its code to create the specialised version.
1494
1495 If we specialise on overloaded types as well we specialise op1 at
1496 {Int Int#} d.Foo.Int:
1497
1498 op1_Int_Int# = case d.Foo.Int of (meth1, _) -> meth1 {Int#}
1499
1500 Though this is still invalid, after further simplification we get:
1501
1502 op1_Int_Int# = opInt1 {Int#}
1503
1504 Another round of specialisation will result in the specialised
1505 version of op1Int being called directly.
1506
1507 For now we PANIC if a polymorphic lambda/case bound variable is found
1508 in a call instance with an unboxed type. Other call instances, arising
1509 from overloaded type arguments, are discarded since the unspecialised
1510 version extracted from the method can be called as normal.
1511
1512 ToDo: Implement and test second round of specialisation.
1513
1514
1515 %************************************************************************
1516 %*                                                                      *
1517 \subsubsection{Specialising case alternatives}
1518 %*                                                                      *
1519 %************************************************************************
1520
1521
1522 \begin{code}
1523 specAlts (AlgAlts alts deflt) scrutinee_ty args
1524   = mapSM specTy ty_args                        `thenSM` \ ty_args ->
1525     mapAndUnzipSM (specAlgAlt ty_args) alts     `thenSM` \ (alts, alts_uds_s) ->
1526     specDeflt deflt args                        `thenSM` \ (deflt, deflt_uds) ->
1527     returnSM (AlgAlts alts deflt,
1528               unionUDList alts_uds_s `unionUDs` deflt_uds)
1529   where
1530     -- We use ty_args of scrutinee type to identify specialisation of
1531     -- alternatives:
1532
1533     (_, ty_args, _) = --trace "Specialise.specAlts:getAppData..." $
1534                       getAppDataTyConExpandingDicts scrutinee_ty
1535
1536     specAlgAlt ty_args (con,binders,rhs)
1537       = specLambdaOrCaseBody binders rhs args   `thenSM` \ (binders, rhs, rhs_uds) ->
1538         mkTyConInstance con ty_args             `thenSM` \ con_uds ->
1539         returnSM ((con,binders,rhs), rhs_uds `unionUDs` con_uds)
1540
1541 specAlts (PrimAlts alts deflt) scrutinee_ty args
1542   = mapAndUnzipSM specPrimAlt alts      `thenSM` \ (alts, alts_uds_s) ->
1543     specDeflt deflt args                `thenSM` \ (deflt, deflt_uds) ->
1544     returnSM (PrimAlts alts deflt,
1545               unionUDList alts_uds_s `unionUDs` deflt_uds)
1546   where
1547     specPrimAlt (lit,rhs) = specExpr rhs args   `thenSM` \ (rhs, uds) ->
1548                             returnSM ((lit,rhs), uds)
1549
1550
1551 specDeflt NoDefault args = returnSM (NoDefault, emptyUDs)
1552 specDeflt (BindDefault binder rhs) args
1553  = specLambdaOrCaseBody [binder] rhs args       `thenSM` \ ([binder], rhs, uds) ->
1554    returnSM (BindDefault binder rhs, uds)
1555 \end{code}
1556
1557
1558 %************************************************************************
1559 %*                                                                      *
1560 \subsubsection{Specialising an atom}
1561 %*                                                                      *
1562 %************************************************************************
1563
1564 \begin{code}
1565 partition_args :: [CoreArg] -> ([CoreArg], [CoreArg])
1566 partition_args args
1567   = span is_ty_arg args
1568   where
1569     is_ty_arg (TyArg _) = True
1570     is_ty_arg _         = False
1571
1572 ----------
1573 preSpecArg :: CoreArg -> SpecM CoreArg -- diddle TyArgs, but nothing else
1574
1575 preSpecArg (TyArg ty)
1576   = specTy ty   `thenSM` \ new_ty ->
1577     returnSM (TyArg new_ty)
1578
1579 preSpecArg other = returnSM other
1580
1581 --------------------
1582 specValArg :: CoreArg -> SpecM (CoreArg, UsageDetails,
1583                                 CoreExpr -> CoreExpr)
1584
1585 specValArg (LitArg lit)
1586   = returnSM (LitArg lit, emptyUDs, id)
1587
1588 specValArg (VarArg v)
1589   = lookupId v          `thenSM` \ vlookup ->
1590     case vlookup of
1591       Lifted vl vu
1592          -> returnSM (VarArg vu, singleFvUDs (VarArg vl), bindUnlift vl vu)
1593
1594       NoLift vatom
1595          -> returnSM (vatom, singleFvUDs vatom, id)
1596
1597
1598 ------------------
1599 specTyArg (TyArg ty)
1600   = specTy ty   `thenSM` \ new_ty ->
1601     returnSM (TyArg new_ty, new_ty)
1602
1603 --------------
1604 specOutArg :: CoreArg -> SpecM (CoreArg, UsageDetails,
1605                                   CoreExpr -> CoreExpr)
1606
1607 specOutArg (TyArg ty)   -- already speced; no action
1608   = returnSM (TyArg ty, emptyUDs, id)
1609
1610 specOutArg other_arg    -- unprocessed; spec the atom
1611   = specValArg other_arg
1612 \end{code}
1613
1614
1615 %************************************************************************
1616 %*                                                                      *
1617 \subsubsection{Specialising bindings}
1618 %*                                                                      *
1619 %************************************************************************
1620
1621 A classic case of when having a polymorphic recursive function would help!
1622
1623 \begin{code}
1624 data BindsOrExpr = ItsABinds [CoreBinding]
1625                  | ItsAnExpr CoreExpr
1626 \end{code}
1627
1628 \begin{code}
1629 specBindAndScope
1630         :: Bool                                 -- True <=> a top level group
1631         -> CoreBinding                  -- As yet unprocessed
1632         -> SpecM (BindsOrExpr, UsageDetails)    -- Something to do the scope of the bindings
1633         -> SpecM ([CoreBinding],                -- Processed
1634                   BindsOrExpr,                  -- Combined result
1635                   UsageDetails)                 -- Usage details of the whole lot
1636
1637 specBindAndScope top_lev bind scopeM
1638   = cloneLetBinders top_lev (is_rec bind) binders
1639                                 `thenSM` \ (new_binders, clone_infos) ->
1640
1641         -- Two cases now: either this is a bunch of local dictionaries,
1642         -- in which case we float them; or its a bunch of other values,
1643         -- in which case we see if they correspond to any call-instances
1644         -- we have from processing the scope
1645
1646     if not top_lev && all (isDictTy . idType) binders
1647     then
1648         -- Ha! A group of local dictionary bindings
1649
1650       bindIds binders clone_infos (
1651
1652                 -- Process the dictionary bindings themselves
1653         specBind False True new_binders [] bind `thenSM` \ (bind, rhs_uds) ->
1654
1655                 -- Process their scope
1656         scopeM                                  `thenSM` \ (thing, scope_uds) ->
1657         let
1658                 -- Add the bindings to the current stuff
1659             final_uds = addDictBinds new_binders bind rhs_uds scope_uds
1660         in
1661         returnSM ([], thing, final_uds)
1662       )
1663     else
1664         -- Ho! A group of bindings
1665
1666       fixSM (\ ~(_, _, _, rec_spec_infos) ->
1667
1668         bindSpecIds binders clone_infos rec_spec_infos (
1669                 -- It's ok to have new binders in scope in
1670                 -- non-recursive decls too, cos name shadowing is gone by now
1671
1672                 -- Do the scope of the bindings
1673           scopeM                                `thenSM` \ (thing, scope_uds) ->
1674           let
1675              (call_insts, gotci_scope_uds) = getCIs top_lev new_binders scope_uds
1676
1677              equiv_ciss = equivClasses cmpCI_tys call_insts
1678              inst_cis   = map head equiv_ciss
1679           in
1680
1681                 -- Do the bindings themselves
1682           specBind top_lev False new_binders inst_cis bind
1683                                                 `thenSM` \ (spec_bind, spec_uds) ->
1684
1685                 -- Create any necessary instances
1686           instBind top_lev new_binders bind equiv_ciss inst_cis
1687                                                 `thenSM` \ (inst_binds, inst_uds, spec_infos) ->
1688
1689           let
1690                 -- NB: dumpUDs only worries about new_binders since the free var
1691                 --     stuff only records free new_binders
1692                 --     The spec_ids only appear in SpecInfos and final speced calls
1693
1694                 -- Build final binding group and usage details
1695                 (final_binds, final_uds)
1696                   = if top_lev then
1697                         -- For a top-level binding we have to dumpUDs from
1698                         -- spec_uds and inst_uds and scope_uds creating
1699                         -- *global* dict bindings
1700                         let
1701                             (scope_dict_binds, final_scope_uds)
1702                               = dumpUDs gotci_scope_uds True False [] new_binders []
1703                             (spec_dict_binds, final_spec_uds)
1704                               = dumpUDs spec_uds True False inst_cis new_binders []
1705                             (inst_dict_binds, final_inst_uds)
1706                               = dumpUDs inst_uds True False inst_cis new_binders []
1707                         in
1708                         ([spec_bind] ++ inst_binds ++ scope_dict_binds
1709                            ++ spec_dict_binds ++ inst_dict_binds,
1710                          final_spec_uds `unionUDs` final_scope_uds `unionUDs` final_inst_uds)
1711                     else
1712                         -- For a local binding we only have to dumpUDs from
1713                         -- scope_uds since the UDs from spec_uds and inst_uds
1714                         -- have already been dumped by specBind and instBind
1715                         let
1716                             (scope_dict_binds, final_scope_uds)
1717                               = dumpUDs gotci_scope_uds False False [] new_binders []
1718                         in
1719                         ([spec_bind] ++ inst_binds ++ scope_dict_binds,
1720                          spec_uds `unionUDs` final_scope_uds `unionUDs` inst_uds)
1721
1722                 -- inst_uds comes last, because there may be dict bindings
1723                 -- floating outward in scope_uds which are mentioned
1724                 -- in the call-instances, and hence in spec_uds.
1725                 -- This ordering makes sure that the precedence order
1726                 -- among the dict bindings finally floated out is maintained.
1727           in
1728           returnSM (final_binds, thing, final_uds, spec_infos)
1729         )
1730       )                 `thenSM`        \ (binds, thing, final_uds, spec_infos) ->
1731       returnSM (binds, thing, final_uds)
1732   where
1733     binders = bindersOf bind
1734
1735     is_rec (NonRec _ _) = False
1736     is_rec _              = True
1737 \end{code}
1738
1739 \begin{code}
1740 specBind :: Bool -> Bool -> [Id] -> [CallInstance]
1741          -> CoreBinding
1742          -> SpecM (CoreBinding, UsageDetails)
1743         -- The UsageDetails returned has already had stuff to do with this group
1744         -- of binders deleted; that's why new_binders is passed in.
1745 specBind top_lev floating new_binders inst_cis (NonRec binder rhs)
1746   = specOneBinding top_lev floating new_binders inst_cis (binder,rhs)
1747                                                         `thenSM` \ ((binder,rhs), rhs_uds) ->
1748     returnSM (NonRec binder rhs, rhs_uds)
1749
1750 specBind top_lev floating new_binders inst_cis (Rec pairs)
1751   = mapAndUnzipSM (specOneBinding top_lev floating new_binders inst_cis) pairs
1752                                                         `thenSM` \ (pairs, rhs_uds_s) ->
1753     returnSM (Rec pairs, unionUDList rhs_uds_s)
1754
1755
1756 specOneBinding :: Bool -> Bool -> [Id] -> [CallInstance]
1757                -> (Id,CoreExpr)
1758                -> SpecM ((Id,CoreExpr), UsageDetails)
1759
1760 specOneBinding top_lev floating new_binders inst_cis (binder, rhs)
1761   = lookupId binder             `thenSM` \ blookup ->
1762     specExpr rhs []             `thenSM` \ (rhs, rhs_uds) ->
1763     let
1764         specid_maybe_maybe  = isSpecPragmaId_maybe binder
1765         is_specid           = maybeToBool specid_maybe_maybe
1766         Just specinfo_maybe = specid_maybe_maybe
1767         specid_with_info    = maybeToBool specinfo_maybe
1768         Just spec_info      = specinfo_maybe
1769
1770         -- If we have a SpecInfo stored in a SpecPragmaId binder
1771         -- it will contain a SpecInfo with an explicit SpecId
1772         -- We add the explicit ci to the usage details
1773         -- Any ordinary cis for orig_id (there should only be one)
1774         -- will be ignored later
1775
1776         pragma_uds
1777           = if is_specid && specid_with_info then
1778                 let
1779                     (SpecInfo spec_tys _ spec_id) = spec_info
1780                     Just (orig_id, _) = isSpecId_maybe spec_id
1781                 in
1782                 ASSERT(toplevelishId orig_id)     -- must not be cloned!
1783                 explicitCI orig_id spec_tys spec_info
1784             else
1785                 emptyUDs
1786
1787         -- For a local binding we dump the usage details, creating
1788         -- any local dict bindings required
1789         -- At the top-level the uds will be dumped in specBindAndScope
1790         -- and the dict bindings made *global*
1791
1792         (local_dict_binds, final_uds)
1793           = if not top_lev then
1794                 dumpUDs rhs_uds False floating inst_cis new_binders []
1795             else
1796                 ([], rhs_uds)
1797     in
1798     case blookup of
1799         Lifted lift_binder unlift_binder
1800           ->    -- We may need to record an unboxed instance of
1801                 -- the _Lift data type in the usage details
1802              mkTyConInstance liftDataCon [idType unlift_binder]
1803                                                 `thenSM` \ lift_uds ->
1804              returnSM ((lift_binder,
1805                         mkCoLetsNoUnboxed local_dict_binds (liftExpr unlift_binder rhs)),
1806                        final_uds `unionUDs` pragma_uds `unionUDs` lift_uds)
1807
1808         NoLift (VarArg binder)
1809           -> returnSM ((binder, mkCoLetsNoUnboxed local_dict_binds rhs),
1810                        final_uds `unionUDs` pragma_uds)
1811 \end{code}
1812
1813
1814 %************************************************************************
1815 %*                                                                      *
1816 \subsection{@instBind@}
1817 %*                                                                      *
1818 %************************************************************************
1819
1820 \begin{code}
1821 instBind top_lev new_ids@(first_binder:other_binders) bind equiv_ciss inst_cis
1822  | null equiv_ciss
1823  = returnSM ([], emptyUDs, [])
1824
1825  | all same_overloading other_binders
1826  =      -- For each call_inst, build an instance
1827    mapAndUnzip3SM do_this_class equiv_ciss
1828         `thenSM` \ (inst_binds, inst_uds_s, spec_infos) ->
1829
1830         -- Add in the remaining UDs
1831    returnSM (catMaybes inst_binds,
1832              unionUDList inst_uds_s,
1833              spec_infos
1834             )
1835
1836  | otherwise            -- Incompatible overloadings; see below by same_overloading
1837  = (if not (null (filter isUnboxedCI (concat equiv_ciss)))
1838     then pprTrace "dumpCIs: not same overloading ... WITH UNBOXED TYPES!\n"
1839     else if top_lev
1840     then pprTrace "dumpCIs: not same overloading ... top level \n"
1841     else (\ x y -> y)
1842    ) (ppHang (ppBesides [ppStr "{",
1843                          interppSP PprDebug new_ids,
1844                          ppStr "}"])
1845            4 (ppAboves [ppAboves (map (pprGenType PprDebug . idType) new_ids),
1846                         ppAboves (map pprCI (concat equiv_ciss))]))
1847    (returnSM ([], emptyUDs, []))
1848
1849  where
1850     (tyvar_tmpls, class_tyvar_pairs) = getIdOverloading first_binder
1851     tyvar_tmpl_tys = mkTyVarTys tyvar_tmpls
1852
1853     no_of_tyvars = length tyvar_tmpls
1854     no_of_dicts  = length class_tyvar_pairs
1855
1856     do_this_class equiv_cis
1857       = mkOneInst do_cis explicit_cis no_of_dicts top_lev inst_cis new_ids bind
1858       where
1859         (explicit_cis, normal_cis) = partition isExplicitCI equiv_cis
1860         do_cis = head (normal_cis ++ explicit_cis)
1861         -- must choose a normal_cis in preference since dict_args will
1862         -- not be defined for an explicit_cis
1863
1864         -- same_overloading tests whether the types of all the binders
1865         -- are "compatible"; ie have the same type and dictionary abstractions
1866         -- Almost always this is the case, because a recursive group is abstracted
1867         -- all together.  But, it can happen that it ain't the case, because of
1868         -- code generated from instance decls:
1869         --
1870         --      rec
1871         --        dfun.Foo.Int :: (forall a. a -> Int, Int)
1872         --        dfun.Foo.Int = (const.op1.Int, const.op2.Int)
1873         --
1874         --        const.op1.Int :: forall a. a -> Int
1875         --        const.op1.Int a = defm.Foo.op1 Int a dfun.Foo.Int
1876         --
1877         --        const.op2.Int :: Int
1878         --        const.op2.Int = 3
1879         --
1880         -- Note that the first two defns have different polymorphism, but they are
1881         -- mutually recursive!
1882
1883     same_overloading :: Id -> Bool
1884     same_overloading id
1885       = no_of_tyvars == length this_id_tyvars
1886         -- Same no of tyvars
1887         && no_of_dicts == length this_id_class_tyvar_pairs
1888         -- Same no of vdicts
1889         && and (zipWith same_ov class_tyvar_pairs this_id_class_tyvar_pairs)
1890         && length class_tyvar_pairs == length this_id_class_tyvar_pairs
1891         -- Same overloading
1892       where
1893         (this_id_tyvars, this_id_class_tyvar_pairs) = getIdOverloading id
1894         tyvar_pairs = this_id_tyvars `zip` tyvar_tmpls
1895
1896         same_ov (clas1,tyvar1) (clas2,tyvar2)
1897           = clas1  == clas2 &&
1898             tyvar1 == assoc "same_overloading" tyvar_pairs tyvar2
1899 \end{code}
1900
1901 OK, so we have:
1902         - a call instance                               eg f [t1,t2,t3] [d1,d2]
1903         - the rhs of the function                       eg orig_rhs
1904         - a constraint vector, saying which of          eg [T,F,T]
1905           the functions type args are constrained
1906           (ie overloaded)
1907
1908 We return a new definition
1909
1910         f@t1//t3 = /\a -> orig_rhs t1 a t3 d1 d2
1911
1912 The SpecInfo for f will be (the "2" indicates 2 dictionaries to eat)
1913
1914         SpecInfo [Just t1, Nothing, Just t3] 2 f@t1//t3
1915
1916 Based on this SpecInfo, a call instance of f
1917
1918         ...(f t1 t2 t3 d1 d2)...
1919
1920 should get replaced by
1921
1922         ...(f@t1//t3 t2)...
1923
1924 (But that is the business of @mkCall@.)
1925
1926 \begin{code}
1927 mkOneInst :: CallInstance
1928           -> [CallInstance]                     -- Any explicit cis for this inst
1929           -> Int                                -- No of dicts to specialise
1930           -> Bool                               -- Top level binders?
1931           -> [CallInstance]                     -- Instantiated call insts for binders
1932           -> [Id]                               -- New binders
1933           -> CoreBinding                        -- Unprocessed
1934           -> SpecM (Maybe CoreBinding,  -- Instantiated version of input
1935                     UsageDetails,
1936                     [Maybe SpecInfo]            -- One for each id in the original binding
1937                    )
1938
1939 mkOneInst do_cis@(CallInstance _ spec_tys dict_args _ _) explicit_cis
1940           no_of_dicts_to_specialise top_lev inst_cis new_ids orig_bind
1941   = newSpecIds new_ids spec_tys no_of_dicts_to_specialise
1942                                                         `thenSM` \ spec_ids ->
1943     newTyVars (length [() | Nothing <- spec_tys])       `thenSM` \ poly_tyvars ->
1944     let
1945         -- arg_tys is spec_tys with tyvars instead of the Nothing spec_tys
1946         -- which correspond to unspeciailsed args
1947         arg_tys  :: [Type]
1948         (_,arg_tys) = mapAccumL do_the_wotsit poly_tyvars spec_tys
1949
1950         args :: [CoreArg]
1951         args = map TyArg arg_tys ++ dict_args
1952
1953         (new_id:_) = new_ids
1954         (spec_id:_) = spec_ids
1955
1956         do_bind (NonRec orig_id rhs)
1957           = do_one_rhs (spec_id, new_id, (orig_id,rhs))
1958                                         `thenSM` \ (maybe_spec, rhs_uds, spec_info) ->
1959             case maybe_spec of
1960                 Just (spec_id, rhs) -> returnSM (Just (NonRec spec_id rhs), rhs_uds, [spec_info])
1961                 Nothing             -> returnSM (Nothing, rhs_uds, [spec_info])
1962
1963         do_bind (Rec pairs)
1964           = mapAndUnzip3SM do_one_rhs (zip3 spec_ids new_ids pairs)
1965                                         `thenSM` \ (maybe_pairs, rhss_uds_s, spec_infos) ->
1966             returnSM (Just (Rec (catMaybes maybe_pairs)),
1967                       unionUDList rhss_uds_s, spec_infos)
1968
1969         do_one_rhs (spec_id, new_id, (orig_id, orig_rhs))
1970
1971                 -- Avoid duplicating a spec which has already been created ...
1972                 -- This can arise in a Rec involving a dfun for which a
1973                 -- a specialised instance has been created but specialisation
1974                 -- "required" by one of the other Ids in the Rec
1975           | top_lev && maybeToBool lookup_orig_spec
1976           = (if opt_SpecialiseTrace
1977              then trace_nospec "  Exists: " orig_id
1978              else id) (
1979
1980             returnSM (Nothing, emptyUDs, Nothing)
1981             )
1982
1983                 -- Check for a (single) explicit call instance for this id
1984           | not (null explicit_cis_for_this_id)
1985           = ASSERT (length explicit_cis_for_this_id == 1)
1986             (if opt_SpecialiseTrace
1987              then trace_nospec "  Explicit: " explicit_id
1988              else id) (
1989
1990             returnSM (Nothing, tickSpecInsts emptyUDs, Just explicit_spec_info)
1991             )
1992
1993                 -- Apply the specialiser to (orig_rhs t1 a t3 d1 d2)
1994           | otherwise
1995           = ASSERT (no_of_dicts_to_specialise == length dict_args)
1996             specExpr orig_rhs args      `thenSM` \ (inst_rhs, inst_uds) ->
1997             let
1998                 -- For a local binding we dump the usage details, creating
1999                 -- any local dict bindings required
2000                 -- At the top-level the uds will be dumped in specBindAndScope
2001                 -- and the dict bindings made *global*
2002
2003                 (local_dict_binds, final_uds)
2004                   = if not top_lev then
2005                         dumpUDs inst_uds False False inst_cis new_ids []
2006                     else
2007                         ([], inst_uds)
2008
2009                 spec_info = Just (SpecInfo spec_tys no_of_dicts_to_specialise spec_id)
2010             in
2011             if isUnboxedType (idType spec_id) then
2012                 ASSERT (null poly_tyvars)
2013                 liftId spec_id          `thenSM` \ (lift_spec_id, unlift_spec_id) ->
2014                 mkTyConInstance liftDataCon [idType unlift_spec_id]
2015                                         `thenSM` \ lift_uds ->
2016                 returnSM (Just (lift_spec_id,
2017                                 mkCoLetsNoUnboxed local_dict_binds (liftExpr unlift_spec_id inst_rhs)),
2018                           tickSpecInsts (final_uds `unionUDs` lift_uds), spec_info)
2019             else
2020                 returnSM (Just (spec_id,
2021                                 mkCoLetsNoUnboxed local_dict_binds (mkTyLam poly_tyvars inst_rhs)),
2022                           tickSpecInsts final_uds, spec_info)
2023           where
2024             lookup_orig_spec = lookupSpecEnv (getIdSpecialisation orig_id) arg_tys
2025
2026             explicit_cis_for_this_id = filter (isCIofTheseIds [new_id]) explicit_cis
2027             [CallInstance _ _ _ _ (Just explicit_spec_info)] = explicit_cis_for_this_id
2028             SpecInfo _ _ explicit_id = explicit_spec_info
2029
2030             trace_nospec :: String -> Id -> a -> a
2031             trace_nospec str spec_id
2032               = pprTrace str
2033                 (ppCat [ppr PprDebug new_id, ppInterleave ppNil (map pp_ty arg_tys),
2034                         ppStr "==>", ppr PprDebug spec_id])
2035     in
2036     (if opt_SpecialiseTrace then
2037         pprTrace "Specialising:"
2038         (ppHang (ppBesides [ppStr "{",
2039                             interppSP PprDebug new_ids,
2040                             ppStr "}"])
2041               4 (ppAboves [
2042                  ppBesides [ppStr "types: ", ppInterleave ppNil (map pp_ty arg_tys)],
2043                  if isExplicitCI do_cis then ppNil else
2044                  ppBesides [ppStr "dicts: ", ppInterleave ppNil (map pp_dict dict_args)],
2045                  ppBesides [ppStr "specs: ", ppr PprDebug spec_ids]]))
2046      else id) (
2047
2048     do_bind orig_bind           `thenSM` \ (maybe_inst_bind, inst_uds, spec_infos) ->
2049
2050     returnSM (maybe_inst_bind, inst_uds, spec_infos)
2051     )
2052   where
2053     pp_dict d = ppr_arg PprDebug d
2054     pp_ty t   = pprParendGenType PprDebug t
2055
2056     do_the_wotsit (tyvar:tyvars) Nothing   = (tyvars, mkTyVarTy tyvar)
2057     do_the_wotsit tyvars         (Just ty) = (tyvars, ty)
2058
2059 \end{code}
2060
2061 %************************************************************************
2062 %*                                                                      *
2063 \subsection[Misc]{Miscellaneous junk}
2064 %*                                                                      *
2065 %************************************************************************
2066
2067 \begin{code}
2068 mkCallInstance :: Id
2069                -> Id
2070                -> [(CoreArg, UsageDetails, CoreExpr -> CoreExpr)]
2071                -> SpecM UsageDetails
2072
2073 mkCallInstance id new_id []
2074   = returnSM emptyUDs
2075
2076 mkCallInstance id new_id args
2077
2078         -- No specialised versions for "error" and friends are req'd.
2079         -- This is a special case in core lint etc.
2080
2081   | isBottomingId id
2082   = returnSM emptyUDs
2083
2084         -- No call instances for SuperDictSelIds
2085         -- These are a special case in mkCall
2086
2087   | maybeToBool (isSuperDictSelId_maybe id)
2088   = returnSM emptyUDs
2089
2090         -- There are also no call instances for ClassOpIds
2091         -- However, we need to process it to get any second-level call
2092         -- instances for a ConstMethodId extracted from its SpecEnv
2093
2094   | otherwise
2095   = let
2096         spec_overloading = opt_SpecialiseOverloaded
2097         spec_unboxed     = opt_SpecialiseUnboxed
2098         spec_all         = opt_SpecialiseAll
2099
2100         (tyvars, class_tyvar_pairs) = getIdOverloading id
2101
2102         arg_res = take_type_args tyvars class_tyvar_pairs args
2103         enough_args = maybeToBool arg_res
2104
2105         (Just (tys, dicts, rest_args)) = arg_res
2106
2107         record_spec id tys
2108           = (record, lookup, spec_tys)
2109           where
2110             spec_tys = specialiseCallTys spec_all spec_unboxed spec_overloading
2111                                          (mkConstraintVector id) tys
2112
2113             record = any (not . isTyVarTy) (catMaybes spec_tys)
2114
2115             lookup = lookupSpecEnv (getIdSpecialisation id) tys
2116     in
2117     if (not enough_args) then
2118         pprPanic "Specialise:recordCallInst: Unsaturated Type & Dict Application:\n\t"
2119                  (ppCat (ppr PprDebug id : map (ppr_arg PprDebug) [arg | (arg,_,_) <- args]))
2120     else
2121     case record_spec id tys of
2122         (False, _, _)
2123              -> -- pprTrace "CallInst:NotReqd\n"
2124                 -- (ppCat [ppr PprDebug id, ppCat (map (ppr PprDebug) args)])
2125                 (returnSM emptyUDs)
2126
2127         (True, Nothing, spec_tys)
2128              -> if isClassOpId id then  -- No CIs for class ops, dfun will give SPEC inst
2129                     returnSM emptyUDs
2130                 else
2131                     -- pprTrace "CallInst:Reqd\n"
2132                     -- (ppAboves [ppCat [ppr PprDebug id, ppCat (map (ppr PprDebug) args)],
2133                     --            ppCat [ppStr "CI", ppCat (map (pprMaybeTy PprDebug) spec_tys),
2134                     --                               ppCat (map (ppr PprDebug) dicts)]])
2135                     (returnSM (singleCI new_id spec_tys dicts))
2136
2137         (True, Just (spec_id, tys_left, toss), _)
2138              -> if maybeToBool (isConstMethodId_maybe spec_id) then
2139                         -- If we got a const method spec_id see if further spec required
2140                         -- NB: const method is top-level so spec_id will not be cloned
2141                     case record_spec spec_id tys_left of
2142                       (False, _, _)
2143                         -> -- pprTrace "CallInst:Exists\n"
2144                            -- (ppAboves [ppCat [ppr PprDebug id, ppCat (map (ppr PprDebug) args)],
2145                            --            ppCat [ppStr "->", ppr PprDebug spec_id,
2146                            --                   ppr PprDebug (tys_left ++ drop toss dicts)]])
2147                            (returnSM emptyUDs)
2148
2149                       (True, Nothing, spec_tys)
2150                         -> -- pprTrace "CallInst:Exists:Reqd\n"
2151                            -- (ppAboves [ppCat [ppr PprDebug id, ppCat (map (ppr PprDebug) args)],
2152                            --            ppCat [ppStr "->", ppr PprDebug spec_id,
2153                            --                   ppr PprDebug (tys_left ++ drop toss dicts)],
2154                            --            ppCat [ppStr "CI", ppCat (map (pprMaybeTy PprDebug) spec_tys),
2155                            --                               ppCat (map (ppr PprDebug) (drop toss dicts))]])
2156                            (returnSM (singleCI spec_id spec_tys (drop toss dicts)))
2157
2158                       (True, Just (spec_spec_id, tys_left_left, toss_toss), _)
2159                         -> -- pprTrace "CallInst:Exists:Exists\n"
2160                            -- (ppAboves [ppCat [ppr PprDebug id, ppCat (map (ppr PprDebug) args)],
2161                            --            ppCat [ppStr "->", ppr PprDebug spec_id,
2162                            --                   ppr PprDebug (tys_left ++ drop toss dicts)],
2163                            --            ppCat [ppStr "->", ppr PprDebug spec_spec_id,
2164                            --                   ppr PprDebug (tys_left_left ++ drop (toss + toss_toss) dicts)]])
2165                            (returnSM emptyUDs)
2166
2167                 else
2168                     -- pprTrace "CallInst:Exists\n"
2169                     -- (ppAboves [ppCat [ppr PprDebug id, ppCat (map (ppr PprDebug) args)],
2170                     --            ppCat [ppStr "->", ppr PprDebug spec_id,
2171                     --                   ppr PprDebug (tys_left ++ drop toss dicts)]])
2172                     (returnSM emptyUDs)
2173
2174
2175 take_type_args (_:tyvars) class_tyvar_pairs ((TyArg ty,_,_):args)
2176         = case (take_type_args tyvars class_tyvar_pairs args) of
2177             Nothing               -> Nothing
2178             Just (tys, dicts, others) -> Just (ty:tys, dicts, others)
2179
2180 take_type_args (_:tyvars) class_tyvar_pairs [] = Nothing
2181
2182 take_type_args [] class_tyvar_pairs args
2183         = case (take_dict_args class_tyvar_pairs args) of
2184             Nothing              -> Nothing
2185             Just (dicts, others) -> Just ([], dicts, others)
2186
2187 take_dict_args (_:class_tyvar_pairs) ((dict,_,_):args) | isValArg dict
2188         = case (take_dict_args class_tyvar_pairs args) of
2189             Nothing              -> Nothing
2190             Just (dicts, others) -> Just (dict:dicts, others)
2191
2192 take_dict_args (_:class_tyvar_pairs) [] = Nothing
2193
2194 take_dict_args [] args = Just ([], args)
2195 \end{code}
2196
2197 \begin{code}
2198 mkCall :: Id
2199        -> [(CoreArg, UsageDetails, CoreExpr -> CoreExpr)]
2200        -> SpecM CoreExpr
2201
2202 mkCall new_id arg_infos = returnSM (mkGenApp (Var new_id) [arg | (arg, _, _) <- arg_infos])
2203
2204 {- 
2205   | maybeToBool (isSuperDictSelId_maybe new_id)
2206     && any isUnboxedType ty_args
2207         -- No specialisations for super-dict selectors
2208         -- Specialise unboxed calls to SuperDictSelIds by extracting
2209         -- the super class dictionary directly form the super class
2210         -- NB: This should be dead code since all uses of this dictionary should
2211         --     have been specialised. We only do this to keep core-lint happy.
2212     = let
2213          Just (_, super_class) = isSuperDictSelId_maybe new_id
2214          super_dict_id = case lookupClassInstAtSimpleType super_class (head ty_args) of
2215                          Nothing -> panic "Specialise:mkCall:SuperDictId"
2216                          Just id -> id
2217       in
2218       returnSM (False, Var super_dict_id)
2219
2220   | otherwise
2221     = case lookupSpecEnv (getIdSpecialisation new_id) ty_args of
2222         Nothing -> checkUnspecOK new_id ty_args (
2223                    returnSM (False, unspec_call)
2224                    )
2225
2226         Just spec_1_details@(spec_id_1, tys_left_1, dicts_to_toss_1)
2227                 -> let
2228                         -- It may be necessary to specialsie a constant method spec_id again
2229                        (spec_id, tys_left, dicts_to_toss) =
2230                             case (maybeToBool (isConstMethodId_maybe spec_id_1),
2231                                   lookupSpecEnv (getIdSpecialisation spec_id_1) tys_left_1) of
2232                                  (False, _ )     -> spec_1_details
2233                                  (True, Nothing) -> spec_1_details
2234                                  (True, Just (spec_id_2, tys_left_2, dicts_to_toss_2))
2235                                                  -> (spec_id_2, tys_left_2, dicts_to_toss_1 + dicts_to_toss_2)
2236
2237                        args_left = toss_dicts dicts_to_toss val_args
2238                    in
2239                    checkSpecOK new_id ty_args spec_id tys_left (
2240
2241                         -- The resulting spec_id may be a top-level unboxed value
2242                         -- This can arise for:
2243                         -- 1) constant method values
2244                         --    eq: class Num a where pi :: a
2245                         --        instance Num Double# where pi = 3.141#
2246                         -- 2) specilised overloaded values
2247                         --    eq: i1 :: Num a => a
2248                         --        i1 Int# d.Num.Int# ==> i1.Int#
2249                         -- These top level defns should have been lifted.
2250                         -- We must add code to unlift such a spec_id.
2251
2252                    if isUnboxedType (idType spec_id) then
2253                        ASSERT (null tys_left && null args_left)
2254                        if toplevelishId spec_id then
2255                            liftId spec_id       `thenSM` \ (lift_spec_id, unlift_spec_id) ->
2256                            returnSM (True, bindUnlift lift_spec_id unlift_spec_id
2257                                                       (Var unlift_spec_id))
2258                        else
2259                            pprPanic "Specialise:mkCall: unboxed spec_id not top-level ...\n"
2260                                     (ppCat [ppr PprDebug new_id,
2261                                             ppInterleave ppNil (map (pprParendGenType PprDebug) ty_args),
2262                                             ppStr "==>",
2263                                             ppr PprDebug spec_id])
2264                    else
2265                    let
2266                        (vals_left, _, unlifts_left) = unzip3 args_left
2267                        applied_tys  = mkTyApp (Var spec_id) tys_left
2268                        applied_vals = mkGenApp applied_tys vals_left
2269                    in
2270                    returnSM (True, applyBindUnlifts unlifts_left applied_vals)
2271                    )
2272   where
2273     (tys_and_vals, _, unlifts) = unzip3 args
2274     unspec_call = applyBindUnlifts unlifts (mkGenApp (Var new_id) tys_and_vals)
2275
2276
2277         -- ty_args is the types at the front of the arg list
2278         -- val_args is the rest of the arg-list
2279
2280     (ty_args, val_args) = get args
2281       where
2282         get ((TyArg ty,_,_) : args) = (ty : tys, rest) where (tys,rest) = get args
2283         get args                    = ([],       args)
2284
2285
2286         -- toss_dicts chucks away dict args, checking that they ain't types!
2287     toss_dicts 0 args               = args
2288     toss_dicts n ((a,_,_) : args)
2289       | isValArg a                  = toss_dicts (n-1) args
2290
2291 \end{code}
2292
2293 \begin{code}
2294 checkUnspecOK :: Id -> [Type] -> a -> a
2295 checkUnspecOK check_id tys
2296   = if isLocallyDefined check_id && any isUnboxedType tys
2297     then pprPanic "Specialise:checkUnspecOK: unboxed instance for local id not found\n"
2298                   (ppCat [ppr PprDebug check_id,
2299                           ppInterleave ppNil (map (pprParendGenType PprDebug) tys)])
2300     else id
2301
2302 checkSpecOK :: Id -> [Type] -> Id -> [Type] -> a -> a
2303 checkSpecOK check_id tys spec_id tys_left
2304   = if any isUnboxedType tys_left
2305     then pprPanic "Specialise:checkSpecOK: unboxed type args in specialised application\n"
2306                   (ppAboves [ppCat [ppr PprDebug check_id,
2307                                     ppInterleave ppNil (map (pprParendGenType PprDebug) tys)],
2308                              ppCat [ppr PprDebug spec_id,
2309                                     ppInterleave ppNil (map (pprParendGenType PprDebug) tys_left)]])
2310     else id
2311 -}
2312 \end{code}
2313
2314 \begin{code}
2315 mkTyConInstance :: Id
2316                 -> [Type]
2317                 -> SpecM UsageDetails
2318 mkTyConInstance con tys
2319   = recordTyConInst con tys     `thenSM` \ record_inst ->
2320     case record_inst of
2321       Nothing                           -- No TyCon instance
2322         -> -- pprTrace "NoTyConInst:"
2323            -- (ppCat [ppr PprDebug tycon, ppStr "at",
2324            --         ppr PprDebug con, ppCat (map (ppr PprDebug) tys)])
2325            (returnSM (singleConUDs con))
2326
2327       Just spec_tys                     -- Record TyCon instance
2328         -> -- pprTrace "TyConInst:"
2329            -- (ppCat [ppr PprDebug tycon, ppStr "at",
2330            --         ppr PprDebug con, ppCat (map (ppr PprDebug) tys),
2331            --         ppBesides [ppStr "(",
2332            --                    ppCat [pprMaybeTy PprDebug ty | ty <- spec_tys],
2333            --                    ppStr ")"]])
2334            (returnSM (singleTyConI tycon spec_tys `unionUDs` singleConUDs con))
2335   where
2336     tycon = dataConTyCon con
2337 \end{code}
2338
2339 \begin{code}
2340 recordTyConInst :: Id
2341                 -> [Type]
2342                 -> SpecM (Maybe [Maybe Type])
2343
2344 recordTyConInst con tys
2345   = let
2346         spec_tys = specialiseConstrTys tys
2347
2348         do_tycon_spec = maybeToBool (firstJust spec_tys)
2349
2350         spec_exists = maybeToBool (lookupSpecEnv
2351                                       (getIdSpecialisation con)
2352                                       tys)
2353     in
2354     -- pprTrace "ConSpecExists?: "
2355     -- (ppAboves [ppStr (if spec_exists then "True" else "False"),
2356     --            ppr PprShowAll con, ppCat (map (ppr PprDebug) tys)])
2357     (if (not spec_exists && do_tycon_spec)
2358      then returnSM (Just spec_tys)
2359      else returnSM Nothing)
2360 \end{code}
2361
2362 %************************************************************************
2363 %*                                                                      *
2364 \subsection[monad-Specialise]{Monad used in specialisation}
2365 %*                                                                      *
2366 %************************************************************************
2367
2368 Monad has:
2369
2370  inherited: control flags and
2371             recordInst functions with flags cached
2372
2373             environment mapping tyvars to types
2374             environment mapping Ids to Atoms
2375
2376  threaded in and out: unique supply
2377
2378 \begin{code}
2379 type TypeEnv = TyVarEnv Type
2380
2381 type SpecM result
2382   =  TypeEnv
2383   -> SpecIdEnv
2384   -> UniqSupply
2385   -> result
2386
2387 initSM m uniqs
2388   = m nullTyVarEnv nullIdEnv uniqs
2389
2390 returnSM :: a -> SpecM a
2391 thenSM   :: SpecM a -> (a -> SpecM b) -> SpecM b
2392 fixSM    :: (a -> SpecM a) -> SpecM a
2393
2394 thenSM m k tvenv idenv us
2395   = case splitUniqSupply us        of { (s1, s2) ->
2396     case (m tvenv idenv s1) of { r ->
2397     k r tvenv idenv s2 }}
2398
2399 returnSM r tvenv idenv us = r
2400
2401 fixSM k tvenv idenv us
2402  = r
2403  where
2404    r = k r tvenv idenv us       -- Recursive in r!
2405 \end{code}
2406
2407 The only interesting bit is figuring out the type of the SpecId!
2408
2409 \begin{code}
2410 newSpecIds :: [Id]              -- The id of which to make a specialised version
2411            -> [Maybe Type]      -- Specialise to these types
2412            -> Int               -- No of dicts to specialise
2413            -> SpecM [Id]
2414
2415 newSpecIds new_ids maybe_tys dicts_to_ignore tvenv idenv us
2416   = [ mkSpecId uniq id maybe_tys (spec_id_ty id) (selectIdInfoForSpecId id)
2417       | (id,uniq) <- zipEqual "newSpecIds" new_ids uniqs ]
2418   where
2419     uniqs = getUniques (length new_ids) us
2420     spec_id_ty id = specialiseTy (idType id) maybe_tys dicts_to_ignore
2421
2422 newTyVars :: Int -> SpecM [TyVar]
2423 newTyVars n tvenv idenv us 
2424   = [mkSysTyVar uniq mkBoxedTypeKind | uniq <- getUniques n us]
2425 \end{code}
2426
2427 @cloneLambdaOrCaseBinders@ and @cloneLetBinders@ take a bunch of
2428 binders, and build ``clones'' for them.  The clones differ from the
2429 originals in three ways:
2430
2431         (a) they have a fresh unique
2432         (b) they have the current type environment applied to their type
2433         (c) for Let binders which have been specialised to unboxed values
2434             the clone will have a lifted type
2435
2436 As well as returning the list of cloned @Id@s they also return a list of
2437 @CloneInfo@s which the original binders should be bound to.
2438
2439 \begin{code}
2440 cloneLambdaOrCaseBinders :: [Id]                        -- Old binders
2441                          -> SpecM ([Id], [CloneInfo])   -- New ones
2442
2443 cloneLambdaOrCaseBinders old_ids tvenv idenv us
2444   = let
2445         uniqs = getUniques (length old_ids) us
2446     in
2447     unzip (zipWithEqual "cloneLambdaOrCaseBinders" clone_it old_ids uniqs)
2448   where
2449     clone_it old_id uniq
2450       = (new_id, NoLift (VarArg new_id))
2451       where
2452         new_id = applyTypeEnvToId tvenv (mkIdWithNewUniq old_id uniq)
2453
2454 cloneLetBinders :: Bool                         -- Top level ?
2455                 -> Bool                         -- Recursice
2456                 -> [Id]                         -- Old binders
2457                 -> SpecM ([Id], [CloneInfo])    -- New ones
2458
2459 cloneLetBinders top_lev is_rec old_ids tvenv idenv us
2460   = let
2461         uniqs = getUniques (2 * length old_ids) us
2462     in
2463     unzip (clone_them old_ids uniqs)
2464   where
2465     clone_them [] [] = []
2466
2467     clone_them (old_id:olds) (u1:u2:uniqs)
2468       | top_lev
2469         = (old_id,
2470            NoLift (VarArg old_id)) : clone_rest
2471
2472          -- Don't clone if it is a top-level thing. Why not?
2473          -- (a) we don't want to change the uniques
2474          --     on such things
2475          -- (b) we don't have to be paranoid about name capture
2476          -- (c) the thing is polymorphic so no need to subst
2477
2478       | otherwise
2479         = if (is_rec && isUnboxedType new_ty && not (isUnboxedType old_ty))
2480           then (lifted_id,
2481                 Lifted lifted_id unlifted_id) : clone_rest
2482           else (new_id,
2483                 NoLift (VarArg new_id)) : clone_rest
2484
2485       where
2486         clone_rest = clone_them olds uniqs
2487
2488         new_id = applyTypeEnvToId tvenv (mkIdWithNewUniq old_id u1)
2489         new_ty = idType new_id
2490         old_ty = idType old_id
2491
2492         (lifted_id, unlifted_id) = mkLiftedId new_id u2
2493
2494
2495 cloneTyVarSM :: TyVar -> SpecM TyVar
2496
2497 cloneTyVarSM old_tyvar tvenv idenv us
2498   = let
2499         uniq = getUnique us
2500     in
2501     cloneTyVar old_tyvar uniq -- new_tyvar
2502
2503 bindId :: Id -> CloneInfo -> SpecM thing -> SpecM thing
2504
2505 bindId id val specm tvenv idenv us
2506  = specm tvenv (addOneToIdEnv idenv id val) us
2507
2508 bindIds :: [Id] -> [CloneInfo] -> SpecM thing -> SpecM thing
2509
2510 bindIds olds news specm tvenv idenv us
2511  = specm tvenv (growIdEnvList idenv (zip olds news)) us
2512
2513 bindSpecIds :: [Id]                     -- Old
2514             -> [(CloneInfo)]            -- New
2515             -> [[Maybe SpecInfo]]       -- Corresponding specialisations
2516                                         -- Each sub-list corresponds to a different type,
2517                                         -- and contains one Maybe spec_info for each id
2518             -> SpecM thing
2519             -> SpecM thing
2520
2521 bindSpecIds olds clones spec_infos specm tvenv idenv us
2522  = specm tvenv (growIdEnvList idenv old_to_clone) us
2523  where
2524    old_to_clone = mk_old_to_clone olds clones spec_infos
2525
2526    -- The important thing here is that we are *lazy* in spec_infos
2527    mk_old_to_clone [] [] _ = []
2528    mk_old_to_clone (old:rest_olds) (clone:rest_clones) spec_infos
2529      = (old, add_spec_info clone) :
2530        mk_old_to_clone rest_olds rest_clones spec_infos_rest
2531      where
2532        add_spec_info (NoLift (VarArg new))
2533          = NoLift (VarArg (new `addIdSpecialisation`
2534                                   (mkSpecEnv spec_infos_this_id)))
2535        add_spec_info lifted
2536          = lifted               -- no specialised instances for unboxed lifted values
2537
2538        spec_infos_this_id = catMaybes (map head spec_infos)
2539        spec_infos_rest    = map tail spec_infos
2540
2541
2542 bindTyVar :: TyVar -> Type -> SpecM thing -> SpecM thing
2543
2544 bindTyVar tyvar ty specm tvenv idenv us
2545  = specm (growTyVarEnvList tvenv [(tyvar,ty)]) idenv us
2546 \end{code}
2547
2548 \begin{code}
2549 lookupId :: Id -> SpecM CloneInfo
2550
2551 lookupId id tvenv idenv us
2552   = case lookupIdEnv idenv id of
2553       Nothing   -> NoLift (VarArg id)
2554       Just info -> info
2555 \end{code}
2556
2557 \begin{code}
2558 specTy :: Type -> SpecM Type    -- Apply the current type envt to the type
2559
2560 specTy ty tvenv idenv us
2561   = applyTypeEnvToTy tvenv ty
2562 \end{code}
2563
2564 \begin{code}
2565 liftId :: Id -> SpecM (Id, Id)
2566 liftId id tvenv idenv us
2567   = let
2568         uniq = getUnique us
2569     in
2570     mkLiftedId id uniq
2571 \end{code}
2572
2573 In other monads these @mapSM@ things are usually called @listM@.
2574 I think @mapSM@ is a much better name.  The `2' and `3' variants are
2575 when you want to return two or three results, and get at them
2576 separately.  It saves you having to do an (unzip stuff) right after.
2577
2578 \begin{code}
2579 mapSM          :: (a -> SpecM b)            -> [a] -> SpecM [b]
2580 mapAndUnzipSM  :: (a -> SpecM (b1, b2))     -> [a] -> SpecM ([b1],[b2])
2581 mapAndUnzip3SM :: (a -> SpecM (b1, b2, b3)) -> [a] -> SpecM ([b1],[b2],[b3])
2582 mapAndUnzip4SM :: (a -> SpecM (b1, b2, b3, b4)) -> [a] -> SpecM ([b1],[b2],[b3],[b4])
2583
2584 mapSM f [] = returnSM []
2585 mapSM f (x:xs) = f x            `thenSM` \ r ->
2586                  mapSM f xs     `thenSM` \ rs ->
2587                  returnSM (r:rs)
2588
2589 mapAndUnzipSM f [] = returnSM ([],[])
2590 mapAndUnzipSM f (x:xs) = f x                    `thenSM` \ (r1, r2) ->
2591                          mapAndUnzipSM f xs     `thenSM` \ (rs1,rs2) ->
2592                          returnSM ((r1:rs1),(r2:rs2))
2593
2594 mapAndUnzip3SM f [] = returnSM ([],[],[])
2595 mapAndUnzip3SM f (x:xs) = f x                   `thenSM` \ (r1,r2,r3) ->
2596                           mapAndUnzip3SM f xs   `thenSM` \ (rs1,rs2,rs3) ->
2597                           returnSM ((r1:rs1),(r2:rs2),(r3:rs3))
2598
2599 mapAndUnzip4SM f [] = returnSM ([],[],[],[])
2600 mapAndUnzip4SM f (x:xs) = f x                   `thenSM` \ (r1,r2,r3,r4) ->
2601                           mapAndUnzip4SM f xs   `thenSM` \ (rs1,rs2,rs3,rs4) ->
2602                           returnSM ((r1:rs1),(r2:rs2),(r3:rs3),(r4:rs4))
2603 \end{code}