[project @ 1998-03-19 23:54:49 by simonpj]
[ghc-hetmet.git] / ghc / compiler / simplCore / Simplify.lhs
1 %
2 % (c) The AQUA Project, Glasgow University, 1993-1996
3 %
4 \section[Simplify]{The main module of the simplifier}
5
6 \begin{code}
7 module Simplify ( simplTopBinds, simplExpr, simplBind ) where
8
9 #include "HsVersions.h"
10
11 import BinderInfo
12 import CmdLineOpts      ( SimplifierSwitch(..) )
13 import ConFold          ( completePrim )
14 import CoreUnfold       ( Unfolding, mkFormSummary, 
15                           exprIsTrivial, whnfOrBottom, inlineUnconditionally,
16                           FormSummary(..)
17                         )
18 import CostCentre       ( isSccCountCostCentre, cmpCostCentre, costsAreSubsumed, useCurrentCostCentre )
19 import CoreSyn
20 import CoreUtils        ( coreExprType, nonErrorRHSs, maybeErrorApp,
21                           unTagBinders, squashableDictishCcExpr
22                         )
23 import Id               ( idType, idMustBeINLINEd, idWantsToBeINLINEd, idMustNotBeINLINEd, 
24                           addIdArity, getIdArity,
25                           getIdDemandInfo, addIdDemandInfo
26                         )
27 import Name             ( isExported, isLocallyDefined )
28 import IdInfo           ( willBeDemanded, noDemandInfo, DemandInfo, ArityInfo(..),
29                           atLeastArity, unknownArity )
30 import Literal          ( isNoRepLit )
31 import Maybes           ( maybeToBool )
32 import PrimOp           ( primOpOkForSpeculation, PrimOp(..) )
33 import SimplCase        ( simplCase, bindLargeRhs )
34 import SimplEnv
35 import SimplMonad
36 import SimplVar         ( completeVar, simplBinder, simplBinders, simplTyBinder, simplTyBinders )
37 import SimplUtils
38 import Type             ( mkTyVarTy, mkTyVarTys, mkAppTy, applyTy, applyTys,
39                           mkFunTys, splitAlgTyConApp_maybe,
40                           splitFunTys, splitFunTy_maybe, isUnpointedType
41                         )
42 import TysPrim          ( realWorldStatePrimTy )
43 import Util             ( Eager, appEager, returnEager, runEager, mapEager,
44                           isSingleton, zipEqual, zipWithEqual, mapAndUnzip
45                         )
46 import Outputable       
47 \end{code}
48
49 The controlling flags, and what they do
50 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
51
52 passes:
53 ------
54 -fsimplify              = run the simplifier
55 -ffloat-inwards         = runs the float lets inwards pass
56 -ffloat                 = runs the full laziness pass
57                           (ToDo: rename to -ffull-laziness)
58 -fupdate-analysis       = runs update analyser
59 -fstrictness            = runs strictness analyser
60 -fsaturate-apps         = saturates applications (eta expansion)
61
62 options:
63 -------
64 -ffloat-past-lambda     = OK to do full laziness.
65                           (ToDo: remove, as the full laziness pass is
66                                  useless without this flag, therefore
67                                  it is unnecessary. Just -ffull-laziness
68                                  should be kept.)
69
70 -ffloat-lets-ok         = OK to float lets out of lets if the enclosing
71                           let is strict or if the floating will expose
72                           a WHNF [simplifier].
73
74 -ffloat-primops-ok      = OK to float out of lets cases whose scrutinee
75                           is a primop that cannot fail [simplifier].
76
77 -fcode-duplication-ok   = allows the previous option to work on cases with
78                           multiple branches [simplifier].
79
80 -flet-to-case           = does let-to-case transformation [simplifier].
81
82 -fcase-of-case          = does case of case transformation [simplifier].
83
84 -fpedantic-bottoms      = does not allow:
85                              case x of y -> e  ===>  e[x/y]
86                           (which may turn bottom into non-bottom)
87
88
89                         NOTES ON INLINING
90                         ~~~~~~~~~~~~~~~~~
91
92 Inlining is one of the delicate aspects of the simplifier.  By
93 ``inlining'' we mean replacing an occurrence of a variable ``x'' by
94 the RHS of x's definition.  Thus
95
96         let x = e in ...x...    ===>   let x = e in ...e...
97
98 We have two mechanisms for inlining:
99
100 1.  Unconditional.  The occurrence analyser has pinned an (OneOcc
101 FunOcc NoDupDanger NotInsideSCC n) flag on the variable, saying ``it's
102 certainly safe to inline this variable, and to drop its binding''.
103 (...Umm... if n <= 1; if n > 1, it is still safe, provided you are
104 happy to be duplicating code...) When it encounters such a beast, the
105 simplifer binds the variable to its RHS (in the id_env) and continues.
106 It doesn't even look at the RHS at that stage.  It also drops the
107 binding altogether.
108
109 2.  Conditional.  In all other situations, the simplifer simplifies
110 the RHS anyway, and keeps the new binding.  It also binds the new
111 (cloned) variable to a ``suitable'' Unfolding in the UnfoldEnv.
112
113 Here, ``suitable'' might mean NoUnfolding (if the occurrence
114 info is ManyOcc and the RHS is not a manifest HNF, or UnfoldAlways (if
115 the variable has an INLINE pragma on it).  The idea is that anything
116 in the UnfoldEnv is safe to use, but also has an enclosing binding if
117 you decide not to use it.
118
119 Head normal forms
120 ~~~~~~~~~~~~~~~~~
121 We *never* put a non-HNF unfolding in the UnfoldEnv except in the
122 INLINE-pragma case.
123
124 At one time I thought it would be OK to put non-HNF unfoldings in for
125 variables which occur only once [if they got inlined at that
126 occurrence the RHS of the binding would become dead, so no duplication
127 would occur].   But consider:
128 @
129         let x = <expensive>
130             f = \y -> ...y...y...y...
131         in f x
132 @
133 Now, it seems that @x@ appears only once, but even so it is NOT safe
134 to put @x@ in the UnfoldEnv, because @f@ will be inlined, and will
135 duplicate the references to @x@.
136
137 Because of this, the "unconditional-inline" mechanism above is the
138 only way in which non-HNFs can get inlined.
139
140 INLINE pragmas
141 ~~~~~~~~~~~~~~
142
143 When a variable has an INLINE pragma on it --- which includes wrappers
144 produced by the strictness analyser --- we treat it rather carefully.
145
146 For a start, we are careful not to substitute into its RHS, because
147 that might make it BIG, and the user said "inline exactly this", not
148 "inline whatever you get after inlining other stuff inside me".  For
149 example
150
151         let f = BIG
152         in {-# INLINE y #-} y = f 3
153         in ...y...y...
154
155 Here we don't want to substitute BIG for the (single) occurrence of f,
156 because then we'd duplicate BIG when we inline'd y.  (Exception:
157 things in the UnfoldEnv with UnfoldAlways flags, which originated in
158 other INLINE pragmas.)
159
160 So, we clean out the UnfoldEnv of all SimpleUnfolding inlinings before
161 going into such an RHS.
162
163 What about imports?  They don't really matter much because we only
164 inline relatively small things via imports.
165
166 We augment the the UnfoldEnv with UnfoldAlways guidance if there's an
167 INLINE pragma.  We also do this for the RHSs of recursive decls,
168 before looking at the recursive decls. That way we achieve the effect
169 of inlining a wrapper in the body of its worker, in the case of a
170 mutually-recursive worker/wrapper split.
171
172
173 %************************************************************************
174 %*                                                                      *
175 \subsection[Simplify-simplExpr]{The main function: simplExpr}
176 %*                                                                      *
177 %************************************************************************
178
179 At the top level things are a little different.
180
181   * No cloning (not allowed for exported Ids, unnecessary for the others)
182   * Floating is done a bit differently (no case floating; check for leaks; handle letrec)
183
184 \begin{code}
185 simplTopBinds :: SimplEnv -> [InBinding] -> SmplM [OutBinding]
186
187 -- Dead code is now discarded by the occurrence analyser,
188
189 simplTopBinds env binds
190   = mapSmpl (floatBind env True) binds  `thenSmpl` \ binds_s ->
191     simpl_top_binds env (concat binds_s)
192   where
193     simpl_top_binds env [] = returnSmpl []
194
195     simpl_top_binds env (NonRec binder@(in_id,occ_info) rhs : binds)
196       =         --- No cloning necessary at top level
197         simplBinder env binder                                          `thenSmpl` \ (env1, out_id) ->
198         simplRhsExpr env binder rhs out_id                              `thenSmpl` \ (rhs',arity) ->
199         completeNonRec env1 binder (out_id `withArity` arity) rhs'      `thenSmpl` \ (new_env, binds1') ->
200         simpl_top_binds new_env binds                                   `thenSmpl` \ binds2' ->
201         returnSmpl (binds1' ++ binds2')
202
203     simpl_top_binds env (Rec pairs : binds)
204       =         -- No cloning necessary at top level, but we nevertheless
205                 -- add the Ids to the environment.  This makes sure that
206                 -- info carried on the Id (such as arity info) gets propagated
207                 -- to occurrences.
208                 --
209                 -- This may seem optional, but I found an occasion when it Really matters.
210                 -- Consider     foo{n} = ...foo...
211                 --              baz* = foo
212                 --
213                 -- where baz* is exported and foo isn't.  Then when we do "indirection-shorting"
214                 -- in tidyCore, we need the {no-inline} pragma from foo to attached to the final
215                 -- thing:       baz*{n} = ...baz...
216                 --
217                 -- Sure we could have made the indirection-shorting a bit cleverer, but
218                 -- propagating pragma info is a Good Idea anyway.
219         simplBinders env (map fst pairs)        `thenSmpl` \ (env1, out_ids) ->
220         simplRecursiveGroup env1 out_ids pairs  `thenSmpl` \ (bind', new_env) ->
221         simpl_top_binds new_env binds           `thenSmpl` \ binds' ->
222         returnSmpl (Rec bind' : binds')
223 \end{code}
224
225 %************************************************************************
226 %*                                                                      *
227 \subsection[Simplify-simplExpr]{The main function: simplExpr}
228 %*                                                                      *
229 %************************************************************************
230
231
232 \begin{code}
233 simplExpr :: SimplEnv
234           -> InExpr -> [OutArg]
235           -> OutType            -- Type of (e args); i.e. type of overall result
236           -> SmplM OutExpr
237 \end{code}
238
239 The expression returned has the same meaning as the input expression
240 applied to the specified arguments.
241
242
243 Variables
244 ~~~~~~~~~
245
246 \begin{code}
247 simplExpr env (Var var) args result_ty
248   = simplVar env False {- No InlineCall -} var args result_ty
249 \end{code}
250
251 Literals
252 ~~~~~~~~
253
254 \begin{code}
255 simplExpr env (Lit l) [] result_ty = returnSmpl (Lit l)
256 #ifdef DEBUG
257 simplExpr env (Lit l) _  _ = panic "simplExpr:Lit with argument"
258 #endif
259 \end{code}
260
261 Primitive applications are simple.
262 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
263
264 NB: Prim expects an empty argument list! (Because it should be
265 saturated and not higher-order. ADR)
266
267 \begin{code}
268 simplExpr env (Prim op prim_args) args result_ty
269   = ASSERT (null args)
270     mapEager (simplArg env) prim_args   `appEager` \ prim_args' ->
271     simpl_op op                         `appEager` \ op' ->
272     completePrim env op' prim_args'
273   where
274     -- PrimOps just need any types in them renamed.
275
276     simpl_op (CCallOp label is_asm may_gc arg_tys result_ty)
277       = mapEager (simplTy env) arg_tys  `appEager` \ arg_tys' ->
278         simplTy env result_ty           `appEager` \ result_ty' ->
279         returnEager (CCallOp label is_asm may_gc arg_tys' result_ty')
280
281     simpl_op other_op = returnEager other_op
282 \end{code}
283
284 Constructor applications
285 ~~~~~~~~~~~~~~~~~~~~~~~~
286 Nothing to try here.  We only reuse constructors when they appear as the
287 rhs of a let binding (see completeLetBinding).
288
289 \begin{code}
290 simplExpr env (Con con con_args) args result_ty
291   = ASSERT( null args )
292     mapEager (simplArg env) con_args    `appEager` \ con_args' ->
293     returnSmpl (Con con con_args')
294 \end{code}
295
296
297 Applications are easy too:
298 ~~~~~~~~~~~~~~~~~~~~~~~~~~
299 Just stuff 'em in the arg stack
300
301 \begin{code}
302 simplExpr env (App fun arg) args result_ty
303   = simplArg env arg    `appEager` \ arg' ->
304     simplExpr env fun (arg' : args) result_ty
305 \end{code}
306
307 Type lambdas
308 ~~~~~~~~~~~~
309
310 First the case when it's applied to an argument.
311
312 \begin{code}
313 simplExpr env (Lam (TyBinder tyvar) body) (TyArg ty : args) result_ty
314   = tick TyBetaReduction        `thenSmpl_`
315     simplExpr (bindTyVar env tyvar ty) body args result_ty
316 \end{code}
317
318 \begin{code}
319 simplExpr env tylam@(Lam (TyBinder tyvar) body) [] result_ty
320   = simplTyBinder env tyvar     `thenSmpl` \ (new_env, tyvar') ->
321     let
322         new_result_ty = applyTy result_ty (mkTyVarTy tyvar')
323     in
324     simplExpr new_env body [] new_result_ty             `thenSmpl` \ body' ->
325     returnSmpl (Lam (TyBinder tyvar') body')
326
327 #ifdef DEBUG
328 simplExpr env (Lam (TyBinder _) _) (_ : _) result_ty
329   = panic "simplExpr:TyLam with non-TyArg"
330 #endif
331 \end{code}
332
333
334 Ordinary lambdas
335 ~~~~~~~~~~~~~~~~
336
337 There's a complication with lambdas that aren't saturated.
338 Suppose we have:
339
340         (\x. \y. ...x...)
341
342 If we did nothing, x is used inside the \y, so would be marked
343 as dangerous to dup.  But in the common case where the abstraction
344 is applied to two arguments this is over-pessimistic.
345 So instead we don't take account of the \y when dealing with x's usage;
346 instead, the simplifier is careful when partially applying lambdas.
347
348 \begin{code}
349 simplExpr env expr@(Lam (ValBinder binder) body) orig_args result_ty
350   = go 0 env expr orig_args
351   where
352     go n env (Lam (ValBinder binder) body) (val_arg : args)
353       | isValArg val_arg                -- The lambda has an argument
354       = tick BetaReduction      `thenSmpl_`
355         go (n+1) (bindIdToAtom env binder val_arg) body args
356
357     go n env expr@(Lam (ValBinder binder) body) args
358         -- The lambda is un-saturated, so we must zap the occurrence info
359         -- on the arguments we've already beta-reduced into the body of the lambda
360       = ASSERT( null args )     -- Value lambda must match value argument!
361         let
362             new_env = markDangerousOccs env orig_args
363         in
364         simplValLam new_env expr 0 {- Guaranteed applied to at least 0 args! -} result_ty 
365                                 `thenSmpl` \ (expr', arity) ->
366         returnSmpl expr'
367
368     go n env non_val_lam_expr args      -- The lambda had enough arguments
369       = simplExpr env non_val_lam_expr args result_ty
370 \end{code}
371
372
373 Let expressions
374 ~~~~~~~~~~~~~~~
375
376 \begin{code}
377 simplExpr env (Let bind body) args result_ty
378   = simplBind env bind (\env -> simplExpr env body args result_ty) result_ty
379 \end{code}
380
381 Case expressions
382 ~~~~~~~~~~~~~~~~
383
384 \begin{code}
385 simplExpr env expr@(Case scrut alts) args result_ty
386   = simplCase env scrut
387               (getSubstEnvs env, alts)
388               (\env rhs -> simplExpr env rhs args result_ty)
389               result_ty
390 \end{code}
391
392
393 Coercions
394 ~~~~~~~~~
395 \begin{code}
396 simplExpr env (Note (Coerce to_ty from_ty) body) args result_ty
397   = simplCoerce env to_ty from_ty body args result_ty
398
399 simplExpr env (Note (SCC cc) body) args result_ty
400   = simplSCC env cc body args result_ty
401
402 -- InlineCall is simple enough to deal with on the spot
403 -- The only complication is that we slide the InlineCall
404 -- inwards past any function arguments
405 simplExpr env (Note InlineCall expr) args result_ty
406   = go expr args
407   where
408     go (Var v) args       = simplVar env True {- InlineCall -} v args result_ty
409
410     go (App fun arg) args = simplArg env arg    `appEager` \ arg' ->
411                             go fun (arg' : args)
412
413     go other args         =     -- Unexpected discard; report it
414                             pprTrace "simplExpr: discarding InlineCall" (ppr expr) $
415                             simplExpr env other args result_ty
416 \end{code}
417
418
419
420 %************************************************************************
421 %*                                                                      *
422 \subsection{Simplify RHS of a Let/Letrec}
423 %*                                                                      *
424 %************************************************************************
425
426 simplRhsExpr does arity-expansion.  That is, given:
427
428         * a right hand side /\ tyvars -> \a1 ... an -> e
429         * the information (stored in BinderInfo) that the function will always
430           be applied to at least k arguments
431
432 it transforms the rhs to
433
434         /\tyvars -> \a1 ... an b(n+1) ... bk -> (e b(n+1) ... bk)
435
436 This is a Very Good Thing!
437
438 \begin{code}
439 simplRhsExpr
440         :: SimplEnv
441         -> InBinder
442         -> InExpr
443         -> OutId                -- The new binder (used only for its type)
444         -> SmplM (OutExpr, ArityInfo)
445 \end{code}
446
447
448 \begin{code}
449 simplRhsExpr env binder@(id,occ_info) rhs new_id
450   | maybeToBool (splitAlgTyConApp_maybe rhs_ty)
451         -- Deal with the data type case, in which case the elaborate
452         -- eta-expansion nonsense is really quite a waste of time.
453   = simplExpr rhs_env rhs [] rhs_ty             `thenSmpl` \ rhs' ->
454     returnSmpl (rhs', ArityExactly 0)
455
456   | otherwise   -- OK, use the big hammer
457   =     -- Deal with the big lambda part
458     simplTyBinders rhs_env tyvars                       `thenSmpl` \ (lam_env, tyvars') ->
459     let
460         body_ty  = applyTys rhs_ty (mkTyVarTys tyvars')
461     in
462         -- Deal with the little lambda part
463         -- Note that we call simplLam even if there are no binders,
464         -- in case it can do arity expansion.
465     simplValLam lam_env body (getBinderInfoArity occ_info) body_ty      `thenSmpl` \ (lambda', arity) ->
466
467         -- Put on the big lambdas, trying to float out any bindings caught inside
468     mkRhsTyLam tyvars' lambda'                                  `thenSmpl` \ rhs' ->
469
470     returnSmpl (rhs', arity)
471   where
472     rhs_ty  = idType new_id
473     rhs_env | idWantsToBeINLINEd id     -- Don't ever inline in a INLINE thing's rhs
474             = switchOffInlining env1    -- See comments with switchOffInlining
475             | otherwise 
476             = env1
477
478         -- The top level "enclosing CC" is "SUBSUMED".  But the enclosing CC
479         -- for the rhs of top level defs is "OST_CENTRE".  Consider
480         --      f = \x -> e
481         --      g = \y -> let v = f y in scc "x" (v ...)
482         -- Here we want to inline "f", since its CC is SUBSUMED, but we don't
483         -- want to inline "v" since its CC is dynamically determined.
484
485     current_cc = getEnclosingCC env
486     env1 | costsAreSubsumed current_cc = setEnclosingCC env useCurrentCostCentre
487          | otherwise                   = env
488
489     (tyvars, body) = collectTyBinders rhs
490 \end{code}
491
492
493 ----------------------------------------------------------------
494         An old special case that is now nuked.
495
496 First a special case for variable right-hand sides
497         v = w
498 It's OK to simplify the RHS, but it's often a waste of time.  Often
499 these v = w things persist because v is exported, and w is used 
500 elsewhere.  So if we're not careful we'll eta expand the rhs, only
501 to eta reduce it in competeNonRec.
502
503 If we leave the binding unchanged, we will certainly replace v by w at 
504 every occurrence of v, which is good enough.  
505
506 In fact, it's *better* to replace v by w than to inline w in v's rhs,
507 even if this is the only occurrence of w.  Why? Because w might have
508 IdInfo (such as strictness) that v doesn't.
509
510 Furthermore, there might be other uses of w; if so, inlining w in 
511 v's rhs will duplicate w's rhs, whereas replacing v by w doesn't.
512
513 HOWEVER, we have to be careful if w is something that *must* be
514 inlined.  In particular, its binding may have been dropped.  Here's
515 an example that actually happened:
516         let x = let y = e in y
517      in f x
518 The "let y" was floated out, and then (since y occurs once in a
519 definitely inlinable position) the binding was dropped, leaving
520         {y=e} let x = y in f x
521 But now using the reasoning of this little section, 
522 y wasn't inlined, because it was a let x=y form.
523
524
525                 HOWEVER
526
527 This "optimisation" turned out to be a bad idea.  If there's are
528 top-level exported bindings like
529
530         y = I# 3#
531         x = y
532
533 then y wasn't getting inlined in x's rhs, and we were getting
534 bad code.  So I've removed the special case from here, and
535 instead we only try eta reduction and constructor reuse 
536 in completeNonRec if the thing is *not* exported.
537
538
539 \begin{pseudocode}
540 simplRhsExpr env binder@(id,occ_info) (Var v) new_id
541  | maybeToBool maybe_stop_at_var
542  = returnSmpl (Var the_var, getIdArity the_var)
543  where
544    maybe_stop_at_var 
545      = case (runEager $ lookupId env v) of
546          VarArg v' | not (must_unfold v') -> Just v'
547          other                            -> Nothing
548
549    Just the_var = maybe_stop_at_var
550
551    must_unfold v' =  idMustBeINLINEd v'
552                   || case lookupOutIdEnv env v' of
553                         Just (_, _, InUnfolding _ _) -> True
554                         other                        -> False
555 \end{pseudocode}
556         
557                 End of old, nuked, special case.
558 ------------------------------------------------------------------
559
560
561 %************************************************************************
562 %*                                                                      *
563 \subsection{Simplify a lambda abstraction}
564 %*                                                                      *
565 %************************************************************************
566
567 Simplify (\binders -> body) trying eta expansion and reduction, given that
568 the abstraction will always be applied to at least min_no_of_args.
569
570 \begin{code}
571 simplValLam env expr min_no_of_args expr_ty
572   | not (switchIsSet env SimplDoLambdaEtaExpansion) ||  -- Bale out if eta expansion off
573
574     exprIsTrivial expr                              ||  -- or it's a trivial RHS
575         -- No eta expansion for trivial RHSs
576         -- It's rather a Bad Thing to expand
577         --      g = f alpha beta
578         -- to
579         --      g = \a b c -> f alpha beta a b c
580         --
581         -- The original RHS is "trivial" (exprIsTrivial), because it generates
582         -- no code (renames f to g).  But the new RHS isn't.
583
584     null potential_extra_binder_tys                 ||  -- or ain't a function
585     no_of_extra_binders <= 0                            -- or no extra binders needed
586   = simplBinders env binders            `thenSmpl` \ (new_env, binders') ->
587     simplExpr new_env body [] body_ty   `thenSmpl` \ body' ->
588     returnSmpl (mkValLam binders' body', final_arity)
589
590   | otherwise                           -- Eta expansion possible
591   = -- A SSERT( no_of_extra_binders <= length potential_extra_binder_tys )
592     (if not ( no_of_extra_binders <= length potential_extra_binder_tys ) then
593         pprTrace "simplValLam" (vcat [ppr expr, 
594                                           ppr expr_ty,
595                                           ppr binders,
596                                           int no_of_extra_binders,
597                                           ppr potential_extra_binder_tys])
598     else \x -> x) $
599
600     tick EtaExpansion                   `thenSmpl_`
601     simplBinders env binders            `thenSmpl` \ (new_env, binders') ->
602     newIds extra_binder_tys                                             `thenSmpl` \ extra_binders' ->
603     simplExpr new_env body (map VarArg extra_binders') etad_body_ty     `thenSmpl` \ body' ->
604     returnSmpl (
605       mkValLam (binders' ++ extra_binders') body',
606       final_arity
607     )
608
609   where
610     (binders,body)             = collectValBinders expr
611     no_of_binders              = length binders
612     (arg_tys, res_ty)          = splitFunTys expr_ty
613     potential_extra_binder_tys = (if not (no_of_binders <= length arg_tys) then
614                                         pprTrace "simplValLam" (vcat [ppr expr, 
615                                                                           ppr expr_ty,
616                                                                           ppr binders])
617                                   else \x->x) $
618                                  drop no_of_binders arg_tys
619     body_ty                    = mkFunTys potential_extra_binder_tys res_ty
620
621         -- Note: it's possible that simplValLam will be applied to something
622         -- with a forall type.  Eg when being applied to the rhs of
623         --              let x = wurble
624         -- where wurble has a forall-type, but no big lambdas at the top.
625         -- We could be clever an insert new big lambdas, but we don't bother.
626
627     etad_body_ty        = mkFunTys (drop no_of_extra_binders potential_extra_binder_tys) res_ty
628     extra_binder_tys    = take no_of_extra_binders potential_extra_binder_tys
629     final_arity         = atLeastArity (no_of_binders + no_of_extra_binders)
630
631     no_of_extra_binders =       -- First, use the info about how many args it's
632                                 -- always applied to in its scope; but ignore this
633                                 -- info for thunks. To see why we ignore it for thunks,
634                                 -- consider     let f = lookup env key in (f 1, f 2)
635                                 -- We'd better not eta expand f just because it is 
636                                 -- always applied!
637                            (min_no_of_args - no_of_binders)
638
639                                 -- Next, try seeing if there's a lambda hidden inside
640                                 -- something cheap.
641                                 -- etaExpandCount can reuturn a huge number (like 10000!) if
642                                 -- it finds that the body is a call to "error"; hence
643                                 -- the use of "min" here.
644                            `max`
645                            (etaExpandCount body `min` length potential_extra_binder_tys)
646
647                                 -- Finally, see if it's a state transformer, in which
648                                 -- case we eta-expand on principle! This can waste work,
649                                 -- but usually doesn't
650                            `max`
651                            case potential_extra_binder_tys of
652                                 [ty] | ty == realWorldStatePrimTy -> 1
653                                 other                             -> 0
654 \end{code}
655
656
657 %************************************************************************
658 %*                                                                      *
659 \subsection[Simplify-var]{Variables}
660 %*                                                                      *
661 %************************************************************************
662
663 Check if there's a macro-expansion, and if so rattle on.  Otherwise do
664 the more sophisticated stuff.
665
666 \begin{code}
667 simplVar env inline_call var args result_ty
668   = case lookupIdSubst env var of
669   
670       Just (SubstExpr ty_subst id_subst expr)
671         -> simplExpr (setSubstEnvs env (ty_subst, id_subst)) expr args result_ty
672
673       Just (SubstLit lit)               -- A boring old literal
674         -> ASSERT( null args )
675            returnSmpl (Lit lit)
676
677       Just (SubstVar var')              -- More interesting!  An id!
678         -> completeVar env inline_call var' args result_ty
679
680       Nothing  -- Not in the substitution; hand off to completeVar
681         -> completeVar env inline_call var args result_ty 
682 \end{code}
683
684
685 %************************************************************************
686 %*                                                                      *
687 \subsection[Simplify-coerce]{Coerce expressions}
688 %*                                                                      *
689 %************************************************************************
690
691 \begin{code}
692 -- (coerce (case s of p -> r)) args ==> case s of p -> (coerce r) args
693 simplCoerce env to_ty from_ty expr@(Case scrut alts) args result_ty
694   = simplCase env scrut (getSubstEnvs env, alts)
695               (\env rhs -> simplCoerce env to_ty from_ty rhs args result_ty)
696               result_ty
697
698 -- (coerce (let defns in b)) args  ==> let defns' in (coerce b) args
699 simplCoerce env to_ty from_ty (Let bind body) args result_ty
700   = simplBind env bind (\env -> simplCoerce env to_ty from_ty body args result_ty) result_ty
701
702 -- Default case
703 -- NB: we do *not* push the argments inside the coercion
704
705 simplCoerce env to_ty from_ty expr args result_ty
706   = simplTy env to_ty                   `appEager` \ to_ty' ->
707     simplTy env from_ty                 `appEager` \ from_ty' ->
708     simplExpr env expr [] from_ty'      `thenSmpl` \ expr' ->
709     returnSmpl (mkGenApp (mkCoerce to_ty' from_ty' expr') args)
710   where
711         -- Try cancellation; we do this "on the way up" because
712         -- I think that's where it'll bite best
713     mkCoerce to_ty1 from_ty1 (Note (Coerce to_ty2 from_ty2) body)
714         = ASSERT( from_ty1 == to_ty2 )
715           mkCoerce to_ty1 from_ty2 body
716     mkCoerce to_ty from_ty body
717         | to_ty == from_ty = body
718         | otherwise        = Note (Coerce to_ty from_ty) body
719 \end{code}
720
721
722 %************************************************************************
723 %*                                                                      *
724 \subsection[Simplify-scc]{SCC expressions
725 %*                                                                      *
726 %************************************************************************
727
728 1) Eliminating nested sccs ...
729 We must be careful to maintain the scc counts ...
730
731 \begin{code}
732 simplSCC env cc1 (Note (SCC cc2) expr) args result_ty
733   | not (isSccCountCostCentre cc2) && case cmpCostCentre cc1 cc2 of { EQ -> True; _ -> False }
734         -- eliminate inner scc if no call counts and same cc as outer
735   = simplSCC env cc1 expr args result_ty
736
737   | not (isSccCountCostCentre cc2) && not (isSccCountCostCentre cc1)
738         -- eliminate outer scc if no call counts associated with either ccs
739   = simplSCC env cc2 expr args result_ty
740 \end{code}
741
742 2) Moving sccs inside lambdas ...
743   
744 \begin{code}
745 simplSCC env cc (Lam binder@(ValBinder _) body) args result_ty
746   | not (isSccCountCostCentre cc)
747         -- move scc inside lambda only if no call counts
748   = simplExpr env (Lam binder (Note (SCC cc) body)) args result_ty
749
750 simplSCC env cc (Lam binder body) args result_ty
751         -- always ok to move scc inside type/usage lambda
752   = simplExpr env (Lam binder (Note (SCC cc) body)) args result_ty
753 \end{code}
754
755 3) Eliminating dict sccs ...
756
757 \begin{code}
758 simplSCC env cc expr args result_ty
759   | squashableDictishCcExpr cc expr
760         -- eliminate dict cc if trivial dict expression
761   = simplExpr env expr args result_ty
762 \end{code}
763
764 4) Moving arguments inside the body of an scc ...
765 This moves the cost of doing the application inside the scc
766 (which may include the cost of extracting methods etc)
767
768 \begin{code}
769 simplSCC env cc body args result_ty
770   = let
771         new_env = setEnclosingCC env cc
772     in
773     simplExpr new_env body args result_ty               `thenSmpl` \ body' ->
774     returnSmpl (Note (SCC cc) body')
775 \end{code}
776
777
778 %************************************************************************
779 %*                                                                      *
780 \subsection[Simplify-bind]{Binding groups}
781 %*                                                                      *
782 %************************************************************************
783
784 \begin{code}
785 simplBind :: SimplEnv
786           -> InBinding
787           -> (SimplEnv -> SmplM OutExpr)
788           -> OutType
789           -> SmplM OutExpr
790
791 simplBind env (NonRec binder rhs) body_c body_ty = simplNonRec env binder rhs body_c body_ty
792 simplBind env (Rec pairs)         body_c body_ty = simplRec    env pairs      body_c body_ty
793 \end{code}
794
795
796 %************************************************************************
797 %*                                                                      *
798 \subsection[Simplify-let]{Let-expressions}
799 %*                                                                      *
800 %************************************************************************
801
802 Float switches
803 ~~~~~~~~~~~~~~
804 The booleans controlling floating have to be set with a little care.
805 Here's one performance bug I found:
806
807         let x = let y = let z = case a# +# 1 of {b# -> E1}
808                         in E2
809                 in E3
810         in E4
811
812 Now, if E2, E3 aren't HNFs we won't float the y-binding or the z-binding.
813 Before case_floating_ok included float_exposes_hnf, the case expression was floated
814 *one level per simplifier iteration* outwards.  So it made th s
815
816
817 Floating case from let
818 ~~~~~~~~~~~~~~~~~~~~~~
819 When floating cases out of lets, remember this:
820
821         let x* = case e of alts
822         in <small expr>
823
824 where x* is sure to be demanded or e is a cheap operation that cannot
825 fail, e.g. unboxed addition.  Here we should be prepared to duplicate
826 <small expr>.  A good example:
827
828         let x* = case y of
829                    p1 -> build e1
830                    p2 -> build e2
831         in
832         foldr c n x*
833 ==>
834         case y of
835           p1 -> foldr c n (build e1)
836           p2 -> foldr c n (build e2)
837
838 NEW: We use the same machinery that we use for case-of-case to
839 *always* do case floating from let, that is we let bind and abstract
840 the original let body, and let the occurrence analyser later decide
841 whether the new let should be inlined or not. The example above
842 becomes:
843
844 ==>
845       let join_body x' = foldr c n x'
846         in case y of
847         p1 -> let x* = build e1
848                 in join_body x*
849         p2 -> let x* = build e2
850                 in join_body x*
851
852 note that join_body is a let-no-escape.
853 In this particular example join_body will later be inlined,
854 achieving the same effect.
855 ToDo: check this is OK with andy
856
857
858 Let to case: two points
859 ~~~~~~~~~~~
860
861 Point 1.  We defer let-to-case for all data types except single-constructor
862 ones.  Suppose we change
863
864         let x* = e in b
865 to
866         case e of x -> b
867
868 It can be the case that we find that b ultimately contains ...(case x of ..)....
869 and this is the only occurrence of x.  Then if we've done let-to-case
870 we can't inline x, which is a real pain.  On the other hand, we lose no
871 transformations by not doing this transformation, because the relevant
872 case-of-X transformations are also implemented by simpl_bind.
873
874 If x is a single-constructor type, then we go ahead anyway, giving
875
876         case e of (y,z) -> let x = (y,z) in b
877
878 because now we can squash case-on-x wherever they occur in b.
879
880 We do let-to-case on multi-constructor types in the tidy-up phase
881 (tidyCoreExpr) mainly so that the code generator doesn't need to
882 spot the demand-flag.
883
884
885 Point 2.  It's important to try let-to-case before doing the
886 strict-let-of-case transformation, which happens in the next equation
887 for simpl_bind.
888
889         let a*::Int = case v of {p1->e1; p2->e2}
890         in b
891
892 (The * means that a is sure to be demanded.)
893 If we do case-floating first we get this:
894
895         let k = \a* -> b
896         in case v of
897                 p1-> let a*=e1 in k a
898                 p2-> let a*=e2 in k a
899
900 Now watch what happens if we do let-to-case first:
901
902         case (case v of {p1->e1; p2->e2}) of
903           Int a# -> let a*=I# a# in b
904 ===>
905         let k = \a# -> let a*=I# a# in b
906         in case v of
907                 p1 -> case e1 of I# a# -> k a#
908                 p1 -> case e2 of I# a# -> k a#
909
910 The latter is clearly better.  (Remember the reboxing let-decl for a
911 is likely to go away, because after all b is strict in a.)
912
913 We do not do let to case for WHNFs, e.g.
914
915           let x = a:b in ...
916           =/=>
917           case a:b of x in ...
918
919 as this is less efficient.  but we don't mind doing let-to-case for
920 "bottom", as that will allow us to remove more dead code, if anything:
921
922           let x = error in ...
923           ===>
924           case error  of x -> ...
925           ===>
926           error
927
928 Notice that let to case occurs only if x is used strictly in its body
929 (obviously).
930
931
932 \begin{code}
933 -- Dead code is now discarded by the occurrence analyser,
934
935 simplNonRec env binder@(id,_) rhs body_c body_ty
936   | inlineUnconditionally binder
937   =     -- The binder is used in definitely-inline way in the body
938         -- So add it to the environment, drop the binding, and continue
939     body_c (bindIdToExpr env binder rhs)
940
941   | idWantsToBeINLINEd id
942   = complete_bind env rhs       -- Don't mess about with floating or let-to-case on
943                                 -- INLINE things
944
945         -- Do let-to-case right away for unpointed types
946         -- These shouldn't occur much, but do occur right after desugaring,
947         -- because we havn't done dependency analysis at that point, so
948         -- we can't trivially do let-to-case (because there may be some unboxed
949         -- things bound in letrecs that aren't really recursive).
950   | isUnpointedType rhs_ty && not rhs_is_whnf
951   = simplCase env rhs (getSubstEnvs env, PrimAlts [] (BindDefault binder (Var id)))
952                       (\env rhs -> complete_bind env rhs) body_ty
953
954         -- Try let-to-case; see notes below about let-to-case
955   | try_let_to_case &&
956     will_be_demanded &&
957     (  rhs_is_bot
958     || (not rhs_is_whnf && singleConstructorType rhs_ty)
959                 -- Don't do let-to-case if the RHS is a constructor application.
960                 -- Even then only do it for single constructor types. 
961                 -- For other types we defer doing it until the tidy-up phase at
962                 -- the end of simplification.
963     )
964   = tick Let2Case                               `thenSmpl_`
965     simplCase env rhs (getSubstEnvs env, AlgAlts [] (BindDefault binder (Var id)))
966                       (\env rhs -> complete_bind env rhs) body_ty
967                 -- OLD COMMENT:  [now the new RHS is only "x" so there's less worry]
968                 -- NB: it's tidier to call complete_bind not simpl_bind, else
969                 -- we nearly end up in a loop.  Consider:
970                 --      let x = rhs in b
971                 -- ==>  case rhs of (p,q) -> let x=(p,q) in b
972                 -- This effectively what the above simplCase call does.
973                 -- Now, the inner let is a let-to-case target again!  Actually, since
974                 -- the RHS is in WHNF it won't happen, but it's a close thing!
975
976   | otherwise
977   = simpl_bind env rhs
978   where
979     -- Try let-from-let
980     simpl_bind env (Let bind rhs) | let_floating_ok
981       = tick LetFloatFromLet                    `thenSmpl_`
982         simplBind env (if will_be_demanded then bind 
983                                            else un_demandify_bind bind)
984                       (\env -> simpl_bind env rhs) body_ty
985
986     -- Try case-from-let; this deals with a strict let of error too
987     simpl_bind env (Case scrut alts) | case_floating_ok scrut
988       = tick CaseFloatFromLet                           `thenSmpl_`
989
990         -- First, bind large let-body if necessary
991         if isSingleton (nonErrorRHSs alts)
992         then
993             simplCase env scrut (getSubstEnvs env, alts) 
994                       (\env rhs -> simpl_bind env rhs) body_ty
995         else
996             bindLargeRhs env [binder] body_ty body_c    `thenSmpl` \ (extra_binding, new_body) ->
997             let
998                 body_c' = \env -> simplExpr env new_body [] body_ty
999                 case_c  = \env rhs -> simplNonRec env binder rhs body_c' body_ty
1000             in
1001             simplCase env scrut (getSubstEnvs env, alts) case_c body_ty `thenSmpl` \ case_expr ->
1002             returnSmpl (Let extra_binding case_expr)
1003
1004     -- None of the above; simplify rhs and tidy up
1005     simpl_bind env rhs = complete_bind env rhs
1006  
1007     complete_bind env rhs
1008       = simplBinder env binder                  `thenSmpl` \ (env_w_clone, new_id) ->
1009         simplRhsExpr env binder rhs new_id      `thenSmpl` \ (rhs',arity) ->
1010         completeNonRec env_w_clone binder 
1011                 (new_id `withArity` arity) rhs' `thenSmpl` \ (new_env, binds) ->
1012         body_c new_env                          `thenSmpl` \ body' ->
1013         returnSmpl (mkCoLetsAny binds body')
1014
1015
1016         -- All this stuff is computed at the start of the simpl_bind loop
1017     float_lets                = switchIsSet env SimplFloatLetsExposingWHNF
1018     float_primops             = switchIsSet env SimplOkToFloatPrimOps
1019     always_float_let_from_let = switchIsSet env SimplAlwaysFloatLetsFromLets
1020     try_let_to_case           = switchIsSet env SimplLetToCase
1021     no_float                  = switchIsSet env SimplNoLetFromStrictLet
1022
1023     demand_info      = getIdDemandInfo id
1024     will_be_demanded = willBeDemanded demand_info
1025     rhs_ty           = idType id
1026
1027     form        = mkFormSummary rhs
1028     rhs_is_bot  = case form of
1029                         BottomForm -> True
1030                         other      -> False
1031     rhs_is_whnf = case form of
1032                         VarForm -> True
1033                         ValueForm -> True
1034                         other -> False
1035
1036     float_exposes_hnf = floatExposesHNF float_lets float_primops rhs
1037
1038     let_floating_ok  = (will_be_demanded && not no_float) ||
1039                        always_float_let_from_let ||
1040                        float_exposes_hnf
1041
1042     case_floating_ok scrut = (will_be_demanded && not no_float) || 
1043                              (float_exposes_hnf && is_cheap_prim_app scrut && float_primops)
1044         -- See note below 
1045 \end{code}
1046
1047
1048 @completeNonRec@ looks at the simplified post-floating RHS of the
1049 let-expression, with a view to turning
1050         x = e
1051 into
1052         x = y
1053 where y is just a variable.  Now we can eliminate the binding
1054 altogether, and replace x by y throughout.
1055
1056 There are two cases when we can do this:
1057
1058         * When e is a constructor application, and we have
1059           another variable in scope bound to the same
1060           constructor application.  [This is just a special
1061           case of common-subexpression elimination.]
1062
1063         * When e can be eta-reduced to a variable.  E.g.
1064                 x = \a b -> y a b
1065
1066
1067 HOWEVER, if x is exported, we don't attempt this at all.  Why not?
1068 Because then we can't remove the x=y binding, in which case we 
1069 have just made things worse, perhaps a lot worse.
1070
1071 \begin{code}
1072 completeNonRec env binder new_id new_rhs
1073   = returnSmpl (env', [NonRec b r | (b,r) <- binds])
1074   where
1075     (env', binds) = completeBind env binder new_id new_rhs
1076
1077
1078 completeBind :: SimplEnv 
1079              -> InBinder -> OutId -> OutExpr            -- Id and RHS
1080              -> (SimplEnv, [(OutId, OutExpr)])          -- Final envt and binding(s)
1081
1082 completeBind env binder@(_,occ_info) new_id new_rhs
1083   | idMustNotBeINLINEd new_id           -- Occurrence analyser says "don't inline"
1084   = (env, new_binds)
1085
1086   |  atomic_rhs                 -- If rhs (after eta reduction) is atomic
1087   && not (isExported new_id)    -- and binder isn't exported
1088   =     -- Drop the binding completely
1089     let
1090         env1 = notInScope env new_id
1091         env2 = bindIdToAtom env1 binder the_arg
1092     in
1093     (env2, [])
1094
1095   |  atomic_rhs                 -- Rhs is atomic, and new_id is exported
1096   && case eta'd_rhs of { Var v -> isLocallyDefined v && not (isExported v); other -> False }
1097   =     -- The local variable v will be eliminated next time round
1098         -- in favour of new_id, so it's a waste to replace all new_id's with v's
1099         -- this time round.
1100         -- This case is an optional improvement; saves a simplifier iteration
1101     (env, [(new_id, eta'd_rhs)])
1102
1103   | otherwise                           -- Non-atomic
1104   = let
1105         env1 = extendEnvGivenBinding env occ_info new_id new_rhs
1106     in 
1107     (env1, new_binds)
1108              
1109   where
1110     new_binds  = [(new_id, new_rhs)]
1111     atomic_rhs = is_atomic eta'd_rhs
1112     eta'd_rhs  = case lookForConstructor env new_rhs of 
1113                    Just v -> Var v
1114                    other  -> etaCoreExpr new_rhs
1115
1116     the_arg    = case eta'd_rhs of
1117                           Var v -> VarArg v
1118                           Lit l -> LitArg l
1119 \end{code}
1120
1121 ----------------------------------------------------------------------------
1122         A digression on constructor CSE
1123
1124 Consider
1125 @
1126         f = \x -> case x of
1127                     (y:ys) -> y:ys
1128                     []     -> ...
1129 @
1130 Is it a good idea to replace the rhs @y:ys@ with @x@?  This depends a
1131 bit on the compiler technology, but in general I believe not. For
1132 example, here's some code from a real program:
1133 @
1134 const.Int.max.wrk{-s2516-} =
1135     \ upk.s3297#  upk.s3298# ->
1136         let {
1137           a.s3299 :: Int
1138           _N_ {-# U(P) #-}
1139           a.s3299 = I#! upk.s3297#
1140         } in
1141           case (const.Int._tagCmp.wrk{-s2513-} upk.s3297# upk.s3298#) of {
1142             _LT -> I#! upk.s3298#
1143             _EQ -> a.s3299
1144             _GT -> a.s3299
1145           }
1146 @
1147 The a.s3299 really isn't doing much good.  We'd be better off inlining
1148 it.  (Actually, let-no-escapery means it isn't as bad as it looks.)
1149
1150 So the current strategy is to inline all known-form constructors, and
1151 only do the reverse (turn a constructor application back into a
1152 variable) when we find a let-expression:
1153 @
1154         let x = C a1 .. an
1155         in
1156         ... (let y = C a1 .. an in ...) ...
1157 @
1158 where it is always good to ditch the binding for y, and replace y by
1159 x.
1160                 End of digression
1161 ----------------------------------------------------------------------------
1162
1163 ----------------------------------------------------------------------------
1164                 A digression on "optimising" coercions
1165
1166    The trouble is that we kept transforming
1167                 let x = coerce e
1168                     y = coerce x
1169                 in ...
1170    to
1171                 let x' = coerce e
1172                     y' = coerce x'
1173                 in ...
1174    and counting a couple of ticks for this non-transformation
1175 \begin{pseudocode}
1176         -- We want to ensure that all let-bound Coerces have 
1177         -- atomic bodies, so they can freely be inlined.
1178 completeNonRec env binder new_id (Coerce coercion ty rhs)
1179   | not (is_atomic rhs)
1180   = newId (coreExprType rhs)                            `thenSmpl` \ inner_id ->
1181     completeNonRec env 
1182                    (inner_id, dangerousArgOcc) inner_id rhs `thenSmpl` \ (env1, binds1) ->
1183         -- Dangerous occ because, like constructor args,
1184         -- it can be duplicated easily
1185     let
1186         atomic_rhs = case runEager $ lookupId env1 inner_id of
1187                         LitArg l -> Lit l
1188                         VarArg v -> Var v
1189     in
1190     completeNonRec env1 binder new_id
1191                    (Coerce coercion ty atomic_rhs)      `thenSmpl` \ (env2, binds2) ->
1192
1193     returnSmpl (env2, binds1 ++ binds2)
1194 \end{pseudocode}
1195 ----------------------------------------------------------------------------
1196
1197
1198
1199 %************************************************************************
1200 %*                                                                      *
1201 \subsection[Simplify-letrec]{Letrec-expressions}
1202 %*                                                                      *
1203 %************************************************************************
1204
1205 Letrec expressions
1206 ~~~~~~~~~~~~~~~~~~
1207 Here's the game plan
1208
1209 1. Float any let(rec)s out of the RHSs
1210 2. Clone all the Ids and extend the envt with these clones
1211 3. Simplify one binding at a time, adding each binding to the
1212    environment once it's done.
1213
1214 This relies on the occurrence analyser to
1215         a) break all cycles with an Id marked MustNotBeInlined
1216         b) sort the decls into topological order
1217 The former prevents infinite inlinings, and the latter means
1218 that we get maximum benefit from working top to bottom.
1219
1220
1221 \begin{code}
1222 simplRec env pairs body_c body_ty
1223   =     -- Do floating, if necessary
1224     floatBind env False (Rec pairs)     `thenSmpl` \ [Rec pairs'] ->
1225     let
1226         binders = map fst pairs'
1227     in
1228     simplBinders env binders                            `thenSmpl` \ (env_w_clones, ids') ->
1229     simplRecursiveGroup env_w_clones ids' pairs'        `thenSmpl` \ (pairs', new_env) ->
1230
1231     body_c new_env                                      `thenSmpl` \ body' ->
1232
1233     returnSmpl (Let (Rec pairs') body')
1234 \end{code}
1235
1236 \begin{code}
1237 -- The env passed to simplRecursiveGroup already has 
1238 -- bindings that clone the variables of the group.
1239 simplRecursiveGroup env new_ids []
1240   = returnSmpl ([], env)
1241
1242 simplRecursiveGroup env (new_id : new_ids) ((binder, rhs) : pairs)
1243   | inlineUnconditionally binder
1244   =     -- Single occurrence, so drop binding and extend env with the inlining
1245         -- This is a little delicate, because what if the unique occurrence
1246         -- is *before* this binding?  This'll never happen, because
1247         -- either it'll be marked "never inline" or else its occurrence will
1248         -- occur after its binding in the group.
1249         --
1250         -- If these claims aren't right Core Lint will spot an unbound
1251         -- variable.  A quick fix is to delete this clause for simplRecursiveGroup
1252     let
1253         new_env = bindIdToExpr env binder rhs
1254     in
1255     simplRecursiveGroup new_env new_ids pairs
1256
1257   | otherwise
1258   = simplRhsExpr env binder rhs new_id          `thenSmpl` \ (new_rhs, arity) ->
1259     let
1260         new_id'   = new_id `withArity` arity
1261         (new_env, new_binds') = completeBind env binder new_id' new_rhs
1262     in
1263     simplRecursiveGroup new_env new_ids pairs   `thenSmpl` \ (new_pairs, final_env) ->
1264     returnSmpl (new_binds' ++ new_pairs, final_env)   
1265 \end{code}
1266
1267
1268
1269 \begin{code}
1270 floatBind :: SimplEnv
1271           -> Bool                               -- True <=> Top level
1272           -> InBinding
1273           -> SmplM [InBinding]
1274
1275 floatBind env top_level bind
1276   | not float_lets ||
1277     n_extras == 0
1278   = returnSmpl [bind]
1279
1280   | otherwise      
1281   = tickN LetFloatFromLet n_extras              `thenSmpl_` 
1282                 -- It's important to increment the tick counts if we
1283                 -- do any floating.  A situation where this turns out
1284                 -- to be important is this:
1285                 -- Float in produces:
1286                 --      letrec  x = let y = Ey in Ex
1287                 --      in B
1288                 -- Now floating gives this:
1289                 --      letrec x = Ex
1290                 --             y = Ey
1291                 --      in B
1292                 --- We now want to iterate once more in case Ey doesn't
1293                 -- mention x, in which case the y binding can be pulled
1294                 -- out as an enclosing let(rec), which in turn gives
1295                 -- the strictness analyser more chance.
1296     returnSmpl binds'
1297
1298   where
1299     binds'   = fltBind bind
1300     n_extras = sum (map no_of_binds binds') - no_of_binds bind 
1301
1302     float_lets                = switchIsSet env SimplFloatLetsExposingWHNF
1303     always_float_let_from_let = switchIsSet env SimplAlwaysFloatLetsFromLets
1304
1305         -- fltBind guarantees not to return leaky floats
1306         -- and all the binders of the floats have had their demand-info zapped
1307     fltBind (NonRec bndr rhs)
1308       = binds ++ [NonRec bndr rhs'] 
1309       where
1310         (binds, rhs') = fltRhs rhs
1311     
1312     fltBind (Rec pairs)
1313       = [Rec pairs']
1314       where
1315         pairs' = concat [ let
1316                                 (binds, rhs') = fltRhs rhs
1317                           in
1318                           foldr get_pairs [(bndr, rhs')] binds
1319                         | (bndr, rhs) <- pairs
1320                         ]
1321
1322         get_pairs (NonRec bndr rhs) rest = (bndr,rhs) :  rest
1323         get_pairs (Rec pairs)       rest = pairs      ++ rest
1324     
1325         -- fltRhs has same invariant as fltBind
1326     fltRhs rhs
1327       |  (always_float_let_from_let ||
1328           floatExposesHNF True False rhs)
1329       = fltExpr rhs
1330     
1331       | otherwise
1332       = ([], rhs)
1333     
1334     
1335         -- fltExpr has same invariant as fltBind
1336     fltExpr (Let bind body)
1337       | not top_level || binds_wont_leak
1338             -- fltExpr guarantees not to return leaky floats
1339       = (binds' ++ body_binds, body')
1340       where
1341         binds_wont_leak     = all leakFreeBind binds'
1342         (body_binds, body') = fltExpr body
1343         binds'              = fltBind (un_demandify_bind bind)
1344     
1345     fltExpr expr = ([], expr)
1346
1347 -- Crude but effective
1348 no_of_binds (NonRec _ _) = 1
1349 no_of_binds (Rec pairs)  = length pairs
1350
1351 leakFreeBind (NonRec bndr rhs) = leakFree bndr rhs
1352 leakFreeBind (Rec pairs)       = and [leakFree bndr rhs | (bndr, rhs) <- pairs]
1353
1354 leakFree (id,_) rhs = case getIdArity id of
1355                         ArityAtLeast n | n > 0 -> True
1356                         ArityExactly n | n > 0 -> True
1357                         other                  -> whnfOrBottom (mkFormSummary rhs)
1358 \end{code}
1359
1360
1361 %************************************************************************
1362 %*                                                                      *
1363 \subsection[Simplify-atoms]{Simplifying atoms}
1364 %*                                                                      *
1365 %************************************************************************
1366
1367 \begin{code}
1368 simplArg :: SimplEnv -> InArg -> Eager ans OutArg
1369
1370 simplArg env (LitArg lit) = returnEager (LitArg lit)
1371 simplArg env (TyArg  ty)  = simplTy env ty      `appEager` \ ty' -> 
1372                             returnEager (TyArg ty')
1373 simplArg env arg@(VarArg id)
1374   = case lookupIdSubst env id of
1375         Just (SubstVar id')   -> returnEager (VarArg id')
1376         Just (SubstLit lit)   -> returnEager (LitArg lit)
1377         Just (SubstExpr _ __) -> panic "simplArg"
1378         Nothing               -> case lookupOutIdEnv env id of
1379                                   Just (id', _, _) -> returnEager (VarArg id')
1380                                   Nothing          -> returnEager arg
1381 \end{code}
1382
1383 %************************************************************************
1384 %*                                                                      *
1385 \subsection[Simplify-quickies]{Some local help functions}
1386 %*                                                                      *
1387 %************************************************************************
1388
1389
1390 \begin{code}
1391 -- un_demandify_bind switches off the willBeDemanded Info field
1392 -- for bindings floated out of a non-demanded let
1393 un_demandify_bind (NonRec binder rhs)
1394    = NonRec (un_demandify_bndr binder) rhs
1395 un_demandify_bind (Rec pairs)
1396    = Rec [(un_demandify_bndr binder, rhs) | (binder,rhs) <- pairs]
1397
1398 un_demandify_bndr (id, occ_info) = (id `addIdDemandInfo` noDemandInfo, occ_info)
1399
1400 is_cheap_prim_app (Prim op _) = primOpOkForSpeculation op
1401 is_cheap_prim_app other       = False
1402
1403 computeResultType :: SimplEnv -> InType -> [OutArg] -> OutType
1404 computeResultType env expr_ty orig_args
1405   = simplTy env expr_ty         `appEager` \ expr_ty' ->
1406     let
1407         go ty [] = ty
1408         go ty (TyArg ty_arg : args) = go (mkAppTy ty ty_arg) args
1409         go ty (a:args) | isValArg a = case (splitFunTy_maybe ty) of
1410                                         Just (_, res_ty) -> go res_ty args
1411                                         Nothing          -> 
1412                                             pprPanic "computeResultType" (vcat [
1413                                                                         ppr (a:args),
1414                                                                         ppr orig_args,
1415                                                                         ppr expr_ty',
1416                                                                         ppr ty])
1417     in
1418     go expr_ty' orig_args
1419
1420
1421 var `withArity` UnknownArity = var
1422 var `withArity` arity        = var `addIdArity` arity
1423
1424 is_atomic (Var v) = True
1425 is_atomic (Lit l) = not (isNoRepLit l)
1426 is_atomic other   = False
1427 \end{code}
1428