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