2 % (c) The AQUA Project, Glasgow University, 1993-1996
4 \section[Simplify]{The main module of the simplifier}
7 module Simplify ( simplTopBinds, simplExpr, simplBind ) where
9 #include "HsVersions.h"
12 import CmdLineOpts ( SimplifierSwitch(..) )
13 import ConFold ( completePrim )
14 import CoreUnfold ( Unfolding, mkFormSummary,
15 exprIsTrivial, whnfOrBottom, inlineUnconditionally,
18 import CostCentre ( isSccCountCostCentre, cmpCostCentre, costsAreSubsumed, useCurrentCostCentre )
20 import CoreUtils ( coreExprType, nonErrorRHSs, maybeErrorApp,
21 unTagBinders, squashableDictishCcExpr
23 import Id ( idType, idMustBeINLINEd, idWantsToBeINLINEd, idMustNotBeINLINEd,
24 addIdArity, getIdArity,
25 getIdDemandInfo, addIdDemandInfo
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 )
36 import SimplVar ( completeVar, simplBinder, simplBinders, simplTyBinder, simplTyBinders )
38 import Type ( mkTyVarTy, mkTyVarTys, mkAppTy, applyTy, applyTys,
39 mkFunTys, splitAlgTyConApp_maybe,
40 splitFunTys, splitFunTy_maybe, isUnpointedType
42 import TysPrim ( realWorldStatePrimTy )
43 import Util ( Eager, appEager, returnEager, runEager, mapEager,
44 isSingleton, zipEqual, zipWithEqual, mapAndUnzip
49 The controlling flags, and what they do
50 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
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)
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
70 -ffloat-lets-ok = OK to float lets out of lets if the enclosing
71 let is strict or if the floating will expose
74 -ffloat-primops-ok = OK to float out of lets cases whose scrutinee
75 is a primop that cannot fail [simplifier].
77 -fcode-duplication-ok = allows the previous option to work on cases with
78 multiple branches [simplifier].
80 -flet-to-case = does let-to-case transformation [simplifier].
82 -fcase-of-case = does case of case transformation [simplifier].
84 -fpedantic-bottoms = does not allow:
85 case x of y -> e ===> e[x/y]
86 (which may turn bottom into non-bottom)
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
96 let x = e in ...x... ===> let x = e in ...e...
98 We have two mechanisms for inlining:
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
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.
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.
121 We *never* put a non-HNF unfolding in the UnfoldEnv except in the
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:
130 f = \y -> ...y...y...y...
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@.
137 Because of this, the "unconditional-inline" mechanism above is the
138 only way in which non-HNFs can get inlined.
143 When a variable has an INLINE pragma on it --- which includes wrappers
144 produced by the strictness analyser --- we treat it rather carefully.
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
152 in {-# INLINE y #-} y = f 3
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.)
160 So, we clean out the UnfoldEnv of all SimpleUnfolding inlinings before
161 going into such an RHS.
163 What about imports? They don't really matter much because we only
164 inline relatively small things via imports.
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.
173 %************************************************************************
175 \subsection[Simplify-simplExpr]{The main function: simplExpr}
177 %************************************************************************
179 At the top level things are a little different.
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)
185 simplTopBinds :: SimplEnv -> [InBinding] -> SmplM [OutBinding]
187 -- Dead code is now discarded by the occurrence analyser,
189 simplTopBinds env binds
190 = mapSmpl (floatBind env True) binds `thenSmpl` \ binds_s ->
191 simpl_top_binds env (concat binds_s)
193 simpl_top_binds env [] = returnSmpl []
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')
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
209 -- This may seem optional, but I found an occasion when it Really matters.
210 -- Consider foo{n} = ...foo...
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...
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')
225 %************************************************************************
227 \subsection[Simplify-simplExpr]{The main function: simplExpr}
229 %************************************************************************
233 simplExpr :: SimplEnv
234 -> InExpr -> [OutArg]
235 -> OutType -- Type of (e args); i.e. type of overall result
239 The expression returned has the same meaning as the input expression
240 applied to the specified arguments.
245 Check if there's a macro-expansion, and if so rattle on. Otherwise do
246 the more sophisticated stuff.
249 simplExpr env (Var var) args result_ty
250 = case lookupIdSubst env var of
252 Just (SubstExpr ty_subst id_subst expr)
253 -> simplExpr (setSubstEnvs env (ty_subst, id_subst)) expr args result_ty
255 Just (SubstLit lit) -- A boring old literal
256 -> ASSERT( null args )
259 Just (SubstVar var') -- More interesting! An id!
260 -> completeVar env var' args result_ty
262 Nothing -- Not in the substitution; hand off to completeVar
263 -> completeVar env var args result_ty
270 simplExpr env (Lit l) [] result_ty = returnSmpl (Lit l)
272 simplExpr env (Lit l) _ _ = panic "simplExpr:Lit with argument"
276 Primitive applications are simple.
277 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
279 NB: Prim expects an empty argument list! (Because it should be
280 saturated and not higher-order. ADR)
283 simplExpr env (Prim op prim_args) args result_ty
285 mapEager (simplArg env) prim_args `appEager` \ prim_args' ->
286 simpl_op op `appEager` \ op' ->
287 completePrim env op' prim_args'
289 -- PrimOps just need any types in them renamed.
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')
296 simpl_op other_op = returnEager other_op
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).
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')
312 Applications are easy too:
313 ~~~~~~~~~~~~~~~~~~~~~~~~~~
314 Just stuff 'em in the arg stack
317 simplExpr env (App fun arg) args result_ty
318 = simplArg env arg `appEager` \ arg' ->
319 simplExpr env fun (arg' : args) result_ty
325 First the case when it's applied to an argument.
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
334 simplExpr env tylam@(Lam (TyBinder tyvar) body) [] result_ty
335 = simplTyBinder env tyvar `thenSmpl` \ (new_env, tyvar') ->
337 new_result_ty = applyTy result_ty (mkTyVarTy tyvar')
339 simplExpr new_env body [] new_result_ty `thenSmpl` \ body' ->
340 returnSmpl (Lam (TyBinder tyvar') body')
343 simplExpr env (Lam (TyBinder _) _) (_ : _) result_ty
344 = panic "simplExpr:TyLam with non-TyArg"
352 There's a complication with lambdas that aren't saturated.
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.
364 simplExpr env expr@(Lam (ValBinder binder) body) orig_args result_ty
365 = go 0 env expr orig_args
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
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!
377 new_env = markDangerousOccs env orig_args
379 simplValLam new_env expr 0 {- Guaranteed applied to at least 0 args! -} result_ty
380 `thenSmpl` \ (expr', arity) ->
383 go n env non_val_lam_expr args -- The lambda had enough arguments
384 = simplExpr env non_val_lam_expr args result_ty
392 simplExpr env (Let bind body) args result_ty
393 = simplBind env bind (\env -> simplExpr env body args result_ty) result_ty
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)
411 simplExpr env (Coerce coercion ty body) args result_ty
412 = simplCoerce env coercion ty body args result_ty
419 1) Eliminating nested sccs ...
420 We must be careful to maintain the scc counts ...
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
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
433 2) Moving sccs inside lambdas ...
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
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
446 3) Eliminating dict sccs ...
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
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)
460 simplExpr env (SCC cost_centre body) args result_ty
462 new_env = setEnclosingCC env cost_centre
464 simplExpr new_env body args result_ty `thenSmpl` \ body' ->
465 returnSmpl (SCC cost_centre body')
468 %************************************************************************
470 \subsection{Simplify RHS of a Let/Letrec}
472 %************************************************************************
474 simplRhsExpr does arity-expansion. That is, given:
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
480 it transforms the rhs to
482 /\tyvars -> \a1 ... an b(n+1) ... bk -> (e b(n+1) ... bk)
484 This is a Very Good Thing!
491 -> OutId -- The new binder (used only for its type)
492 -> SmplM (OutExpr, ArityInfo)
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)
504 | otherwise -- OK, use the big hammer
505 = -- Deal with the big lambda part
506 simplTyBinders rhs_env tyvars `thenSmpl` \ (lam_env, tyvars') ->
508 body_ty = applyTys rhs_ty (mkTyVarTys tyvars')
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) ->
515 -- Put on the big lambdas, trying to float out any bindings caught inside
516 mkRhsTyLam tyvars' lambda' `thenSmpl` \ rhs' ->
518 returnSmpl (rhs', arity)
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
526 -- The top level "enclosing CC" is "SUBSUMED". But the enclosing CC
527 -- for the rhs of top level defs is "OST_CENTRE". Consider
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.
533 current_cc = getEnclosingCC env
534 env1 | costsAreSubsumed current_cc = setEnclosingCC env useCurrentCostCentre
537 (tyvars, body) = collectTyBinders rhs
541 ----------------------------------------------------------------
542 An old special case that is now nuked.
544 First a special case for variable right-hand sides
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.
551 If we leave the binding unchanged, we will certainly replace v by w at
552 every occurrence of v, which is good enough.
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.
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.
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
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.
575 This "optimisation" turned out to be a bad idea. If there's are
576 top-level exported bindings like
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.
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)
593 = case (runEager $ lookupId env v) of
594 VarArg v' | not (must_unfold v') -> Just v'
597 Just the_var = maybe_stop_at_var
599 must_unfold v' = idMustBeINLINEd v'
600 || case lookupOutIdEnv env v' of
601 Just (_, _, InUnfolding _ _) -> True
605 End of old, nuked, special case.
606 ------------------------------------------------------------------
609 %************************************************************************
611 \subsection{Simplify a lambda abstraction}
613 %************************************************************************
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.
619 simplValLam env expr min_no_of_args expr_ty
620 | not (switchIsSet env SimplDoLambdaEtaExpansion) || -- Bale out if eta expansion off
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
627 -- g = \a b c -> f alpha beta a b c
629 -- The original RHS is "trivial" (exprIsTrivial), because it generates
630 -- no code (renames f to g). But the new RHS isn't.
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)
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,
644 int no_of_extra_binders,
645 ppr potential_extra_binder_tys])
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' ->
653 mkValLam (binders' ++ extra_binders') body',
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,
666 drop no_of_binders arg_tys
667 body_ty = mkFunTys potential_extra_binder_tys res_ty
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
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.
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)
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
685 (min_no_of_args - no_of_binders)
687 -- Next, try seeing if there's a lambda hidden inside
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.
693 (etaExpandCount body `min` length potential_extra_binder_tys)
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
699 case potential_extra_binder_tys of
700 [ty] | ty == realWorldStatePrimTy -> 1
706 %************************************************************************
708 \subsection[Simplify-coerce]{Coerce expressions}
710 %************************************************************************
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)
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
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)
730 expr_ty = coreExprType (unTagBinders expr) -- Rather like simplCase other_scrut
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
739 %************************************************************************
741 \subsection[Simplify-bind]{Binding groups}
743 %************************************************************************
746 simplBind :: SimplEnv
748 -> (SimplEnv -> SmplM OutExpr)
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
757 %************************************************************************
759 \subsection[Simplify-let]{Let-expressions}
761 %************************************************************************
765 The booleans controlling floating have to be set with a little care.
766 Here's one performance bug I found:
768 let x = let y = let z = case a# +# 1 of {b# -> E1}
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
778 Floating case from let
779 ~~~~~~~~~~~~~~~~~~~~~~
780 When floating cases out of lets, remember this:
782 let x* = case e of alts
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:
796 p1 -> foldr c n (build e1)
797 p2 -> foldr c n (build e2)
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
806 let join_body x' = foldr c n x'
808 p1 -> let x* = build e1
810 p2 -> let x* = build e2
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
819 Let to case: two points
822 Point 1. We defer let-to-case for all data types except single-constructor
823 ones. Suppose we change
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.
835 If x is a single-constructor type, then we go ahead anyway, giving
837 case e of (y,z) -> let x = (y,z) in b
839 because now we can squash case-on-x wherever they occur in b.
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.
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
850 let a*::Int = case v of {p1->e1; p2->e2}
853 (The * means that a is sure to be demanded.)
854 If we do case-floating first we get this:
858 p1-> let a*=e1 in k a
859 p2-> let a*=e2 in k a
861 Now watch what happens if we do let-to-case first:
863 case (case v of {p1->e1; p2->e2}) of
864 Int a# -> let a*=I# a# in b
866 let k = \a# -> let a*=I# a# in b
868 p1 -> case e1 of I# a# -> k a#
869 p1 -> case e2 of I# a# -> k a#
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.)
874 We do not do let to case for WHNFs, e.g.
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:
885 case error of x -> ...
889 Notice that let to case occurs only if x is used strictly in its body
894 -- Dead code is now discarded by the occurrence analyser,
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)
902 | idWantsToBeINLINEd id
903 = complete_bind env rhs -- Don't mess about with floating or let-to-case on
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
915 -- Try let-to-case; see notes below about let-to-case
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.
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:
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!
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
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_`
951 -- First, bind large let-body if necessary
952 if ok_to_dup || isSingleton (nonErrorRHSs alts)
954 simplCase env scrut (getSubstEnvs env, alts)
955 (\env rhs -> simpl_bind env rhs) body_ty
957 bindLargeRhs env [binder] body_ty body_c `thenSmpl` \ (extra_binding, new_body) ->
959 body_c' = \env -> simplExpr env new_body [] body_ty
960 case_c = \env rhs -> simplNonRec env binder rhs body_c' body_ty
962 simplCase env scrut (getSubstEnvs env, alts) case_c body_ty `thenSmpl` \ case_expr ->
963 returnSmpl (Let extra_binding case_expr)
965 -- None of the above; simplify rhs and tidy up
966 simpl_bind env rhs = complete_bind env rhs
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')
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
985 demand_info = getIdDemandInfo id
986 will_be_demanded = willBeDemanded demand_info
989 form = mkFormSummary rhs
990 rhs_is_bot = case form of
993 rhs_is_whnf = case form of
998 float_exposes_hnf = floatExposesHNF float_lets float_primops ok_to_dup rhs
1000 let_floating_ok = (will_be_demanded && not no_float) ||
1001 always_float_let_from_let ||
1004 case_floating_ok scrut = (will_be_demanded && not no_float) ||
1005 (float_exposes_hnf && is_cheap_prim_app scrut && float_primops)
1010 @completeNonRec@ looks at the simplified post-floating RHS of the
1011 let-expression, with a view to turning
1015 where y is just a variable. Now we can eliminate the binding
1016 altogether, and replace x by y throughout.
1018 There are two cases when we can do this:
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.]
1025 * When e can be eta-reduced to a variable. E.g.
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.
1034 completeNonRec env binder new_id new_rhs
1035 = returnSmpl (env', [NonRec b r | (b,r) <- binds])
1037 (env', binds) = completeBind env binder new_id new_rhs
1040 completeBind :: SimplEnv
1041 -> InBinder -> OutId -> OutExpr -- Id and RHS
1042 -> (SimplEnv, [(OutId, OutExpr)]) -- Final envt and binding(s)
1044 completeBind env binder@(_,occ_info) new_id new_rhs
1045 | idMustNotBeINLINEd new_id -- Occurrence analyser says "don't inline"
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
1052 env1 = notInScope env new_id
1053 env2 = bindIdToAtom env1 binder the_arg
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
1062 -- This case is an optional improvement; saves a simplifier iteration
1063 (env, [(new_id, eta'd_rhs)])
1065 | otherwise -- Non-atomic
1067 env1 = extendEnvGivenBinding env occ_info new_id new_rhs
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
1076 other -> etaCoreExpr new_rhs
1078 the_arg = case eta'd_rhs of
1083 ----------------------------------------------------------------------------
1084 A digression on constructor CSE
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:
1096 const.Int.max.wrk{-s2516-} =
1097 \ upk.s3297# upk.s3298# ->
1101 a.s3299 = I#! upk.s3297#
1103 case (const.Int._tagCmp.wrk{-s2513-} upk.s3297# upk.s3298#) of {
1104 _LT -> I#! upk.s3298#
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.)
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:
1118 ... (let y = C a1 .. an in ...) ...
1120 where it is always good to ditch the binding for y, and replace y by
1123 ----------------------------------------------------------------------------
1125 ----------------------------------------------------------------------------
1126 A digression on "optimising" coercions
1128 The trouble is that we kept transforming
1136 and counting a couple of ticks for this non-transformation
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 ->
1144 (inner_id, dangerousArgOcc) inner_id rhs `thenSmpl` \ (env1, binds1) ->
1145 -- Dangerous occ because, like constructor args,
1146 -- it can be duplicated easily
1148 atomic_rhs = case runEager $ lookupId env1 inner_id of
1152 completeNonRec env1 binder new_id
1153 (Coerce coercion ty atomic_rhs) `thenSmpl` \ (env2, binds2) ->
1155 returnSmpl (env2, binds1 ++ binds2)
1157 ----------------------------------------------------------------------------
1161 %************************************************************************
1163 \subsection[Simplify-letrec]{Letrec-expressions}
1165 %************************************************************************
1169 Here's the game plan
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.
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.
1184 simplRec env pairs body_c body_ty
1185 = -- Do floating, if necessary
1186 floatBind env False (Rec pairs) `thenSmpl` \ [Rec pairs'] ->
1188 binders = map fst pairs'
1190 simplBinders env binders `thenSmpl` \ (env_w_clones, ids') ->
1191 simplRecursiveGroup env_w_clones ids' pairs' `thenSmpl` \ (pairs', new_env) ->
1193 body_c new_env `thenSmpl` \ body' ->
1195 returnSmpl (Let (Rec pairs') body')
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)
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.
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
1215 new_env = bindIdToExpr env binder rhs
1217 simplRecursiveGroup new_env new_ids pairs
1220 = simplRhsExpr env binder rhs new_id `thenSmpl` \ (new_rhs, arity) ->
1222 new_id' = new_id `withArity` arity
1223 (new_env, new_binds') = completeBind env binder new_id' new_rhs
1225 simplRecursiveGroup new_env new_ids pairs `thenSmpl` \ (new_pairs, final_env) ->
1226 returnSmpl (new_binds' ++ new_pairs, final_env)
1228 ok_to_dup = switchIsSet env SimplOkToDupCode
1234 floatBind :: SimplEnv
1235 -> Bool -- True <=> Top level
1237 -> SmplM [InBinding]
1239 floatBind env top_level bind
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
1252 -- Now floating gives this:
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.
1263 binds' = fltBind bind
1264 n_extras = sum (map no_of_binds binds') - no_of_binds bind
1266 float_lets = switchIsSet env SimplFloatLetsExposingWHNF
1267 always_float_let_from_let = switchIsSet env SimplAlwaysFloatLetsFromLets
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']
1274 (binds, rhs') = fltRhs rhs
1279 pairs' = concat [ let
1280 (binds, rhs') = fltRhs rhs
1282 foldr get_pairs [(bndr, rhs')] binds
1283 | (bndr, rhs) <- pairs
1286 get_pairs (NonRec bndr rhs) rest = (bndr,rhs) : rest
1287 get_pairs (Rec pairs) rest = pairs ++ rest
1289 -- fltRhs has same invariant as fltBind
1291 | (always_float_let_from_let ||
1292 floatExposesHNF True False False rhs)
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')
1305 binds_wont_leak = all leakFreeBind binds'
1306 (body_binds, body') = fltExpr body
1307 binds' = fltBind (un_demandify_bind bind)
1309 fltExpr expr = ([], expr)
1311 -- Crude but effective
1312 no_of_binds (NonRec _ _) = 1
1313 no_of_binds (Rec pairs) = length pairs
1315 leakFreeBind (NonRec bndr rhs) = leakFree bndr rhs
1316 leakFreeBind (Rec pairs) = and [leakFree bndr rhs | (bndr, rhs) <- pairs]
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)
1325 %************************************************************************
1327 \subsection[Simplify-atoms]{Simplifying atoms}
1329 %************************************************************************
1332 simplArg :: SimplEnv -> InArg -> Eager ans OutArg
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
1347 %************************************************************************
1349 \subsection[Simplify-quickies]{Some local help functions}
1351 %************************************************************************
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]
1362 un_demandify_bndr (id, occ_info) = (id `addIdDemandInfo` noDemandInfo, occ_info)
1364 is_cheap_prim_app (Prim op _) = primOpOkForSpeculation op
1365 is_cheap_prim_app other = False
1367 computeResultType :: SimplEnv -> InType -> [OutArg] -> OutType
1368 computeResultType env expr_ty orig_args
1369 = simplTy env expr_ty `appEager` \ expr_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
1376 pprPanic "computeResultType" (vcat [
1382 go expr_ty' orig_args
1385 var `withArity` UnknownArity = var
1386 var `withArity` arity = var `addIdArity` arity
1388 is_atomic (Var v) = True
1389 is_atomic (Lit l) = not (isNoRepLit l)
1390 is_atomic other = False