2 % (c) The AQUA Project, Glasgow University, 1993-1998
4 \section[SimplUtils]{The simplifier utilities}
8 simplBinder, simplBinders, simplIds,
11 mkCase, findAlt, findDefault,
15 #include "HsVersions.h"
18 import CmdLineOpts ( opt_SimplDoLambdaEtaExpansion, opt_SimplCaseMerge )
20 import CoreFVs ( exprFreeVars )
21 import CoreUtils ( exprIsTrivial, cheapEqExpr, coreExprType,
22 exprIsWHNF, FormSummary(..)
24 import Subst ( substBndrs, substBndr, substIds )
25 import Id ( Id, idType, getIdArity, isId, idName,
26 getInlinePragma, setInlinePragma,
29 import IdInfo ( arityLowerBound, InlinePragInfo(..), setInlinePragInfo, vanillaIdInfo )
30 import Maybes ( maybeToBool, catMaybes )
31 import Const ( Con(..) )
32 import Name ( isLocalName, setNameUnique )
34 import Type ( Type, tyVarsOfType, tyVarsOfTypes, mkForAllTys,
35 splitTyConApp_maybe, mkTyVarTys, applyTys, splitFunTys, mkFunTys
37 import TysPrim ( statePrimTyCon )
38 import Var ( setVarUnique )
40 import UniqSupply ( splitUniqSupply, uniqFromSupply )
41 import Util ( zipWithEqual, mapAccumL )
46 %************************************************************************
48 \section{Dealing with a single binder}
50 %************************************************************************
53 simplBinders :: [InBinder] -> ([OutBinder] -> SimplM a) -> SimplM a
54 simplBinders bndrs thing_inside
55 = getSubst `thenSmpl` \ subst ->
57 (subst', bndrs') = substBndrs subst bndrs
62 simplBinder :: InBinder -> (OutBinder -> SimplM a) -> SimplM a
63 simplBinder bndr thing_inside
64 = getSubst `thenSmpl` \ subst ->
66 (subst', bndr') = substBndr subst bndr
72 -- Same semantics as simplBinders, but a little less
73 -- plumbing and hence a little more efficient.
74 -- Maybe not worth the candle?
75 simplIds :: [InBinder] -> ([OutBinder] -> SimplM a) -> SimplM a
76 simplIds ids thing_inside
77 = getSubst `thenSmpl` \ subst ->
79 (subst', bndrs') = substIds subst ids
86 %************************************************************************
88 \subsection{Transform a RHS}
90 %************************************************************************
93 (b) type-lambda swizzling
96 transformRhs :: InExpr -> SimplM InExpr
98 = tryEtaExpansion body `thenSmpl` \ body' ->
99 mkRhsTyLam tyvars body'
101 (tyvars, body) = collectTyBinders rhs
105 %************************************************************************
107 \subsection{Local tyvar-lifting}
109 %************************************************************************
111 mkRhsTyLam tries this transformation, when the big lambda appears as
112 the RHS of a let(rec) binding:
114 /\abc -> let(rec) x = e in b
116 let(rec) x' = /\abc -> let x = x' a b c in e
118 /\abc -> let x = x' a b c in b
120 This is good because it can turn things like:
122 let f = /\a -> letrec g = ... g ... in g
124 letrec g' = /\a -> ... g' a ...
128 which is better. In effect, it means that big lambdas don't impede
131 This optimisation is CRUCIAL in eliminating the junk introduced by
132 desugaring mutually recursive definitions. Don't eliminate it lightly!
134 So far as the implemtation is concerned:
136 Invariant: go F e = /\tvs -> F e
140 = Let x' = /\tvs -> F e
144 G = F . Let x = x' tvs
146 go F (Letrec xi=ei in b)
147 = Letrec {xi' = /\tvs -> G ei}
151 G = F . Let {xi = xi' tvs}
153 [May 1999] If we do this transformation *regardless* then we can
154 end up with some pretty silly stuff. For example,
157 st = /\ s -> let { x1=r1 ; x2=r2 } in ...
162 st = /\s -> ...[y1 s/x1, y2 s/x2]
165 Unless the "..." is a WHNF there is really no point in doing this.
166 Indeed it can make things worse. Suppose x1 is used strictly,
169 x1* = case f y of { (a,b) -> e }
171 If we abstract this wrt the tyvar we then can't do the case inline
172 as we would normally do.
176 mkRhsTyLam tyvars body -- Only does something if there's a let
177 | null tyvars || not (worth_it body) -- inside a type lambda, and a WHNF inside that
178 = returnSmpl (mkLams tyvars body)
182 worth_it (Let _ e) = whnf_in_middle e
183 worth_it other = False
184 whnf_in_middle (Let _ e) = whnf_in_middle e
185 whnf_in_middle e = exprIsWHNF e
187 main_tyvar_set = mkVarSet tyvars
189 go fn (Let bind@(NonRec var rhs) body) | exprIsTrivial rhs
190 = go (fn . Let bind) body
192 go fn (Let bind@(NonRec var rhs) body)
193 = mk_poly tyvars_here var `thenSmpl` \ (var', rhs') ->
194 go (fn . Let (mk_silly_bind var rhs')) body `thenSmpl` \ body' ->
195 returnSmpl (Let (NonRec var' (mkLams tyvars_here (fn rhs))) body')
198 -- varSetElems (main_tyvar_set `intersectVarSet` tyVarsOfType var_ty)
199 -- tyvars_here was an attempt to reduce the number of tyvars
200 -- wrt which the new binding is abstracted. But the naive
201 -- approach of abstract wrt the tyvars free in the Id's type
203 -- /\ a b -> let t :: (a,b) = (e1, e2)
206 -- Here, b isn't free in x's type, but we must nevertheless
207 -- abstract wrt b as well, because t's type mentions b.
208 -- Since t is floated too, we'd end up with the bogus:
209 -- poly_t = /\ a b -> (e1, e2)
210 -- poly_x = /\ a -> fst (poly_t a *b*)
211 -- So for now we adopt the even more naive approach of
212 -- abstracting wrt *all* the tyvars. We'll see if that
213 -- gives rise to problems. SLPJ June 98
217 go fn (Let (Rec prs) body)
218 = mapAndUnzipSmpl (mk_poly tyvars_here) vars `thenSmpl` \ (vars', rhss') ->
220 gn body = fn $ foldr Let body (zipWith mk_silly_bind vars rhss')
222 go gn body `thenSmpl` \ body' ->
223 returnSmpl (Let (Rec (vars' `zip` [mkLams tyvars_here (gn rhs) | rhs <- rhss])) body')
225 (vars,rhss) = unzip prs
227 -- varSetElems (main_tyvar_set `intersectVarSet` tyVarsOfTypes var_tys)
228 -- See notes with tyvars_here above
230 var_tys = map idType vars
232 go fn body = returnSmpl (mkLams tyvars (fn body))
234 mk_poly tyvars_here var
235 = getUniqueSmpl `thenSmpl` \ uniq ->
237 poly_name = setNameUnique (idName var) uniq -- Keep same name
238 poly_ty = mkForAllTys tyvars_here (idType var) -- But new type of course
240 -- It's crucial to copy the inline-prag of the original var, because
241 -- we're looking at occurrence-analysed but as yet unsimplified code!
242 -- In particular, we mustn't lose the loop breakers.
244 -- It's even right to retain single-occurrence or dead-var info:
245 -- Suppose we started with /\a -> let x = E in B
246 -- where x occurs once in E. Then we transform to:
247 -- let x' = /\a -> E in /\a -> let x* = x' a in B
248 -- where x* has an INLINE prag on it. Now, once x* is inlined,
249 -- the occurrences of x' will be just the occurrences originaly
251 poly_info = vanillaIdInfo `setInlinePragInfo` getInlinePragma var
253 poly_id = mkId poly_name poly_ty poly_info
255 returnSmpl (poly_id, mkTyApps (Var poly_id) (mkTyVarTys tyvars_here))
257 mk_silly_bind var rhs = NonRec (setInlinePragma var IMustBeINLINEd) rhs
258 -- The addInlinePragma is really important! If we don't say
259 -- INLINE on these silly little bindings then look what happens!
260 -- Suppose we start with:
262 -- x = let g = /\a -> \x -> f x x
264 -- /\ b -> let g* = g b in E
266 -- Then: * the binding for g gets floated out
267 -- * but then it gets inlined into the rhs of g*
268 -- * then the binding for g* is floated out of the /\b
269 -- * so we're back to square one
270 -- The silly binding for g* must be IMustBeINLINEs, so that
271 -- we simply substitute for g* throughout.
275 %************************************************************************
277 \subsection{Eta expansion}
279 %************************************************************************
281 Try eta expansion for RHSs
284 \x1..xn -> N ==> \x1..xn y1..ym -> N y1..ym
286 N E1..En ==> let z1=E1 .. zn=En in \y1..ym -> N z1..zn y1..ym
288 where (in both cases) N is a NORMAL FORM (i.e. no redexes anywhere)
289 wanting a suitable number of extra args.
291 NB: the Ei may have unlifted type, but the simplifier (which is applied
292 to the result) deals OK with this).
294 There is no point in looking for a combination of the two,
295 because that would leave use with some lets sandwiched between lambdas;
296 that's what the final test in the first equation is for.
299 tryEtaExpansion :: InExpr -> SimplM InExpr
301 | not opt_SimplDoLambdaEtaExpansion
302 || exprIsTrivial rhs -- Don't eta-expand a trival RHS
303 || null y_tys -- No useful expansion
304 || not (null x_bndrs || and trivial_args) -- Not (no x-binders or no z-binds)
307 | otherwise -- Consider eta expansion
308 = newIds y_tys $ ( \ y_bndrs ->
309 tick (EtaExpansion (head y_bndrs)) `thenSmpl_`
310 mapAndUnzipSmpl bind_z_arg (args `zip` trivial_args) `thenSmpl` (\ (maybe_z_binds, z_args) ->
311 returnSmpl (mkLams x_bndrs $
312 mkLets (catMaybes maybe_z_binds) $
314 mkApps (mkApps fun z_args) (map Var y_bndrs))))
316 (x_bndrs, body) = collectValBinders rhs
317 (fun, args) = collectArgs body
318 trivial_args = map exprIsTrivial args
319 fun_arity = case fun of
320 Var v -> arityLowerBound (getIdArity v)
323 bind_z_arg (arg, trivial_arg)
324 | trivial_arg = returnSmpl (Nothing, arg)
325 | otherwise = newId (coreExprType arg) $ \ z ->
326 returnSmpl (Just (NonRec z arg), Var z)
328 -- Note: I used to try to avoid the coreExprType call by using
329 -- the type of the binder. But this type doesn't necessarily
330 -- belong to the same substitution environment as this rhs;
331 -- and we are going to make extra term binders (y_bndrs) from the type
332 -- which will be processed with the rhs substitution environment.
333 -- This only went wrong in a mind bendingly complicated case.
334 (potential_extra_arg_tys, inner_ty) = splitFunTys (coreExprType body)
337 y_tys = take no_extras_wanted potential_extra_arg_tys
339 no_extras_wanted :: Int
342 -- We used to expand the arity to the previous arity fo the
343 -- function; but this is pretty dangerous. Consdier
345 -- so that f has arity 2. Now float something into f's RHS:
346 -- f = let z = BIG in \xy -> e
347 -- The last thing we want to do now is to put some lambdas
349 -- f = \xy -> let z = BIG in e
351 -- (bndr_arity - no_of_xs) `max`
353 -- See if the body could obviously do with more args
354 (fun_arity - valArgCount args) `max`
356 -- Finally, see if it's a state transformer, and xs is non-null
357 -- (so it's also a function not a thunk) in which
358 -- case we eta-expand on principle! This can waste work,
359 -- but usually doesn't.
360 -- I originally checked for a singleton type [ty] in this case
361 -- but then I found a situation in which I had
362 -- \ x -> let {..} in \ s -> f (...) s
363 -- AND f RETURNED A FUNCTION. That is, 's' wasn't the only
364 -- potential extra arg.
365 case (x_bndrs, potential_extra_arg_tys) of
366 (_:_, ty:_) -> case splitTyConApp_maybe ty of
367 Just (tycon,_) | tycon == statePrimTyCon -> 1
373 %************************************************************************
375 \subsection{Eta reduction}
377 %************************************************************************
379 @etaCoreExpr@ trys an eta reduction at the top level of a Core Expr.
381 e.g. \ x y -> f x y ===> f
385 -- a) Before constructing an Unfolding, to
386 -- try to make the unfolding smaller;
387 b) In tidyCoreExpr, which is done just before converting to STG.
389 But we only do this if
390 i) It gets rid of a whole lambda, not part.
391 The idea is that lambdas are often quite helpful: they indicate
392 head normal forms, so we don't want to chuck them away lightly.
394 -- OLD: in core2stg we want to do this even if the result isn't trivial
395 -- ii) It exposes a simple variable or a type application; in short
396 -- it exposes a "trivial" expression. (exprIsTrivial)
399 etaCoreExpr :: CoreExpr -> CoreExpr
400 -- ToDo: we should really check that we don't turn a non-bottom
401 -- lambda into a bottom variable. Sigh
403 etaCoreExpr expr@(Lam bndr body)
404 = check (reverse binders) body
406 (binders, body) = collectBinders expr
409 | not (any (`elemVarSet` body_fvs) binders)
412 body_fvs = exprFreeVars body
414 check (b : bs) (App fun arg)
415 | (varToCoreExpr b `cheapEqExpr` arg)
418 check _ _ = expr -- Bale out
420 etaCoreExpr expr = expr -- The common case
424 %************************************************************************
426 \subsection{Case absorption and identity-case elimination}
428 %************************************************************************
431 mkCase :: OutExpr -> OutId -> [OutAlt] -> SimplM OutExpr
434 @mkCase@ tries the following transformation (if possible):
436 case e of b { ==> case e of b {
437 p1 -> rhs1 p1 -> rhs1
439 pm -> rhsm pm -> rhsm
440 _ -> case b of b' { pn -> rhsn[b/b'] {or (alg) let b=b' in rhsn}
441 {or (prim) case b of b' { _ -> rhsn}}
444 po -> rhso _ -> rhsd[b/b'] {or let b'=b in rhsd}
448 which merges two cases in one case when -- the default alternative of
449 the outer case scrutises the same variable as the outer case This
450 transformation is called Case Merging. It avoids that the same
451 variable is scrutinised multiple times.
454 mkCase scrut outer_bndr outer_alts
456 && maybeToBool maybe_case_in_default
458 = tick (CaseMerge outer_bndr) `thenSmpl_`
459 returnSmpl (Case scrut outer_bndr new_alts)
460 -- Warning: don't call mkCase recursively!
461 -- Firstly, there's no point, because inner alts have already had
462 -- mkCase applied to them, so they won't have a case in their default
463 -- Secondly, if you do, you get an infinite loop, because the bindNonRec
464 -- in munge_rhs puts a case into the DEFAULT branch!
466 new_alts = outer_alts_without_deflt ++ munged_inner_alts
467 maybe_case_in_default = case findDefault outer_alts of
468 (outer_alts_without_default,
469 Just (Case (Var scrut_var) inner_bndr inner_alts))
471 | outer_bndr == scrut_var
472 -> Just (outer_alts_without_default, inner_bndr, inner_alts)
475 Just (outer_alts_without_deflt, inner_bndr, inner_alts) = maybe_case_in_default
477 -- Eliminate any inner alts which are shadowed by the outer ones
478 outer_cons = [con | (con,_,_) <- outer_alts_without_deflt]
480 munged_inner_alts = [ (con, args, munge_rhs rhs)
481 | (con, args, rhs) <- inner_alts,
482 not (con `elem` outer_cons) -- Eliminate shadowed inner alts
484 munge_rhs rhs = bindNonRec inner_bndr (Var outer_bndr) rhs
487 Now the identity-case transformation:
496 mkCase scrut case_bndr alts
497 | all identity_alt alts
498 = tick (CaseIdentity case_bndr) `thenSmpl_`
501 identity_alt (DEFAULT, [], Var v) = v == case_bndr
502 identity_alt (con, args, Con con' args') = con == con' &&
503 and (zipWithEqual "mkCase"
505 (map Type arg_tys ++ map varToCoreExpr args)
507 identity_alt other = False
509 arg_tys = case splitTyConApp_maybe (idType case_bndr) of
510 Just (tycon, arg_tys) -> arg_tys
516 mkCase other_scrut case_bndr other_alts
517 = returnSmpl (Case other_scrut case_bndr other_alts)
522 findDefault :: [CoreAlt] -> ([CoreAlt], Maybe CoreExpr)
523 findDefault [] = ([], Nothing)
524 findDefault ((DEFAULT,args,rhs) : alts) = ASSERT( null alts && null args )
526 findDefault (alt : alts) = case findDefault alts of
527 (alts', deflt) -> (alt : alts', deflt)
529 findAlt :: Con -> [CoreAlt] -> CoreAlt
533 go [] = pprPanic "Missing alternative" (ppr con $$ vcat (map ppr alts))
534 go (alt : alts) | matches alt = alt
535 | otherwise = go alts
537 matches (DEFAULT, _, _) = True
538 matches (con1, _, _) = con == con1
541 mkCoerce to_ty (Note (Coerce _ from_ty) expr)
542 | to_ty == from_ty = expr
543 | otherwise = Note (Coerce to_ty from_ty) expr
545 = Note (Coerce to_ty (coreExprType expr)) expr