Use OPTIONS rather than OPTIONS_GHC for pragmas
[ghc-hetmet.git] / compiler / specialise / SpecConstr.lhs
1 %
2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
3 %
4 \section[SpecConstr]{Specialise over constructors}
5
6 \begin{code}
7 {-# OPTIONS -w #-}
8 -- The above warning supression flag is a temporary kludge.
9 -- While working on this module you are encouraged to remove it and fix
10 -- any warnings in the module. See
11 --     http://hackage.haskell.org/trac/ghc/wiki/CodingStyle#Warnings
12 -- for details
13
14 module SpecConstr(
15         specConstrProgram       
16     ) where
17
18 #include "HsVersions.h"
19
20 import CoreSyn
21 import CoreSubst
22 import CoreUtils
23 import CoreUnfold       ( couldBeSmallEnoughToInline )
24 import CoreLint         ( showPass, endPass )
25 import CoreFVs          ( exprsFreeVars )
26 import CoreTidy         ( tidyRules )
27 import PprCore          ( pprRules )
28 import WwLib            ( mkWorkerArgs )
29 import DataCon          ( dataConRepArity, dataConUnivTyVars )
30 import Type             ( Type, tyConAppArgs )
31 import Coercion         ( coercionKind )
32 import Id               ( Id, idName, idType, isDataConWorkId_maybe, idArity,
33                           mkUserLocal, mkSysLocal, idUnfolding, isLocalId )
34 import Var              ( Var )
35 import VarEnv
36 import VarSet
37 import Name
38 import Rules            ( addIdSpecialisations, mkLocalRule, rulesOfBinds )
39 import OccName          ( mkSpecOcc )
40 import ErrUtils         ( dumpIfSet_dyn )
41 import DynFlags         ( DynFlags(..), DynFlag(..) )
42 import BasicTypes       ( Activation(..) )
43 import Maybes           ( orElse, catMaybes, isJust )
44 import Util
45 import List             ( nubBy, partition )
46 import UniqSupply
47 import Outputable
48 import FastString
49 import UniqFM
50 \end{code}
51
52 -----------------------------------------------------
53                         Game plan
54 -----------------------------------------------------
55
56 Consider
57         drop n []     = []
58         drop 0 xs     = []
59         drop n (x:xs) = drop (n-1) xs
60
61 After the first time round, we could pass n unboxed.  This happens in
62 numerical code too.  Here's what it looks like in Core:
63
64         drop n xs = case xs of
65                       []     -> []
66                       (y:ys) -> case n of 
67                                   I# n# -> case n# of
68                                              0 -> []
69                                              _ -> drop (I# (n# -# 1#)) xs
70
71 Notice that the recursive call has an explicit constructor as argument.
72 Noticing this, we can make a specialised version of drop
73         
74         RULE: drop (I# n#) xs ==> drop' n# xs
75
76         drop' n# xs = let n = I# n# in ...orig RHS...
77
78 Now the simplifier will apply the specialisation in the rhs of drop', giving
79
80         drop' n# xs = case xs of
81                       []     -> []
82                       (y:ys) -> case n# of
83                                   0 -> []
84                                   _ -> drop (n# -# 1#) xs
85
86 Much better!  
87
88 We'd also like to catch cases where a parameter is carried along unchanged,
89 but evaluated each time round the loop:
90
91         f i n = if i>0 || i>n then i else f (i*2) n
92
93 Here f isn't strict in n, but we'd like to avoid evaluating it each iteration.
94 In Core, by the time we've w/wd (f is strict in i) we get
95
96         f i# n = case i# ># 0 of
97                    False -> I# i#
98                    True  -> case n of n' { I# n# ->
99                             case i# ># n# of
100                                 False -> I# i#
101                                 True  -> f (i# *# 2#) n'
102
103 At the call to f, we see that the argument, n is know to be (I# n#),
104 and n is evaluated elsewhere in the body of f, so we can play the same
105 trick as above.  
106
107
108 Note [Reboxing]
109 ~~~~~~~~~~~~~~~
110 We must be careful not to allocate the same constructor twice.  Consider
111         f p = (...(case p of (a,b) -> e)...p...,
112                ...let t = (r,s) in ...t...(f t)...)
113 At the recursive call to f, we can see that t is a pair.  But we do NOT want
114 to make a specialised copy:
115         f' a b = let p = (a,b) in (..., ...)
116 because now t is allocated by the caller, then r and s are passed to the
117 recursive call, which allocates the (r,s) pair again.
118
119 This happens if
120   (a) the argument p is used in other than a case-scrutinsation way.
121   (b) the argument to the call is not a 'fresh' tuple; you have to
122         look into its unfolding to see that it's a tuple
123
124 Hence the "OR" part of Note [Good arguments] below.
125
126 ALTERNATIVE 2: pass both boxed and unboxed versions.  This no longer saves
127 allocation, but does perhaps save evals. In the RULE we'd have
128 something like
129
130   f (I# x#) = f' (I# x#) x#
131
132 If at the call site the (I# x) was an unfolding, then we'd have to
133 rely on CSE to eliminate the duplicate allocation.... This alternative
134 doesn't look attractive enough to pursue.
135
136 ALTERNATIVE 3: ignore the reboxing problem.  The trouble is that 
137 the conservative reboxing story prevents many useful functions from being
138 specialised.  Example:
139         foo :: Maybe Int -> Int -> Int
140         foo   (Just m) 0 = 0
141         foo x@(Just m) n = foo x (n-m)
142 Here the use of 'x' will clearly not require boxing in the specialised function.
143
144 The strictness analyser has the same problem, in fact.  Example:
145         f p@(a,b) = ...
146 If we pass just 'a' and 'b' to the worker, it might need to rebox the
147 pair to create (a,b).  A more sophisticated analysis might figure out
148 precisely the cases in which this could happen, but the strictness
149 analyser does no such analysis; it just passes 'a' and 'b', and hopes
150 for the best.
151
152 So my current choice is to make SpecConstr similarly aggressive, and
153 ignore the bad potential of reboxing.
154
155
156 Note [Good arguments]
157 ~~~~~~~~~~~~~~~~~~~~~
158 So we look for
159
160 * A self-recursive function.  Ignore mutual recursion for now, 
161   because it's less common, and the code is simpler for self-recursion.
162
163 * EITHER
164
165    a) At a recursive call, one or more parameters is an explicit 
166       constructor application
167         AND
168       That same parameter is scrutinised by a case somewhere in 
169       the RHS of the function
170
171   OR
172
173     b) At a recursive call, one or more parameters has an unfolding
174        that is an explicit constructor application
175         AND
176       That same parameter is scrutinised by a case somewhere in 
177       the RHS of the function
178         AND
179       Those are the only uses of the parameter (see Note [Reboxing])
180
181
182 What to abstract over
183 ~~~~~~~~~~~~~~~~~~~~~
184 There's a bit of a complication with type arguments.  If the call
185 site looks like
186
187         f p = ...f ((:) [a] x xs)...
188
189 then our specialised function look like
190
191         f_spec x xs = let p = (:) [a] x xs in ....as before....
192
193 This only makes sense if either
194   a) the type variable 'a' is in scope at the top of f, or
195   b) the type variable 'a' is an argument to f (and hence fs)
196
197 Actually, (a) may hold for value arguments too, in which case
198 we may not want to pass them.  Supose 'x' is in scope at f's
199 defn, but xs is not.  Then we'd like
200
201         f_spec xs = let p = (:) [a] x xs in ....as before....
202
203 Similarly (b) may hold too.  If x is already an argument at the
204 call, no need to pass it again.
205
206 Finally, if 'a' is not in scope at the call site, we could abstract
207 it as we do the term variables:
208
209         f_spec a x xs = let p = (:) [a] x xs in ...as before...
210
211 So the grand plan is:
212
213         * abstract the call site to a constructor-only pattern
214           e.g.  C x (D (f p) (g q))  ==>  C s1 (D s2 s3)
215
216         * Find the free variables of the abstracted pattern
217
218         * Pass these variables, less any that are in scope at
219           the fn defn.  But see Note [Shadowing] below.
220
221
222 NOTICE that we only abstract over variables that are not in scope,
223 so we're in no danger of shadowing variables used in "higher up"
224 in f_spec's RHS.
225
226
227 Note [Shadowing]
228 ~~~~~~~~~~~~~~~~
229 In this pass we gather up usage information that may mention variables
230 that are bound between the usage site and the definition site; or (more
231 seriously) may be bound to something different at the definition site.
232 For example:
233
234         f x = letrec g y v = let x = ... 
235                              in ...(g (a,b) x)...
236
237 Since 'x' is in scope at the call site, we may make a rewrite rule that 
238 looks like
239         RULE forall a,b. g (a,b) x = ...
240 But this rule will never match, because it's really a different 'x' at 
241 the call site -- and that difference will be manifest by the time the
242 simplifier gets to it.  [A worry: the simplifier doesn't *guarantee*
243 no-shadowing, so perhaps it may not be distinct?]
244
245 Anyway, the rule isn't actually wrong, it's just not useful.  One possibility
246 is to run deShadowBinds before running SpecConstr, but instead we run the
247 simplifier.  That gives the simplest possible program for SpecConstr to
248 chew on; and it virtually guarantees no shadowing.
249
250 Note [Specialising for constant parameters]
251 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
252 This one is about specialising on a *constant* (but not necessarily
253 constructor) argument
254
255     foo :: Int -> (Int -> Int) -> Int
256     foo 0 f = 0
257     foo m f = foo (f m) (+1)
258
259 It produces
260
261     lvl_rmV :: GHC.Base.Int -> GHC.Base.Int
262     lvl_rmV =
263       \ (ds_dlk :: GHC.Base.Int) ->
264         case ds_dlk of wild_alH { GHC.Base.I# x_alG ->
265         GHC.Base.I# (GHC.Prim.+# x_alG 1)
266
267     T.$wfoo :: GHC.Prim.Int# -> (GHC.Base.Int -> GHC.Base.Int) ->
268     GHC.Prim.Int#
269     T.$wfoo =
270       \ (ww_sme :: GHC.Prim.Int#) (w_smg :: GHC.Base.Int -> GHC.Base.Int) ->
271         case ww_sme of ds_Xlw {
272           __DEFAULT ->
273         case w_smg (GHC.Base.I# ds_Xlw) of w1_Xmo { GHC.Base.I# ww1_Xmz ->
274         T.$wfoo ww1_Xmz lvl_rmV
275         };
276           0 -> 0
277         }
278
279 The recursive call has lvl_rmV as its argument, so we could create a specialised copy
280 with that argument baked in; that is, not passed at all.   Now it can perhaps be inlined.
281
282 When is this worth it?  Call the constant 'lvl'
283 - If 'lvl' has an unfolding that is a constructor, see if the corresponding
284   parameter is scrutinised anywhere in the body.
285
286 - If 'lvl' has an unfolding that is a inlinable function, see if the corresponding
287   parameter is applied (...to enough arguments...?)
288
289   Also do this is if the function has RULES?
290
291 Also    
292
293 Note [Specialising for lambda parameters]
294 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
295     foo :: Int -> (Int -> Int) -> Int
296     foo 0 f = 0
297     foo m f = foo (f m) (\n -> n-m)
298
299 This is subtly different from the previous one in that we get an
300 explicit lambda as the argument:
301
302     T.$wfoo :: GHC.Prim.Int# -> (GHC.Base.Int -> GHC.Base.Int) ->
303     GHC.Prim.Int#
304     T.$wfoo =
305       \ (ww_sm8 :: GHC.Prim.Int#) (w_sma :: GHC.Base.Int -> GHC.Base.Int) ->
306         case ww_sm8 of ds_Xlr {
307           __DEFAULT ->
308         case w_sma (GHC.Base.I# ds_Xlr) of w1_Xmf { GHC.Base.I# ww1_Xmq ->
309         T.$wfoo
310           ww1_Xmq
311           (\ (n_ad3 :: GHC.Base.Int) ->
312              case n_ad3 of wild_alB { GHC.Base.I# x_alA ->
313              GHC.Base.I# (GHC.Prim.-# x_alA ds_Xlr)
314              })
315         };
316           0 -> 0
317         }
318
319 I wonder if SpecConstr couldn't be extended to handle this? After all,
320 lambda is a sort of constructor for functions and perhaps it already
321 has most of the necessary machinery?
322
323 Furthermore, there's an immediate win, because you don't need to allocate the lamda
324 at the call site; and if perchance it's called in the recursive call, then you
325 may avoid allocating it altogether.  Just like for constructors.
326
327 Looks cool, but probably rare...but it might be easy to implement.
328
329
330 Note [SpecConstr for casts]
331 ~~~~~~~~~~~~~~~~~~~~~~~~~~~
332 Consider 
333     data family T a :: *
334     data instance T Int = T Int
335
336     foo n = ...
337        where
338          go (T 0) = 0
339          go (T n) = go (T (n-1))
340
341 The recursive call ends up looking like 
342         go (T (I# ...) `cast` g)
343 So we want to spot the construtor application inside the cast.
344 That's why we have the Cast case in argToPat
345
346
347 -----------------------------------------------------
348                 Stuff not yet handled
349 -----------------------------------------------------
350
351 Here are notes arising from Roman's work that I don't want to lose.
352
353 Example 1
354 ~~~~~~~~~
355     data T a = T !a
356
357     foo :: Int -> T Int -> Int
358     foo 0 t = 0
359     foo x t | even x    = case t of { T n -> foo (x-n) t }
360             | otherwise = foo (x-1) t
361
362 SpecConstr does no specialisation, because the second recursive call
363 looks like a boxed use of the argument.  A pity.
364
365     $wfoo_sFw :: GHC.Prim.Int# -> T.T GHC.Base.Int -> GHC.Prim.Int#
366     $wfoo_sFw =
367       \ (ww_sFo [Just L] :: GHC.Prim.Int#) (w_sFq [Just L] :: T.T GHC.Base.Int) ->
368          case ww_sFo of ds_Xw6 [Just L] {
369            __DEFAULT ->
370                 case GHC.Prim.remInt# ds_Xw6 2 of wild1_aEF [Dead Just A] {
371                   __DEFAULT -> $wfoo_sFw (GHC.Prim.-# ds_Xw6 1) w_sFq;
372                   0 ->
373                     case w_sFq of wild_Xy [Just L] { T.T n_ad5 [Just U(L)] ->
374                     case n_ad5 of wild1_aET [Just A] { GHC.Base.I# y_aES [Just L] ->
375                     $wfoo_sFw (GHC.Prim.-# ds_Xw6 y_aES) wild_Xy
376                     } } };
377            0 -> 0
378
379 Example 2
380 ~~~~~~~~~
381     data a :*: b = !a :*: !b
382     data T a = T !a
383
384     foo :: (Int :*: T Int) -> Int
385     foo (0 :*: t) = 0
386     foo (x :*: t) | even x    = case t of { T n -> foo ((x-n) :*: t) }
387                   | otherwise = foo ((x-1) :*: t)
388
389 Very similar to the previous one, except that the parameters are now in
390 a strict tuple. Before SpecConstr, we have
391
392     $wfoo_sG3 :: GHC.Prim.Int# -> T.T GHC.Base.Int -> GHC.Prim.Int#
393     $wfoo_sG3 =
394       \ (ww_sFU [Just L] :: GHC.Prim.Int#) (ww_sFW [Just L] :: T.T
395     GHC.Base.Int) ->
396         case ww_sFU of ds_Xws [Just L] {
397           __DEFAULT ->
398         case GHC.Prim.remInt# ds_Xws 2 of wild1_aEZ [Dead Just A] {
399           __DEFAULT ->
400             case ww_sFW of tpl_B2 [Just L] { T.T a_sFo [Just A] ->
401             $wfoo_sG3 (GHC.Prim.-# ds_Xws 1) tpl_B2             -- $wfoo1
402             };
403           0 ->
404             case ww_sFW of wild_XB [Just A] { T.T n_ad7 [Just S(L)] ->
405             case n_ad7 of wild1_aFd [Just L] { GHC.Base.I# y_aFc [Just L] ->
406             $wfoo_sG3 (GHC.Prim.-# ds_Xws y_aFc) wild_XB        -- $wfoo2
407             } } };
408           0 -> 0 }
409
410 We get two specialisations:
411 "SC:$wfoo1" [0] __forall {a_sFB :: GHC.Base.Int sc_sGC :: GHC.Prim.Int#}
412                   Foo.$wfoo sc_sGC (Foo.T @ GHC.Base.Int a_sFB)
413                   = Foo.$s$wfoo1 a_sFB sc_sGC ;
414 "SC:$wfoo2" [0] __forall {y_aFp :: GHC.Prim.Int# sc_sGC :: GHC.Prim.Int#}
415                   Foo.$wfoo sc_sGC (Foo.T @ GHC.Base.Int (GHC.Base.I# y_aFp))
416                   = Foo.$s$wfoo y_aFp sc_sGC ;
417
418 But perhaps the first one isn't good.  After all, we know that tpl_B2 is
419 a T (I# x) really, because T is strict and Int has one constructor.  (We can't
420 unbox the strict fields, becuase T is polymorphic!)
421
422
423
424 %************************************************************************
425 %*                                                                      *
426 \subsection{Top level wrapper stuff}
427 %*                                                                      *
428 %************************************************************************
429
430 \begin{code}
431 specConstrProgram :: DynFlags -> UniqSupply -> [CoreBind] -> IO [CoreBind]
432 specConstrProgram dflags us binds
433   = do
434         showPass dflags "SpecConstr"
435
436         let (binds', _) = initUs us (go (initScEnv dflags) binds)
437
438         endPass dflags "SpecConstr" Opt_D_dump_spec binds'
439
440         dumpIfSet_dyn dflags Opt_D_dump_rules "Top-level specialisations"
441                   (pprRules (tidyRules emptyTidyEnv (rulesOfBinds binds')))
442
443         return binds'
444   where
445     go env []           = returnUs []
446     go env (bind:binds) = scBind env bind       `thenUs` \ (env', _, bind') ->
447                           go env' binds         `thenUs` \ binds' ->
448                           returnUs (bind' : binds')
449 \end{code}
450
451
452 %************************************************************************
453 %*                                                                      *
454 \subsection{Environment: goes downwards}
455 %*                                                                      *
456 %************************************************************************
457
458 \begin{code}
459 data ScEnv = SCE { sc_size :: Int,      -- Size threshold
460
461                    sc_subst :: Subst,   -- Current substitution
462
463                    sc_how_bound :: HowBoundEnv,
464                         -- Binds interesting non-top-level variables
465                         -- Domain is OutVars (*after* applying the substitution)
466
467                    sc_vals  :: ValueEnv
468                         -- Domain is OutIds (*after* applying the substitution)
469                         -- Used even for top-level bindings (but not imported ones)
470              }
471
472 ---------------------
473 -- As we go, we apply a substitution (sc_subst) to the current term
474 type InExpr = CoreExpr          -- *Before* applying the subst
475
476 type OutExpr = CoreExpr         -- *After* applying the subst
477 type OutId   = Id
478 type OutVar  = Var
479
480 ---------------------
481 type HowBoundEnv = VarEnv HowBound      -- Domain is OutVars
482
483 ---------------------
484 type ValueEnv = IdEnv Value             -- Domain is OutIds
485 data Value    = ConVal AltCon [CoreArg] -- *Saturated* constructors
486               | LambdaVal               -- Inlinable lambdas or PAPs
487
488 instance Outputable Value where
489    ppr (ConVal con args) = ppr con <+> interpp'SP args
490    ppr LambdaVal         = ptext SLIT("<Lambda>")
491
492 ---------------------
493 initScEnv dflags
494   = SCE { sc_size = specThreshold dflags,
495           sc_subst = emptySubst, 
496           sc_how_bound = emptyVarEnv, 
497           sc_vals = emptyVarEnv }
498
499 data HowBound = RecFun  -- These are the recursive functions for which 
500                         -- we seek interesting call patterns
501
502               | RecArg  -- These are those functions' arguments, or their sub-components; 
503                         -- we gather occurrence information for these
504
505 instance Outputable HowBound where
506   ppr RecFun = text "RecFun"
507   ppr RecArg = text "RecArg"
508
509 lookupHowBound :: ScEnv -> Id -> Maybe HowBound
510 lookupHowBound env id = lookupVarEnv (sc_how_bound env) id
511
512 scSubstId :: ScEnv -> Id -> CoreExpr
513 scSubstId env v = lookupIdSubst (sc_subst env) v
514
515 scSubstTy :: ScEnv -> Type -> Type
516 scSubstTy env ty = substTy (sc_subst env) ty
517
518 zapScSubst :: ScEnv -> ScEnv
519 zapScSubst env = env { sc_subst = zapSubstEnv (sc_subst env) }
520
521 extendScInScope :: ScEnv -> [Var] -> ScEnv
522         -- Bring the quantified variables into scope
523 extendScInScope env qvars = env { sc_subst = extendInScopeList (sc_subst env) qvars }
524
525 extendScSubst :: ScEnv -> [(Var,CoreArg)] -> ScEnv
526         -- Extend the substitution
527 extendScSubst env prs = env { sc_subst = extendSubstList (sc_subst env) prs }
528
529 extendHowBound :: ScEnv -> [Var] -> HowBound -> ScEnv
530 extendHowBound env bndrs how_bound
531   = env { sc_how_bound = extendVarEnvList (sc_how_bound env)
532                             [(bndr,how_bound) | bndr <- bndrs] }
533
534 extendBndrsWith :: HowBound -> ScEnv -> [Var] -> (ScEnv, [Var])
535 extendBndrsWith how_bound env bndrs 
536   = (env { sc_subst = subst', sc_how_bound = hb_env' }, bndrs')
537   where
538     (subst', bndrs') = substBndrs (sc_subst env) bndrs
539     hb_env' = sc_how_bound env `extendVarEnvList` 
540                     [(bndr,how_bound) | bndr <- bndrs']
541
542 extendBndrWith :: HowBound -> ScEnv -> Var -> (ScEnv, Var)
543 extendBndrWith how_bound env bndr 
544   = (env { sc_subst = subst', sc_how_bound = hb_env' }, bndr')
545   where
546     (subst', bndr') = substBndr (sc_subst env) bndr
547     hb_env' = extendVarEnv (sc_how_bound env) bndr' how_bound
548
549 extendRecBndrs :: ScEnv -> [Var] -> (ScEnv, [Var])
550 extendRecBndrs env bndrs  = (env { sc_subst = subst' }, bndrs')
551                       where
552                         (subst', bndrs') = substRecBndrs (sc_subst env) bndrs
553
554 extendBndr :: ScEnv -> Var -> (ScEnv, Var)
555 extendBndr  env bndr  = (env { sc_subst = subst' }, bndr')
556                       where
557                         (subst', bndr') = substBndr (sc_subst env) bndr
558
559 extendValEnv :: ScEnv -> Id -> Maybe Value -> ScEnv
560 extendValEnv env id Nothing   = env
561 extendValEnv env id (Just cv) = env { sc_vals = extendVarEnv (sc_vals env) id cv }
562
563 extendCaseBndrs :: ScEnv -> CoreExpr -> Id -> AltCon -> [Var] -> ScEnv
564 -- When we encounter
565 --      case scrut of b
566 --          C x y -> ...
567 -- we want to bind b, and perhaps scrut too, to (C x y)
568 -- NB: Extends only the sc_vals part of the envt
569 extendCaseBndrs env scrut case_bndr con alt_bndrs
570   = case scrut of
571         Var v -> extendValEnv env1 v cval
572         other -> env1
573  where
574    env1 = extendValEnv env case_bndr cval
575    cval = case con of
576                 DEFAULT    -> Nothing
577                 LitAlt lit -> Just (ConVal con [])
578                 DataAlt dc -> Just (ConVal con vanilla_args)
579                       where
580                         vanilla_args = map Type (tyConAppArgs (idType case_bndr)) ++
581                                        varsToCoreExprs alt_bndrs
582 \end{code}
583
584
585 %************************************************************************
586 %*                                                                      *
587 \subsection{Usage information: flows upwards}
588 %*                                                                      *
589 %************************************************************************
590
591 \begin{code}
592 data ScUsage
593    = SCU {
594         calls :: CallEnv,               -- Calls
595                                         -- The functions are a subset of the 
596                                         --      RecFuns in the ScEnv
597
598         occs :: !(IdEnv ArgOcc)         -- Information on argument occurrences
599      }                                  -- The variables are a subset of the 
600                                         --      RecArg in the ScEnv
601
602 type CallEnv = IdEnv [Call]
603 type Call = (ValueEnv, [CoreArg])
604         -- The arguments of the call, together with the
605         -- env giving the constructor bindings at the call site
606
607 nullUsage = SCU { calls = emptyVarEnv, occs = emptyVarEnv }
608
609 combineCalls :: CallEnv -> CallEnv -> CallEnv
610 combineCalls = plusVarEnv_C (++)
611
612 combineUsage u1 u2 = SCU { calls = combineCalls (calls u1) (calls u2),
613                            occs  = plusVarEnv_C combineOcc (occs u1) (occs u2) }
614
615 combineUsages [] = nullUsage
616 combineUsages us = foldr1 combineUsage us
617
618 lookupOcc :: ScUsage -> Var -> (ScUsage, ArgOcc)
619 lookupOcc (SCU { calls = sc_calls, occs = sc_occs }) bndr
620   = (SCU {calls = sc_calls, occs = delVarEnv sc_occs bndr},
621      lookupVarEnv sc_occs bndr `orElse` NoOcc)
622
623 lookupOccs :: ScUsage -> [Var] -> (ScUsage, [ArgOcc])
624 lookupOccs (SCU { calls = sc_calls, occs = sc_occs }) bndrs
625   = (SCU {calls = sc_calls, occs = delVarEnvList sc_occs bndrs},
626      [lookupVarEnv sc_occs b `orElse` NoOcc | b <- bndrs])
627
628 data ArgOcc = NoOcc     -- Doesn't occur at all; or a type argument
629             | UnkOcc    -- Used in some unknown way
630
631             | ScrutOcc (UniqFM [ArgOcc])        -- See Note [ScrutOcc]
632
633             | BothOcc   -- Definitely taken apart, *and* perhaps used in some other way
634
635 {-      Note  [ScrutOcc]
636
637 An occurrence of ScrutOcc indicates that the thing, or a `cast` version of the thing,
638 is *only* taken apart or applied.
639
640   Functions, literal: ScrutOcc emptyUFM
641   Data constructors:  ScrutOcc subs,
642
643 where (subs :: UniqFM [ArgOcc]) gives usage of the *pattern-bound* components,
644 The domain of the UniqFM is the Unique of the data constructor
645
646 The [ArgOcc] is the occurrences of the *pattern-bound* components 
647 of the data structure.  E.g.
648         data T a = forall b. MkT a b (b->a)
649 A pattern binds b, x::a, y::b, z::b->a, but not 'a'!
650
651 -}
652
653 instance Outputable ArgOcc where
654   ppr (ScrutOcc xs) = ptext SLIT("scrut-occ") <> ppr xs
655   ppr UnkOcc        = ptext SLIT("unk-occ")
656   ppr BothOcc       = ptext SLIT("both-occ")
657   ppr NoOcc         = ptext SLIT("no-occ")
658
659 -- Experimentally, this vesion of combineOcc makes ScrutOcc "win", so
660 -- that if the thing is scrutinised anywhere then we get to see that
661 -- in the overall result, even if it's also used in a boxed way
662 -- This might be too agressive; see Note [Reboxing] Alternative 3
663 combineOcc NoOcc         occ           = occ
664 combineOcc occ           NoOcc         = occ
665 combineOcc (ScrutOcc xs) (ScrutOcc ys) = ScrutOcc (plusUFM_C combineOccs xs ys)
666 combineOcc occ           (ScrutOcc ys) = ScrutOcc ys
667 combineOcc (ScrutOcc xs) occ           = ScrutOcc xs
668 combineOcc UnkOcc        UnkOcc        = UnkOcc
669 combineOcc _        _                  = BothOcc
670
671 combineOccs :: [ArgOcc] -> [ArgOcc] -> [ArgOcc]
672 combineOccs xs ys = zipWithEqual "combineOccs" combineOcc xs ys
673
674 setScrutOcc :: ScEnv -> ScUsage -> CoreExpr -> ArgOcc -> ScUsage
675 -- *Overwrite* the occurrence info for the scrutinee, if the scrutinee 
676 -- is a variable, and an interesting variable
677 setScrutOcc env usg (Cast e _) occ = setScrutOcc env usg e occ
678 setScrutOcc env usg (Note _ e) occ = setScrutOcc env usg e occ
679 setScrutOcc env usg (Var v)    occ
680   | Just RecArg <- lookupHowBound env v = usg { occs = extendVarEnv (occs usg) v occ }
681   | otherwise                           = usg
682 setScrutOcc env usg other occ   -- Catch-all
683   = usg 
684
685 conArgOccs :: ArgOcc -> AltCon -> [ArgOcc]
686 -- Find usage of components of data con; returns [UnkOcc...] if unknown
687 -- See Note [ScrutOcc] for the extra UnkOccs in the vanilla datacon case
688
689 conArgOccs (ScrutOcc fm) (DataAlt dc) 
690   | Just pat_arg_occs <- lookupUFM fm dc
691   = [UnkOcc | tv <- dataConUnivTyVars dc] ++ pat_arg_occs
692
693 conArgOccs other con = repeat UnkOcc
694 \end{code}
695
696 %************************************************************************
697 %*                                                                      *
698 \subsection{The main recursive function}
699 %*                                                                      *
700 %************************************************************************
701
702 The main recursive function gathers up usage information, and
703 creates specialised versions of functions.
704
705 \begin{code}
706 scExpr :: ScEnv -> CoreExpr -> UniqSM (ScUsage, CoreExpr)
707         -- The unique supply is needed when we invent
708         -- a new name for the specialised function and its args
709
710 scExpr env e = scExpr' env e
711
712
713 scExpr' env (Var v)     = case scSubstId env v of
714                             Var v' -> returnUs (varUsage env v UnkOcc, Var v')
715                             e'     -> scExpr (zapScSubst env) e'
716
717 scExpr' env e@(Type t)  = returnUs (nullUsage, Type (scSubstTy env t))
718 scExpr' env e@(Lit l)   = returnUs (nullUsage, e)
719 scExpr' env (Note n e)  = do { (usg,e') <- scExpr env e
720                             ; return (usg, Note n e') }
721 scExpr' env (Cast e co) = do { (usg, e') <- scExpr env e
722                             ; return (usg, Cast e' (scSubstTy env co)) }
723 scExpr' env (Lam b e)   = do { let (env', b') = extendBndr env b
724                             ; (usg, e') <- scExpr env' e
725                             ; return (usg, Lam b' e') }
726
727 scExpr' env (Case scrut b ty alts) 
728   = do  { (scrut_usg, scrut') <- scExpr env scrut
729         ; case isValue (sc_vals env) scrut' of
730                 Just (ConVal con args) -> sc_con_app con args scrut'
731                 other                  -> sc_vanilla scrut_usg scrut'
732         }
733   where
734     sc_con_app con args scrut'  -- Known constructor; simplify
735         = do { let (_, bs, rhs) = findAlt con alts
736                    alt_env' = extendScSubst env ((b,scrut') : bs `zip` trimConArgs con args)
737              ; scExpr alt_env' rhs }
738                                 
739     sc_vanilla scrut_usg scrut' -- Normal case
740      = do { let (alt_env,b') = extendBndrWith RecArg env b
741                         -- Record RecArg for the components
742
743           ; (alt_usgs, alt_occs, alts')
744                 <- mapAndUnzip3Us (sc_alt alt_env scrut' b') alts
745
746           ; let (alt_usg, b_occ) = lookupOcc (combineUsages alt_usgs) b
747                 scrut_occ        = foldr combineOcc b_occ alt_occs
748                 scrut_usg'       = setScrutOcc env scrut_usg scrut' scrut_occ
749                 -- The combined usage of the scrutinee is given
750                 -- by scrut_occ, which is passed to scScrut, which
751                 -- in turn treats a bare-variable scrutinee specially
752
753           ; return (alt_usg `combineUsage` scrut_usg',
754                     Case scrut' b' (scSubstTy env ty) alts') }
755
756     sc_alt env scrut' b' (con,bs,rhs)
757       = do { let (env1, bs') = extendBndrsWith RecArg env bs
758                  env2        = extendCaseBndrs env1 scrut' b' con bs'
759            ; (usg,rhs') <- scExpr env2 rhs
760            ; let (usg', arg_occs) = lookupOccs usg bs
761                  scrut_occ = case con of
762                                 DataAlt dc -> ScrutOcc (unitUFM dc arg_occs)
763                                 other      -> ScrutOcc emptyUFM
764            ; return (usg', scrut_occ, (con,bs',rhs')) }
765
766 scExpr' env (Let (NonRec bndr rhs) body)
767   = do  { let (body_env, bndr') = extendBndr env bndr
768         ; (rhs_usg, rhs_info@(_, args', rhs_body', _)) <- scRecRhs env (bndr',rhs)
769
770         ; if null args' || isEmptyVarEnv (calls rhs_usg) then do
771             do  {       -- Vanilla case
772                   let rhs' = mkLams args' rhs_body'
773                       body_env2 = extendValEnv body_env bndr' (isValue (sc_vals env) rhs')
774                         -- Record if the RHS is a value
775                 ; (body_usg, body') <- scExpr body_env2 body
776                 ; return (body_usg `combineUsage` rhs_usg, Let (NonRec bndr' rhs') body') }
777           else 
778             do  {       -- Join-point case
779                   let body_env2 = extendHowBound body_env [bndr'] RecFun
780                         -- If the RHS of this 'let' contains calls
781                         -- to recursive functions that we're trying
782                         -- to specialise, then treat this let too
783                         -- as one to specialise
784                 ; (body_usg, body') <- scExpr body_env2 body
785
786                 ; (spec_usg, _, specs) <- specialise env (calls body_usg) ([], rhs_info)
787
788                 ; return (body_usg { calls = calls body_usg `delVarEnv` bndr' } 
789                           `combineUsage` rhs_usg `combineUsage` spec_usg,
790                           mkLets [NonRec b r | (b,r) <- addRules rhs_info specs] body')
791         }       }
792
793 scExpr' env (Let (Rec prs) body)
794   = do  { (env', bind_usg, bind') <- scBind env (Rec prs)
795         ; (body_usg, body') <- scExpr env' body
796         ; return (bind_usg `combineUsage` body_usg, Let bind' body') }
797
798 scExpr' env e@(App _ _) 
799   = do  { let (fn, args) = collectArgs e
800         ; (fn_usg, fn') <- scExpr env fn
801         -- Process the function too.   It's almost always a variable,
802         -- but not always.  In particular, if this pass follows float-in,
803         -- which it may, we can get 
804         --      (let f = ...f... in f) arg1 arg2
805         -- Also the substitution may replace a variable by a non-variable
806
807         ; let fn_usg' = setScrutOcc env fn_usg fn' (ScrutOcc emptyUFM)
808         -- We use setScrutOcc to record the fact that the function is called
809         -- Perhaps we should check that it has at least one value arg, 
810         -- but currently we don't bother
811
812         ; (arg_usgs, args') <- mapAndUnzipUs (scExpr env) args
813         ; let call_usg = case fn' of
814                            Var f | Just RecFun <- lookupHowBound env f
815                                  , not (null args)      -- Not a proper call!
816                                  -> SCU { calls = unitVarEnv f [(sc_vals env, args')], 
817                                           occs  = emptyVarEnv }
818                            other -> nullUsage
819         ; return (combineUsages arg_usgs `combineUsage` fn_usg' 
820                                          `combineUsage` call_usg,
821                   mkApps fn' args') }
822
823
824 ----------------------
825 scBind :: ScEnv -> CoreBind -> UniqSM (ScEnv, ScUsage, CoreBind)
826 scBind env (Rec prs)
827   | not (all (couldBeSmallEnoughToInline (sc_size env)) rhss)
828                 -- No specialisation
829   = do  { let (rhs_env,bndrs') = extendRecBndrs env bndrs
830         ; (rhs_usgs, rhss') <- mapAndUnzipUs (scExpr rhs_env) rhss
831         ; return (rhs_env, combineUsages rhs_usgs, Rec (bndrs' `zip` rhss')) }
832   | otherwise   -- Do specialisation
833   = do  { let (rhs_env1,bndrs') = extendRecBndrs env bndrs
834               rhs_env2 = extendHowBound rhs_env1 bndrs' RecFun
835
836         ; (rhs_usgs, rhs_infos) <- mapAndUnzipUs (scRecRhs rhs_env2) (bndrs' `zip` rhss)
837         ; let rhs_usg = combineUsages rhs_usgs
838
839         ; (spec_usg, specs) <- spec_loop rhs_env2 (calls rhs_usg)
840                                          (repeat [] `zip` rhs_infos)
841
842         ; let all_usg = rhs_usg `combineUsage` spec_usg
843
844         ; return (rhs_env1,  -- For the body of the letrec, delete the RecFun business
845                   all_usg { calls = calls rhs_usg `delVarEnvList` bndrs' },
846                   Rec (concat (zipWith addRules rhs_infos specs))) }
847   where
848     (bndrs,rhss) = unzip prs
849
850     spec_loop :: ScEnv
851               -> CallEnv
852               -> [([CallPat], RhsInfo)]                 -- One per binder
853               -> UniqSM (ScUsage, [[SpecInfo]])         -- One list per binder
854     spec_loop env all_calls rhs_stuff
855         = do { (spec_usg_s, new_pats_s, specs) <- mapAndUnzip3Us (specialise env all_calls) rhs_stuff
856              ; let spec_usg = combineUsages spec_usg_s
857              ; if all null new_pats_s then
858                 return (spec_usg, specs) else do
859              { (spec_usg1, specs1) <- spec_loop env (calls spec_usg) 
860                                                 (zipWith add_pats new_pats_s rhs_stuff)
861              ; return (spec_usg `combineUsage` spec_usg1, zipWith (++) specs specs1) } }
862
863     add_pats :: [CallPat] -> ([CallPat], RhsInfo) -> ([CallPat], RhsInfo)
864     add_pats new_pats (done_pats, rhs_info) = (done_pats ++ new_pats, rhs_info)
865
866 scBind env (NonRec bndr rhs)
867   = do  { (usg, rhs') <- scExpr env rhs
868         ; let (env1, bndr') = extendBndr env bndr
869               env2 = extendValEnv env1 bndr' (isValue (sc_vals env) rhs')
870         ; return (env2, usg, NonRec bndr' rhs') }
871
872 ----------------------
873 scRecRhs :: ScEnv -> (OutId, InExpr) -> UniqSM (ScUsage, RhsInfo)
874 scRecRhs env (bndr,rhs)
875   = do  { let (arg_bndrs,body) = collectBinders rhs
876               (body_env, arg_bndrs') = extendBndrsWith RecArg env arg_bndrs
877         ; (body_usg, body') <- scExpr body_env body
878         ; let (rhs_usg, arg_occs) = lookupOccs body_usg arg_bndrs'
879         ; return (rhs_usg, (bndr, arg_bndrs', body', arg_occs)) }
880
881                 -- The arg_occs says how the visible,
882                 -- lambda-bound binders of the RHS are used
883                 -- (including the TyVar binders)
884                 -- Two pats are the same if they match both ways
885
886 ----------------------
887 addRules :: RhsInfo -> [SpecInfo] -> [(Id,CoreExpr)]
888 addRules (fn, args, body, _) specs
889   = [(id,rhs) | (_,id,rhs) <- specs] ++ 
890     [(fn `addIdSpecialisations` rules, mkLams args body)]
891   where
892     rules = [r | (r,_,_) <- specs]
893
894 ----------------------
895 varUsage env v use 
896   | Just RecArg <- lookupHowBound env v = SCU { calls = emptyVarEnv, 
897                                                 occs = unitVarEnv v use }
898   | otherwise                           = nullUsage
899 \end{code}
900
901
902 %************************************************************************
903 %*                                                                      *
904                 The specialiser itself
905 %*                                                                      *
906 %************************************************************************
907
908 \begin{code}
909 type RhsInfo = (OutId, [OutVar], OutExpr, [ArgOcc])
910         -- Info about the *original* RHS of a binding we are specialising
911         -- Original binding f = \xs.body
912         -- Plus info about usage of arguments
913
914 type SpecInfo = (CoreRule, OutId, OutExpr)
915         -- One specialisation: Rule plus definition
916
917
918 specialise 
919    :: ScEnv
920    -> CallEnv                           -- Info on calls
921    -> ([CallPat], RhsInfo)              -- Original RHS plus patterns dealt with
922    -> UniqSM (ScUsage, [CallPat], [SpecInfo])   -- Specialised calls
923
924 -- Note: the rhs here is the optimised version of the original rhs
925 -- So when we make a specialised copy of the RHS, we're starting
926 -- from an RHS whose nested functions have been optimised already.
927
928 specialise env bind_calls (done_pats, (fn, arg_bndrs, body, arg_occs))
929   | notNull arg_bndrs,  -- Only specialise functions
930     Just all_calls <- lookupVarEnv bind_calls fn
931   = do  { pats <- callsToPats env done_pats arg_occs all_calls
932 --      ; pprTrace "specialise" (vcat [ppr fn <+> ppr arg_occs,
933 --                                      text "calls" <+> ppr all_calls,
934 --                                      text "good pats" <+> ppr pats])  $
935 --        return ()
936
937         ; (spec_usgs, specs) <- mapAndUnzipUs (spec_one env fn arg_bndrs body)
938                                               (pats `zip` [length done_pats..])
939
940         ; return (combineUsages spec_usgs, pats, specs) }
941   | otherwise
942   = return (nullUsage, [], [])          -- The boring case
943
944
945 ---------------------
946 spec_one :: ScEnv
947          -> OutId       -- Function
948          -> [Var]       -- Lambda-binders of RHS; should match patterns
949          -> CoreExpr    -- Body of the original function
950          -> (([Var], [CoreArg]), Int)
951          -> UniqSM (ScUsage, SpecInfo)  -- Rule and binding
952
953 -- spec_one creates a specialised copy of the function, together
954 -- with a rule for using it.  I'm very proud of how short this
955 -- function is, considering what it does :-).
956
957 {- 
958   Example
959   
960      In-scope: a, x::a   
961      f = /\b \y::[(a,b)] -> ....f (b,c) ((:) (a,(b,c)) (x,v) (h w))...
962           [c::*, v::(b,c) are presumably bound by the (...) part]
963   ==>
964      f_spec = /\ b c \ v::(b,c) hw::[(a,(b,c))] ->
965                   (...entire body of f...) [b -> (b,c), 
966                                             y -> ((:) (a,(b,c)) (x,v) hw)]
967   
968      RULE:  forall b::* c::*,           -- Note, *not* forall a, x
969                    v::(b,c),
970                    hw::[(a,(b,c))] .
971   
972             f (b,c) ((:) (a,(b,c)) (x,v) hw) = f_spec b c v hw
973 -}
974
975 spec_one env fn arg_bndrs body ((qvars, pats), rule_number)
976   = do  {       -- Specialise the body
977           let spec_env = extendScSubst (extendScInScope env qvars)
978                                        (arg_bndrs `zip` pats)
979         ; (spec_usg, spec_body) <- scExpr spec_env body
980
981 --      ; pprTrace "spec_one" (ppr fn <+> vcat [text "pats" <+> ppr pats,
982 --                      text "calls" <+> (ppr (calls spec_usg))])
983 --        (return ())
984
985                 -- And build the results
986         ; spec_uniq <- getUniqueUs
987         ; let (spec_lam_args, spec_call_args) = mkWorkerArgs qvars body_ty
988                 -- Usual w/w hack to avoid generating 
989                 -- a spec_rhs of unlifted type and no args
990         
991               fn_name   = idName fn
992               fn_loc    = nameSrcSpan fn_name
993               spec_occ  = mkSpecOcc (nameOccName fn_name)
994               rule_name = mkFastString ("SC:" ++ showSDoc (ppr fn <> int rule_number))
995               spec_rhs  = mkLams spec_lam_args spec_body
996               spec_id   = mkUserLocal spec_occ spec_uniq (mkPiTypes spec_lam_args body_ty) fn_loc
997               body_ty   = exprType spec_body
998               rule_rhs  = mkVarApps (Var spec_id) spec_call_args
999               rule      = mkLocalRule rule_name specConstrActivation fn_name qvars pats rule_rhs
1000         ; return (spec_usg, (rule, spec_id, spec_rhs)) }
1001
1002 -- In which phase should the specialise-constructor rules be active?
1003 -- Originally I made them always-active, but Manuel found that
1004 -- this defeated some clever user-written rules.  So Plan B
1005 -- is to make them active only in Phase 0; after all, currently,
1006 -- the specConstr transformation is only run after the simplifier
1007 -- has reached Phase 0.  In general one would want it to be 
1008 -- flag-controllable, but for now I'm leaving it baked in
1009 --                                      [SLPJ Oct 01]
1010 specConstrActivation :: Activation
1011 specConstrActivation = ActiveAfter 0    -- Baked in; see comments above
1012 \end{code}
1013
1014 %************************************************************************
1015 %*                                                                      *
1016 \subsection{Argument analysis}
1017 %*                                                                      *
1018 %************************************************************************
1019
1020 This code deals with analysing call-site arguments to see whether
1021 they are constructor applications.
1022
1023
1024 \begin{code}
1025 type CallPat = ([Var], [CoreExpr])      -- Quantified variables and arguments
1026
1027
1028 callsToPats :: ScEnv -> [CallPat] -> [ArgOcc] -> [Call] -> UniqSM [CallPat]
1029         -- Result has no duplicate patterns, 
1030         -- nor ones mentioned in done_pats
1031 callsToPats env done_pats bndr_occs calls
1032   = do  { mb_pats <- mapM (callToPats env bndr_occs) calls
1033
1034         ; let good_pats :: [([Var], [CoreArg])]
1035               good_pats = catMaybes mb_pats
1036               is_done p = any (samePat p) done_pats
1037
1038         ; return (filterOut is_done (nubBy samePat good_pats)) }
1039
1040 callToPats :: ScEnv -> [ArgOcc] -> Call -> UniqSM (Maybe CallPat)
1041         -- The [Var] is the variables to quantify over in the rule
1042         --      Type variables come first, since they may scope 
1043         --      over the following term variables
1044         -- The [CoreExpr] are the argument patterns for the rule
1045 callToPats env bndr_occs (con_env, args)
1046   | length args < length bndr_occs      -- Check saturated
1047   = return Nothing
1048   | otherwise
1049   = do  { let in_scope = substInScope (sc_subst env)
1050         ; prs <- argsToPats in_scope con_env (args `zip` bndr_occs)
1051         ; let (good_pats, pats) = unzip prs
1052               pat_fvs = varSetElems (exprsFreeVars pats)
1053               qvars   = filterOut (`elemInScopeSet` in_scope) pat_fvs
1054                 -- Quantify over variables that are not in sccpe
1055                 -- at the call site
1056                 -- See Note [Shadowing] at the top
1057                 
1058               (tvs, ids) = partition isTyVar qvars
1059               qvars'     = tvs ++ ids
1060                 -- Put the type variables first; the type of a term
1061                 -- variable may mention a type variable
1062
1063         ; -- pprTrace "callToPats"  (ppr args $$ ppr prs $$ ppr bndr_occs) $
1064           if or good_pats 
1065           then return (Just (qvars', pats))
1066           else return Nothing }
1067
1068     -- argToPat takes an actual argument, and returns an abstracted
1069     -- version, consisting of just the "constructor skeleton" of the
1070     -- argument, with non-constructor sub-expression replaced by new
1071     -- placeholder variables.  For example:
1072     --    C a (D (f x) (g y))  ==>  C p1 (D p2 p3)
1073
1074 argToPat :: InScopeSet                  -- What's in scope at the fn defn site
1075          -> ValueEnv                    -- ValueEnv at the call site
1076          -> CoreArg                     -- A call arg (or component thereof)
1077          -> ArgOcc
1078          -> UniqSM (Bool, CoreArg)
1079 -- Returns (interesting, pat), 
1080 -- where pat is the pattern derived from the argument
1081 --            intersting=True if the pattern is non-trivial (not a variable or type)
1082 -- E.g.         x:xs         --> (True, x:xs)
1083 --              f xs         --> (False, w)        where w is a fresh wildcard
1084 --              (f xs, 'c')  --> (True, (w, 'c'))  where w is a fresh wildcard
1085 --              \x. x+y      --> (True, \x. x+y)
1086 --              lvl7         --> (True, lvl7)      if lvl7 is bound 
1087 --                                                 somewhere further out
1088
1089 argToPat in_scope val_env arg@(Type ty) arg_occ
1090   = return (False, arg)
1091
1092 argToPat in_scope val_env (Note n arg) arg_occ
1093   = argToPat in_scope val_env arg arg_occ
1094         -- Note [Notes in call patterns]
1095         -- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1096         -- Ignore Notes.  In particular, we want to ignore any InlineMe notes
1097         -- Perhaps we should not ignore profiling notes, but I'm going to
1098         -- ride roughshod over them all for now.
1099         --- See Note [Notes in RULE matching] in Rules
1100
1101 argToPat in_scope val_env (Let _ arg) arg_occ
1102   = argToPat in_scope val_env arg arg_occ
1103         -- Look through let expressions
1104         -- e.g.         f (let v = rhs in \y -> ...v...)
1105         -- Here we can specialise for f (\y -> ...)
1106         -- because the rule-matcher will look through the let.
1107
1108 argToPat in_scope val_env (Cast arg co) arg_occ
1109   = do  { (interesting, arg') <- argToPat in_scope val_env arg arg_occ
1110         ; if interesting then 
1111                 return (interesting, Cast arg' co)
1112           else 
1113                 wildCardPat (snd (coercionKind co)) }
1114
1115 {-      Disabling lambda specialisation for now
1116         It's fragile, and the spec_loop can be infinite
1117 argToPat in_scope val_env arg arg_occ
1118   | is_value_lam arg
1119   = return (True, arg)
1120   where
1121     is_value_lam (Lam v e)      -- Spot a value lambda, even if 
1122         | isId v = True         -- it is inside a type lambda
1123         | otherwise = is_value_lam e
1124     is_value_lam other = False
1125 -}
1126
1127   -- Check for a constructor application
1128   -- NB: this *precedes* the Var case, so that we catch nullary constrs
1129 argToPat in_scope val_env arg arg_occ
1130   | Just (ConVal dc args) <- isValue val_env arg
1131   , case arg_occ of
1132         ScrutOcc _ -> True              -- Used only by case scrutinee
1133         BothOcc    -> case arg of       -- Used elsewhere
1134                         App {} -> True  --     see Note [Reboxing]
1135                         other  -> False
1136         other      -> False     -- No point; the arg is not decomposed
1137   = do  { args' <- argsToPats in_scope val_env (args `zip` conArgOccs arg_occ dc)
1138         ; return (True, mk_con_app dc (map snd args')) }
1139
1140   -- Check if the argument is a variable that 
1141   -- is in scope at the function definition site
1142   -- It's worth specialising on this if
1143   --    (a) it's used in an interesting way in the body
1144   --    (b) we know what its value is
1145 argToPat in_scope val_env (Var v) arg_occ
1146   | case arg_occ of { UnkOcc -> False; other -> True }, -- (a)
1147     is_value                                            -- (b)
1148   = return (True, Var v)
1149   where
1150     is_value 
1151         | isLocalId v = v `elemInScopeSet` in_scope 
1152                         && isJust (lookupVarEnv val_env v)
1153                 -- Local variables have values in val_env
1154         | otherwise   = isValueUnfolding (idUnfolding v)
1155                 -- Imports have unfoldings
1156
1157 --      I'm really not sure what this comment means
1158 --      And by not wild-carding we tend to get forall'd 
1159 --      variables that are in soope, which in turn can
1160 --      expose the weakness in let-matching
1161 --      See Note [Matching lets] in Rules
1162   -- Check for a variable bound inside the function. 
1163   -- Don't make a wild-card, because we may usefully share
1164   --    e.g.  f a = let x = ... in f (x,x)
1165   -- NB: this case follows the lambda and con-app cases!!
1166 argToPat in_scope val_env (Var v) arg_occ
1167   = return (False, Var v)
1168
1169   -- The default case: make a wild-card
1170 argToPat in_scope val_env arg arg_occ
1171   = wildCardPat (exprType arg)
1172
1173 wildCardPat :: Type -> UniqSM (Bool, CoreArg)
1174 wildCardPat ty = do { uniq <- getUniqueUs
1175                     ; let id = mkSysLocal FSLIT("sc") uniq ty
1176                     ; return (False, Var id) }
1177
1178 argsToPats :: InScopeSet -> ValueEnv
1179            -> [(CoreArg, ArgOcc)]
1180            -> UniqSM [(Bool, CoreArg)]
1181 argsToPats in_scope val_env args
1182   = mapUs do_one args
1183   where
1184     do_one (arg,occ) = argToPat in_scope val_env arg occ
1185 \end{code}
1186
1187
1188 \begin{code}
1189 isValue :: ValueEnv -> CoreExpr -> Maybe Value
1190 isValue env (Lit lit)
1191   = Just (ConVal (LitAlt lit) [])
1192
1193 isValue env (Var v)
1194   | Just stuff <- lookupVarEnv env v
1195   = Just stuff  -- You might think we could look in the idUnfolding here
1196                 -- but that doesn't take account of which branch of a 
1197                 -- case we are in, which is the whole point
1198
1199   | not (isLocalId v) && isCheapUnfolding unf
1200   = isValue env (unfoldingTemplate unf)
1201   where
1202     unf = idUnfolding v
1203         -- However we do want to consult the unfolding 
1204         -- as well, for let-bound constructors!
1205
1206 isValue env (Lam b e)
1207   | isTyVar b = isValue env e
1208   | otherwise = Just LambdaVal
1209
1210 isValue env expr        -- Maybe it's a constructor application
1211   | (Var fun, args) <- collectArgs expr
1212   = case isDataConWorkId_maybe fun of
1213
1214         Just con | args `lengthAtLeast` dataConRepArity con 
1215                 -- Check saturated; might be > because the 
1216                 --                  arity excludes type args
1217                 -> Just (ConVal (DataAlt con) args)
1218
1219         other | valArgCount args < idArity fun
1220                 -- Under-applied function
1221               -> Just LambdaVal -- Partial application
1222
1223         other -> Nothing
1224
1225 isValue env expr = Nothing
1226
1227 mk_con_app :: AltCon -> [CoreArg] -> CoreExpr
1228 mk_con_app (LitAlt lit)  []   = Lit lit
1229 mk_con_app (DataAlt con) args = mkConApp con args
1230 mk_con_app other args = panic "SpecConstr.mk_con_app"
1231
1232 samePat :: CallPat -> CallPat -> Bool
1233 samePat (vs1, as1) (vs2, as2)
1234   = all2 same as1 as2
1235   where
1236     same (Var v1) (Var v2) 
1237         | v1 `elem` vs1 = v2 `elem` vs2
1238         | v2 `elem` vs2 = False
1239         | otherwise     = v1 == v2
1240
1241     same (Lit l1)    (Lit l2)    = l1==l2
1242     same (App f1 a1) (App f2 a2) = same f1 f2 && same a1 a2
1243
1244     same (Type t1) (Type t2) = True     -- Note [Ignore type differences]
1245     same (Note _ e1) e2 = same e1 e2    -- Ignore casts and notes
1246     same (Cast e1 _) e2 = same e1 e2
1247     same e1 (Note _ e2) = same e1 e2
1248     same e1 (Cast e2 _) = same e1 e2
1249
1250     same e1 e2 = WARN( bad e1 || bad e2, ppr e1 $$ ppr e2) 
1251                  False  -- Let, lambda, case should not occur
1252 #ifdef DEBUG
1253     bad (Case {}) = True
1254     bad (Let {})  = True
1255     bad (Lam {})  = True
1256     bad other     = False
1257 #endif
1258 \end{code}
1259
1260 Note [Ignore type differences]
1261 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1262 We do not want to generate specialisations where the call patterns
1263 differ only in their type arguments!  Not only is it utterly useless,
1264 but it also means that (with polymorphic recursion) we can generate
1265 an infinite number of specialisations. Example is Data.Sequence.adjustTree, 
1266 I think.
1267