2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
4 \section[SimplCore]{Driver for simplifying @Core@ programs}
7 module SimplCore ( core2core, simplifyExpr ) where
9 #include "HsVersions.h"
11 import DynFlags ( DynFlags, DynFlag(..), dopt )
15 import CSE ( cseProgram )
16 import Rules ( RuleBase, emptyRuleBase, mkRuleBase, unionRuleBase,
17 extendRuleBaseList, ruleCheckProgram, addSpecInfo, )
18 import PprCore ( pprCoreBindings, pprCoreExpr )
19 import OccurAnal ( occurAnalysePgm, occurAnalyseExpr )
21 import CoreUtils ( coreBindsSize )
22 import Simplify ( simplTopBinds, simplExpr )
23 import SimplUtils ( simplEnvForGHCi, activeRule )
27 import qualified ErrUtils as Err
28 import FloatIn ( floatInwards )
29 import FloatOut ( floatOutwards )
32 import BasicTypes ( CompilerPhase, isDefaultInlinePragma )
35 import LiberateCase ( liberateCase )
36 import SAT ( doStaticArgs )
37 import Specialise ( specProgram)
38 import SpecConstr ( specConstrProgram)
39 import DmdAnal ( dmdAnalPgm )
40 import WorkWrap ( wwTopBinds )
41 import Vectorise ( vectorise )
45 import UniqSupply ( UniqSupply, mkSplitUniqSupply, splitUniqSupply )
50 %************************************************************************
52 \subsection{The driver for the simplifier}
54 %************************************************************************
57 core2core :: HscEnv -> ModGuts -> IO ModGuts
58 core2core hsc_env guts
59 = do { us <- mkSplitUniqSupply 's'
60 ; (guts2, stats) <- runCoreM hsc_env hpt_rule_base us mod $
61 doCorePasses (getCoreToDo dflags) guts
63 ; Err.dumpIfSet_dyn dflags Opt_D_dump_simpl_stats
64 "Grand total simplifier statistics"
69 dflags = hsc_dflags hsc_env
70 home_pkg_rules = hptRules hsc_env (dep_mods (mg_deps guts))
71 hpt_rule_base = mkRuleBase home_pkg_rules
73 -- mod: get the module out of the current HscEnv so we can retrieve it from the monad.
74 -- This is very convienent for the users of the monad (e.g. plugins do not have to
75 -- consume the ModGuts to find the module) but somewhat ugly because mg_module may
76 -- _theoretically_ be changed during the Core pipeline (it's part of ModGuts), which
77 -- would mean our cached value would go out of date.
80 type CorePass = CoreToDo
82 doCorePasses :: [CorePass] -> ModGuts -> CoreM ModGuts
83 doCorePasses passes guts
84 = foldM do_pass guts passes
86 do_pass guts CoreDoNothing = return guts
87 do_pass guts (CoreDoPasses ps) = doCorePasses ps guts
89 = do { dflags <- getDynFlags
90 ; liftIO $ showPass dflags pass
91 ; guts' <- doCorePass pass guts
92 ; liftIO $ endPass dflags pass (mg_binds guts') (mg_rules guts')
95 doCorePass :: CorePass -> ModGuts -> CoreM ModGuts
96 doCorePass pass@(CoreDoSimplify {}) = {-# SCC "Simplify" #-}
99 doCorePass CoreCSE = {-# SCC "CommonSubExpr" #-}
102 doCorePass CoreLiberateCase = {-# SCC "LiberateCase" #-}
105 doCorePass CoreDoFloatInwards = {-# SCC "FloatInwards" #-}
108 doCorePass (CoreDoFloatOutwards f) = {-# SCC "FloatOutwards" #-}
109 doPassDUM (floatOutwards f)
111 doCorePass CoreDoStaticArgs = {-# SCC "StaticArgs" #-}
114 doCorePass CoreDoStrictness = {-# SCC "Stranal" #-}
117 doCorePass CoreDoWorkerWrapper = {-# SCC "WorkWrap" #-}
120 doCorePass CoreDoSpecialising = {-# SCC "Specialise" #-}
123 doCorePass CoreDoSpecConstr = {-# SCC "SpecConstr" #-}
126 doCorePass CoreDoVectorisation = {-# SCC "Vectorise" #-}
129 doCorePass CoreDoGlomBinds = doPassDM glomBinds
130 doCorePass CoreDoPrintCore = observe printCore
131 doCorePass (CoreDoRuleCheck phase pat) = ruleCheck phase pat
132 doCorePass CoreDoNothing = return
133 doCorePass (CoreDoPasses passes) = doCorePasses passes
134 doCorePass pass = pprPanic "doCorePass" (ppr pass)
137 %************************************************************************
139 \subsection{Core pass combinators}
141 %************************************************************************
144 printCore :: a -> [CoreBind] -> IO ()
145 printCore _ binds = Err.dumpIfSet True "Print Core" (pprCoreBindings binds)
147 ruleCheck :: CompilerPhase -> String -> ModGuts -> CoreM ModGuts
148 ruleCheck current_phase pat guts = do
150 dflags <- getDynFlags
151 liftIO $ Err.showPass dflags "RuleCheck"
152 liftIO $ printDump (ruleCheckProgram current_phase pat rb (mg_binds guts))
156 doPassDUM :: (DynFlags -> UniqSupply -> [CoreBind] -> IO [CoreBind]) -> ModGuts -> CoreM ModGuts
157 doPassDUM do_pass = doPassM $ \binds -> do
158 dflags <- getDynFlags
159 us <- getUniqueSupplyM
160 liftIO $ do_pass dflags us binds
162 doPassDM :: (DynFlags -> [CoreBind] -> IO [CoreBind]) -> ModGuts -> CoreM ModGuts
163 doPassDM do_pass = doPassDUM (\dflags -> const (do_pass dflags))
165 doPassD :: (DynFlags -> [CoreBind] -> [CoreBind]) -> ModGuts -> CoreM ModGuts
166 doPassD do_pass = doPassDM (\dflags -> return . do_pass dflags)
168 doPassDU :: (DynFlags -> UniqSupply -> [CoreBind] -> [CoreBind]) -> ModGuts -> CoreM ModGuts
169 doPassDU do_pass = doPassDUM (\dflags us -> return . do_pass dflags us)
171 doPassU :: (UniqSupply -> [CoreBind] -> [CoreBind]) -> ModGuts -> CoreM ModGuts
172 doPassU do_pass = doPassDU (const do_pass)
174 -- Most passes return no stats and don't change rules: these combinators
175 -- let us lift them to the full blown ModGuts+CoreM world
176 doPassM :: Monad m => ([CoreBind] -> m [CoreBind]) -> ModGuts -> m ModGuts
177 doPassM bind_f guts = do
178 binds' <- bind_f (mg_binds guts)
179 return (guts { mg_binds = binds' })
181 doPass :: ([CoreBind] -> [CoreBind]) -> ModGuts -> CoreM ModGuts
182 doPass bind_f guts = return $ guts { mg_binds = bind_f (mg_binds guts) }
184 -- Observer passes just peek; don't modify the bindings at all
185 observe :: (DynFlags -> [CoreBind] -> IO a) -> ModGuts -> CoreM ModGuts
186 observe do_pass = doPassM $ \binds -> do
187 dflags <- getDynFlags
188 _ <- liftIO $ do_pass dflags binds
193 %************************************************************************
195 Gentle simplification
197 %************************************************************************
200 simplifyExpr :: DynFlags -- includes spec of what core-to-core passes to do
203 -- simplifyExpr is called by the driver to simplify an
204 -- expression typed in at the interactive prompt
206 -- Also used by Template Haskell
207 simplifyExpr dflags expr
209 ; Err.showPass dflags "Simplify"
211 ; us <- mkSplitUniqSupply 's'
213 ; let (expr', _counts) = initSmpl dflags emptyRuleBase emptyFamInstEnvs us $
214 simplExprGently (simplEnvForGHCi dflags) expr
216 ; Err.dumpIfSet_dyn dflags Opt_D_dump_simpl "Simplified expression"
222 simplExprGently :: SimplEnv -> CoreExpr -> SimplM CoreExpr
223 -- Simplifies an expression
224 -- does occurrence analysis, then simplification
225 -- and repeats (twice currently) because one pass
226 -- alone leaves tons of crud.
227 -- Used (a) for user expressions typed in at the interactive prompt
228 -- (b) the LHS and RHS of a RULE
229 -- (c) Template Haskell splices
231 -- The name 'Gently' suggests that the SimplifierMode is SimplGently,
232 -- and in fact that is so.... but the 'Gently' in simplExprGently doesn't
233 -- enforce that; it just simplifies the expression twice
235 -- It's important that simplExprGently does eta reduction; see
236 -- Note [Simplifying the left-hand side of a RULE] above. The
237 -- simplifier does indeed do eta reduction (it's in Simplify.completeLam)
238 -- but only if -O is on.
240 simplExprGently env expr = do
241 expr1 <- simplExpr env (occurAnalyseExpr expr)
242 simplExpr env (occurAnalyseExpr expr1)
246 %************************************************************************
248 \subsection{Glomming}
250 %************************************************************************
253 glomBinds :: DynFlags -> [CoreBind] -> IO [CoreBind]
254 -- Glom all binds together in one Rec, in case any
255 -- transformations have introduced any new dependencies
257 -- NB: the global invariant is this:
258 -- *** the top level bindings are never cloned, and are always unique ***
260 -- We sort them into dependency order, but applying transformation rules may
261 -- make something at the top refer to something at the bottom:
265 -- RULE: p (q x) = h x
267 -- Applying this rule makes f refer to h,
268 -- although it doesn't appear to in the source program.
269 -- This pass lets us control where it happens.
271 -- NOTICE that this cannot happen for rules whose head is a locally-defined
272 -- function. It only happens for rules whose head is an imported function
273 -- (p in the example above). So, for example, the rule had been
274 -- RULE: f (p x) = h x
275 -- then the rule for f would be attached to f itself (in its IdInfo)
276 -- by prepareLocalRuleBase and h would be regarded by the occurrency
277 -- analyser as free in f.
279 glomBinds dflags binds
280 = do { Err.showPass dflags "GlomBinds" ;
281 let { recd_binds = [Rec (flattenBinds binds)] } ;
283 -- Not much point in printing the result...
284 -- just consumes output bandwidth
288 %************************************************************************
290 \subsection{The driver for the simplifier}
292 %************************************************************************
295 simplifyPgm :: CoreToDo -> ModGuts -> CoreM ModGuts
296 simplifyPgm pass guts
297 = do { hsc_env <- getHscEnv
298 ; us <- getUniqueSupplyM
301 simplifyPgmIO pass hsc_env us rb guts }
303 simplifyPgmIO :: CoreToDo
308 -> IO (SimplCount, ModGuts) -- New bindings
310 simplifyPgmIO pass@(CoreDoSimplify max_iterations mode)
311 hsc_env us hpt_rule_base
312 guts@(ModGuts { mg_binds = binds, mg_rules = rules
313 , mg_fam_inst_env = fam_inst_env })
314 = do { (termination_msg, it_count, counts_out, guts')
315 <- do_iteration us 1 [] binds rules
317 ; Err.dumpIfSet (dump_phase && dopt Opt_D_dump_simpl_stats dflags)
318 "Simplifier statistics for following pass"
319 (vcat [text termination_msg <+> text "after" <+> ppr it_count <+> text "iterations",
321 pprSimplCount counts_out])
323 ; return (counts_out, guts')
326 dflags = hsc_dflags hsc_env
327 dump_phase = dumpSimplPhase dflags mode
328 simpl_env = mkSimplEnv mode
329 active_rule = activeRule dflags simpl_env
331 do_iteration :: UniqSupply
332 -> Int -- Counts iterations
333 -> [SimplCount] -- Counts from earlier iterations, reversed
334 -> [CoreBind] -- Bindings in
335 -> [CoreRule] -- and orphan rules
336 -> IO (String, Int, SimplCount, ModGuts)
338 do_iteration us iteration_no counts_so_far binds rules
339 -- iteration_no is the number of the iteration we are
340 -- about to begin, with '1' for the first
341 | iteration_no > max_iterations -- Stop if we've run out of iterations
342 = WARN( debugIsOn && (max_iterations > 2)
343 , ptext (sLit "Simplifier baling out after") <+> int max_iterations
344 <+> ptext (sLit "iterations")
345 <+> (brackets $ hsep $ punctuate comma $
346 map (int . simplCountN) (reverse counts_so_far))
347 <+> ptext (sLit "Size =") <+> int (coreBindsSize binds) )
349 -- Subtract 1 from iteration_no to get the
350 -- number of iterations we actually completed
351 return ( "Simplifier baled out", iteration_no - 1
352 , totalise counts_so_far
353 , guts { mg_binds = binds, mg_rules = rules } )
355 -- Try and force thunks off the binds; significantly reduces
356 -- space usage, especially with -O. JRS, 000620.
357 | let sz = coreBindsSize binds in sz == sz
359 -- Occurrence analysis
360 let { tagged_binds = {-# SCC "OccAnal" #-}
361 occurAnalysePgm active_rule rules binds } ;
362 Err.dumpIfSet_dyn dflags Opt_D_dump_occur_anal "Occurrence analysis"
363 (pprCoreBindings tagged_binds);
365 -- Get any new rules, and extend the rule base
366 -- See Note [Overall plumbing for rules] in Rules.lhs
367 -- We need to do this regularly, because simplification can
368 -- poke on IdInfo thunks, which in turn brings in new rules
369 -- behind the scenes. Otherwise there's a danger we'll simply
370 -- miss the rules for Ids hidden inside imported inlinings
371 eps <- hscEPS hsc_env ;
372 let { rule_base1 = unionRuleBase hpt_rule_base (eps_rule_base eps)
373 ; rule_base2 = extendRuleBaseList rule_base1 rules
374 ; simpl_binds = {-# SCC "SimplTopBinds" #-}
375 simplTopBinds simpl_env tagged_binds
376 ; fam_envs = (eps_fam_inst_env eps, fam_inst_env) } ;
378 -- Simplify the program
379 -- We do this with a *case* not a *let* because lazy pattern
380 -- matching bit us with bad space leak!
381 -- With a let, we ended up with
386 -- case t of {(_,counts1) -> if counts1=0 then ... }
387 -- So the conditional didn't force counts1, because the
388 -- selection got duplicated. Sigh!
389 case initSmpl dflags rule_base2 fam_envs us1 simpl_binds of {
390 (env1, counts1) -> do {
392 let { binds1 = getFloats env1
393 ; rules1 = substRulesForImportedIds (mkCoreSubst (text "imp-rules") env1) rules
396 -- Stop if nothing happened; don't dump output
397 if isZeroSimplCount counts1 then
398 return ( "Simplifier reached fixed point", iteration_no
399 , totalise (counts1 : counts_so_far) -- Include "free" ticks
400 , guts { mg_binds = binds1, mg_rules = rules1 } )
402 -- Short out indirections
403 -- We do this *after* at least one run of the simplifier
404 -- because indirection-shorting uses the export flag on *occurrences*
405 -- and that isn't guaranteed to be ok until after the first run propagates
406 -- stuff from the binding site to its occurrences
408 -- ToDo: alas, this means that indirection-shorting does not happen at all
409 -- if the simplifier does nothing (not common, I know, but unsavoury)
410 let { binds2 = {-# SCC "ZapInd" #-} shortOutIndirections binds1 } ;
412 -- Dump the result of this iteration
413 end_iteration dflags pass iteration_no counts1 binds2 rules1 ;
416 do_iteration us2 (iteration_no + 1) (counts1:counts_so_far) binds2 rules1
418 | otherwise = panic "do_iteration"
420 (us1, us2) = splitUniqSupply us
422 -- Remember the counts_so_far are reversed
423 totalise :: [SimplCount] -> SimplCount
424 totalise = foldr (\c acc -> acc `plusSimplCount` c)
425 (zeroSimplCount dflags)
427 simplifyPgmIO _ _ _ _ _ = panic "simplifyPgmIO"
430 end_iteration :: DynFlags -> CoreToDo -> Int
431 -> SimplCount -> [CoreBind] -> [CoreRule] -> IO ()
432 -- Same as endIteration but with simplifier counts
433 end_iteration dflags pass iteration_no counts binds rules
434 = do { dumpIfSet (dopt Opt_D_dump_simpl_iterations dflags)
435 pass (ptext (sLit "Simplifier counts"))
436 (pprSimplCount counts)
438 ; endIteration dflags pass iteration_no binds rules }
442 %************************************************************************
444 Shorting out indirections
446 %************************************************************************
450 x_local = <expression>
454 where x_exported is exported, and x_local is not, then we replace it with this:
456 x_exported = <expression>
460 Without this we never get rid of the x_exported = x_local thing. This
461 save a gratuitous jump (from \tr{x_exported} to \tr{x_local}), and
462 makes strictness information propagate better. This used to happen in
463 the final phase, but it's tidier to do it here.
465 Note [Transferring IdInfo]
466 ~~~~~~~~~~~~~~~~~~~~~~~~~~
467 We want to propagage any useful IdInfo on x_local to x_exported.
469 STRICTNESS: if we have done strictness analysis, we want the strictness info on
470 x_local to transfer to x_exported. Hence the copyIdInfo call.
472 RULES: we want to *add* any RULES for x_local to x_exported.
475 Note [Messing up the exported Id's RULES]
476 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
477 We must be careful about discarding (obviously) or even merging the
478 RULES on the exported Id. The example that went bad on me at one stage
481 iterate :: (a -> a) -> a -> [a]
483 iterate = iterateList
485 iterateFB c f x = x `c` iterateFB c f (f x)
486 iterateList f x = x : iterateList f (f x)
490 "iterate" forall f x. iterate f x = build (\c _n -> iterateFB c f x)
491 "iterateFB" iterateFB (:) = iterateList
494 This got shorted out to:
496 iterateList :: (a -> a) -> a -> [a]
497 iterateList = iterate
499 iterateFB c f x = x `c` iterateFB c f (f x)
500 iterate f x = x : iterate f (f x)
503 "iterate" forall f x. iterate f x = build (\c _n -> iterateFB c f x)
504 "iterateFB" iterateFB (:) = iterate
507 And now we get an infinite loop in the rule system
508 iterate f x -> build (\cn -> iterateFB c f x)
513 use rule switching-off pragmas to get rid
514 of iterateList in the first place
516 But in principle the user *might* want rules that only apply to the Id
517 he says. And inline pragmas are similar
521 Then we do not want to get rid of the NOINLINE.
523 Hence hasShortableIdinfo.
526 Note [Rules and indirection-zapping]
527 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
528 Problem: what if x_exported has a RULE that mentions something in ...bindings...?
529 Then the things mentioned can be out of scope! Solution
530 a) Make sure that in this pass the usage-info from x_exported is
531 available for ...bindings...
532 b) If there are any such RULES, rec-ify the entire top-level.
533 It'll get sorted out next time round
537 If more than one exported thing is equal to a local thing (i.e., the
538 local thing really is shared), then we do one only:
541 x_exported1 = x_local
542 x_exported2 = x_local
546 x_exported2 = x_exported1
549 We rely on prior eta reduction to simplify things like
551 x_exported = /\ tyvars -> x_local tyvars
555 Hence,there's a possibility of leaving unchanged something like this:
558 x_exported1 = x_local Int
560 By the time we've thrown away the types in STG land this
561 could be eliminated. But I don't think it's very common
562 and it's dangerous to do this fiddling in STG land
563 because we might elminate a binding that's mentioned in the
564 unfolding for something.
567 type IndEnv = IdEnv Id -- Maps local_id -> exported_id
569 shortOutIndirections :: [CoreBind] -> [CoreBind]
570 shortOutIndirections binds
571 | isEmptyVarEnv ind_env = binds
572 | no_need_to_flatten = binds' -- See Note [Rules and indirect-zapping]
573 | otherwise = [Rec (flattenBinds binds')] -- for this no_need_to_flatten stuff
575 ind_env = makeIndEnv binds
576 exp_ids = varSetElems ind_env -- These exported Ids are the subjects
577 exp_id_set = mkVarSet exp_ids -- of the indirection-elimination
578 no_need_to_flatten = all (null . specInfoRules . idSpecialisation) exp_ids
579 binds' = concatMap zap binds
581 zap (NonRec bndr rhs) = [NonRec b r | (b,r) <- zapPair (bndr,rhs)]
582 zap (Rec pairs) = [Rec (concatMap zapPair pairs)]
585 | bndr `elemVarSet` exp_id_set = []
586 | Just exp_id <- lookupVarEnv ind_env bndr = [(transferIdInfo exp_id bndr, rhs),
588 | otherwise = [(bndr,rhs)]
590 makeIndEnv :: [CoreBind] -> IndEnv
592 = foldr add_bind emptyVarEnv binds
594 add_bind :: CoreBind -> IndEnv -> IndEnv
595 add_bind (NonRec exported_id rhs) env = add_pair (exported_id, rhs) env
596 add_bind (Rec pairs) env = foldr add_pair env pairs
598 add_pair :: (Id,CoreExpr) -> IndEnv -> IndEnv
599 add_pair (exported_id, Var local_id) env
600 | shortMeOut env exported_id local_id = extendVarEnv env local_id exported_id
604 shortMeOut :: IndEnv -> Id -> Id -> Bool
605 shortMeOut ind_env exported_id local_id
606 -- The if-then-else stuff is just so I can get a pprTrace to see
607 -- how often I don't get shorting out becuase of IdInfo stuff
608 = if isExportedId exported_id && -- Only if this is exported
610 isLocalId local_id && -- Only if this one is defined in this
611 -- module, so that we *can* change its
612 -- binding to be the exported thing!
614 not (isExportedId local_id) && -- Only if this one is not itself exported,
615 -- since the transformation will nuke it
617 not (local_id `elemVarEnv` ind_env) -- Only if not already substituted for
619 if hasShortableIdInfo exported_id
620 then True -- See Note [Messing up the exported Id's IdInfo]
621 else WARN( True, ptext (sLit "Not shorting out:") <+> ppr exported_id )
627 hasShortableIdInfo :: Id -> Bool
628 -- True if there is no user-attached IdInfo on exported_id,
629 -- so we can safely discard it
630 -- See Note [Messing up the exported Id's IdInfo]
631 hasShortableIdInfo id
632 = isEmptySpecInfo (specInfo info)
633 && isDefaultInlinePragma (inlinePragInfo info)
638 transferIdInfo :: Id -> Id -> Id
639 -- See Note [Transferring IdInfo]
641 -- lcl_id = e; exp_id = lcl_id
642 -- and lcl_id has useful IdInfo, we don't want to discard it by going
643 -- gbl_id = e; lcl_id = gbl_id
644 -- Instead, transfer IdInfo from lcl_id to exp_id
645 -- Overwriting, rather than merging, seems to work ok.
646 transferIdInfo exported_id local_id
647 = modifyIdInfo transfer exported_id
649 local_info = idInfo local_id
650 transfer exp_info = exp_info `setStrictnessInfo` strictnessInfo local_info
651 `setUnfoldingInfo` unfoldingInfo local_info
652 `setInlinePragInfo` inlinePragInfo local_info
653 `setSpecInfo` addSpecInfo (specInfo exp_info) new_info
654 new_info = setSpecInfoHead (idName exported_id)
655 (specInfo local_info)
656 -- Remember to set the function-name field of the
657 -- rules as we transfer them from one function to another