2 % (c) The University of Glasgow 2006
3 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
6 CoreSyn: A data type for the Haskell compiler midsection
10 Expr(..), Alt, Bind(..), AltCon(..), Arg, Note(..),
11 CoreExpr, CoreAlt, CoreBind, CoreArg, CoreBndr,
12 TaggedExpr, TaggedAlt, TaggedBind, TaggedArg, TaggedBndr(..),
15 mkApps, mkTyApps, mkValApps, mkVarApps,
16 mkLit, mkIntLitInt, mkIntLit,
18 varToCoreExpr, varsToCoreExprs,
20 isTyVar, isId, cmpAltCon, cmpAlt, ltAlt,
21 bindersOf, bindersOfBinds, rhssOfBind, rhssOfAlts,
22 collectBinders, collectTyBinders, collectValBinders, collectTyAndValBinders,
27 isValArg, isTypeArg, valArgCount, valBndrCount, isRuntimeArg, isRuntimeVar,
30 Unfolding(..), UnfoldingGuidance(..), -- Both abstract everywhere but in CoreUnfold.lhs
31 noUnfolding, evaldUnfolding, mkOtherCon,
32 unfoldingTemplate, maybeUnfoldingTemplate, otherCons,
33 isValueUnfolding, isEvaldUnfolding, isCheapUnfolding, isCompulsoryUnfolding,
34 hasUnfolding, hasSomeUnfolding, neverUnfold,
37 seqExpr, seqExprs, seqUnfolding,
39 -- Annotated expressions
40 AnnExpr, AnnExpr'(..), AnnBind(..), AnnAlt,
41 deAnnotate, deAnnotate', deAnnAlt, collectAnnBndrs,
44 CoreRule(..), -- CoreSubst, CoreTidy, CoreFVs, PprCore only
45 RuleName, seqRules, ruleArity,
46 isBuiltinRule, ruleName, isLocalRule, ruleIdName
49 #include "HsVersions.h"
63 infixl 4 `mkApps`, `mkValApps`, `mkTyApps`, `mkVarApps`
64 -- Left associative, so that we can say (f `mkTyApps` xs `mkVarApps` ys)
67 %************************************************************************
69 \subsection{The main data types}
71 %************************************************************************
73 These data types are the heart of the compiler
76 infixl 8 `App` -- App brackets to the left
78 data Expr b -- "b" for the type of binders,
81 | App (Expr b) (Arg b) -- See Note [CoreSyn let/app invariant]
83 | Let (Bind b) (Expr b) -- See [CoreSyn let/app invariant],
84 -- and [CoreSyn letrec invariant]
85 | Case (Expr b) b Type [Alt b] -- Binder gets bound to value of scrutinee
86 -- See Note [CoreSyn case invariants]
87 | Cast (Expr b) Coercion
89 | Type Type -- This should only show up at the top
92 type Arg b = Expr b -- Can be a Type
94 type Alt b = (AltCon, [b], Expr b) -- (DEFAULT, [], rhs) is the default alternative
96 data AltCon = DataAlt DataCon -- Invariant: the DataCon is always from
97 -- a *data* type, and never from a *newtype*
103 data Bind b = NonRec b (Expr b)
104 | Rec [(b, (Expr b))]
107 -------------------------- CoreSyn INVARIANTS ---------------------------
109 Note [CoreSyn top-level invariant]
110 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
111 * The RHSs of all top-level lets must be of LIFTED type.
113 Note [CoreSyn letrec invariant]
114 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
115 * The RHS of a letrec must be of LIFTED type.
117 Note [CoreSyn let/app invariant]
118 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
119 * The RHS of a non-recursive let, *and* the argument of an App,
120 may be of UNLIFTED type, but only if the expression
121 is ok-for-speculation. This means that the let can be floated around
122 without difficulty. e.g.
124 y::Int# = fac 4# not ok [use case instead]
125 This is intially enforced by DsUtils.mkDsLet and mkDsApp
127 Note [CoreSyn case invariants]
128 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
129 Invariant: The DEFAULT case must be *first*, if it occurs at all
131 Invariant: The remaining cases are in order of increasing
134 This makes finding the relevant constructor easy,
135 and makes comparison easier too
137 Invariant: The list of alternatives is ALWAYS EXHAUSTIVE,
138 meaning that it covers all cases that can occur
140 An "exhausive" case does not necessarily mention all constructors:
141 data Foo = Red | Green | Blue
145 other -> f (case x of
148 The inner case does not need a Red alternative, because x can't be Red at
152 Note [CoreSyn let goal]
153 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
154 * The simplifier tries to ensure that if the RHS of a let is a constructor
155 application, its arguments are trivial, so that the constructor can be
163 | InlineMe -- Instructs simplifer to treat the enclosed expression
164 -- as very small, and inline it at its call sites
166 | CoreNote String -- A generic core annotation, propagated but not used by GHC
168 -- NOTE: we also treat expressions wrapped in InlineMe as
169 -- 'cheap' and 'dupable' (in the sense of exprIsCheap, exprIsDupable)
170 -- What this means is that we obediently inline even things that don't
171 -- look like valuse. This is sometimes important:
174 -- Here, f looks like a redex, and we aren't going to inline (.) because it's
175 -- inside an INLINE, so it'll stay looking like a redex. Nevertheless, we
176 -- should inline f even inside lambdas. In effect, we should trust the programmer.
180 %************************************************************************
182 \subsection{Transformation rules}
184 %************************************************************************
186 The CoreRule type and its friends are dealt with mainly in CoreRules,
187 but CoreFVs, Subst, PprCore, CoreTidy also inspect the representation.
191 "local" if the function it is a rule for is defined in the
192 same module as the rule itself.
194 "orphan" if nothing on the LHS is defined in the same module
198 type RuleName = FastString
203 ru_act :: Activation, -- When the rule is active
205 -- Rough-matching stuff
206 -- see comments with InstEnv.Instance( is_cls, is_rough )
207 ru_fn :: Name, -- Name of the Id at the head of this rule
208 ru_rough :: [Maybe Name], -- Name at the head of each argument
210 -- Proper-matching stuff
211 -- see comments with InstEnv.Instance( is_tvs, is_tys )
212 ru_bndrs :: [CoreBndr], -- Forall'd variables
213 ru_args :: [CoreExpr], -- LHS args
215 -- And the right-hand side
219 ru_local :: Bool -- The fn at the head of the rule is
220 -- defined in the same module as the rule
223 | BuiltinRule { -- Built-in rules are used for constant folding
224 ru_name :: RuleName, -- and suchlike. It has no free variables.
225 ru_fn :: Name, -- Name of the Id at
226 -- the head of this rule
227 ru_nargs :: Int, -- Number of args that ru_try expects
228 ru_try :: [CoreExpr] -> Maybe CoreExpr }
230 isBuiltinRule (BuiltinRule {}) = True
231 isBuiltinRule _ = False
233 ruleArity :: CoreRule -> Int
234 ruleArity (BuiltinRule {ru_nargs = n}) = n
235 ruleArity (Rule {ru_args = args}) = length args
237 ruleName :: CoreRule -> RuleName
240 ruleIdName :: CoreRule -> Name
243 isLocalRule :: CoreRule -> Bool
244 isLocalRule = ru_local
248 %************************************************************************
252 %************************************************************************
254 The @Unfolding@ type is declared here to avoid numerous loops, but it
255 should be abstract everywhere except in CoreUnfold.lhs
261 | OtherCon [AltCon] -- It ain't one of these
262 -- (OtherCon xs) also indicates that something has been evaluated
263 -- and hence there's no point in re-evaluating it.
264 -- OtherCon [] is used even for non-data-type values
265 -- to indicated evaluated-ness. Notably:
266 -- data C = C !(Int -> Int)
267 -- case x of { C f -> ... }
268 -- Here, f gets an OtherCon [] unfolding.
270 | CompulsoryUnfolding CoreExpr -- There is no "original" definition,
271 -- so you'd better unfold.
273 | CoreUnfolding -- An unfolding with redundant cached information
274 CoreExpr -- Template; binder-info is correct
275 Bool -- True <=> top level binding
276 Bool -- exprIsHNF template (cached); it is ok to discard a `seq` on
278 Bool -- True <=> doesn't waste (much) work to expand inside an inlining
279 -- Basically it's exprIsCheap
280 UnfoldingGuidance -- Tells about the *size* of the template.
283 data UnfoldingGuidance
285 | UnfoldIfGoodArgs Int -- and "n" value args
287 [Int] -- Discount if the argument is evaluated.
288 -- (i.e., a simplification will definitely
289 -- be possible). One elt of the list per *value* arg.
291 Int -- The "size" of the unfolding; to be elaborated
294 Int -- Scrutinee discount: the discount to substract if the thing is in
295 -- a context (case (thing args) of ...),
296 -- (where there are the right number of arguments.)
298 noUnfolding = NoUnfolding
299 evaldUnfolding = OtherCon []
301 mkOtherCon = OtherCon
303 seqUnfolding :: Unfolding -> ()
304 seqUnfolding (CoreUnfolding e top b1 b2 g)
305 = seqExpr e `seq` top `seq` b1 `seq` b2 `seq` seqGuidance g
306 seqUnfolding other = ()
308 seqGuidance (UnfoldIfGoodArgs n ns a b) = n `seq` sum ns `seq` a `seq` b `seq` ()
309 seqGuidance other = ()
313 unfoldingTemplate :: Unfolding -> CoreExpr
314 unfoldingTemplate (CoreUnfolding expr _ _ _ _) = expr
315 unfoldingTemplate (CompulsoryUnfolding expr) = expr
316 unfoldingTemplate other = panic "getUnfoldingTemplate"
318 maybeUnfoldingTemplate :: Unfolding -> Maybe CoreExpr
319 maybeUnfoldingTemplate (CoreUnfolding expr _ _ _ _) = Just expr
320 maybeUnfoldingTemplate (CompulsoryUnfolding expr) = Just expr
321 maybeUnfoldingTemplate other = Nothing
323 otherCons :: Unfolding -> [AltCon]
324 otherCons (OtherCon cons) = cons
327 isValueUnfolding :: Unfolding -> Bool
328 -- Returns False for OtherCon
329 isValueUnfolding (CoreUnfolding _ _ is_evald _ _) = is_evald
330 isValueUnfolding other = False
332 isEvaldUnfolding :: Unfolding -> Bool
333 -- Returns True for OtherCon
334 isEvaldUnfolding (OtherCon _) = True
335 isEvaldUnfolding (CoreUnfolding _ _ is_evald _ _) = is_evald
336 isEvaldUnfolding other = False
338 isCheapUnfolding :: Unfolding -> Bool
339 isCheapUnfolding (CoreUnfolding _ _ _ is_cheap _) = is_cheap
340 isCheapUnfolding other = False
342 isCompulsoryUnfolding :: Unfolding -> Bool
343 isCompulsoryUnfolding (CompulsoryUnfolding _) = True
344 isCompulsoryUnfolding other = False
346 hasUnfolding :: Unfolding -> Bool
347 hasUnfolding (CoreUnfolding _ _ _ _ _) = True
348 hasUnfolding (CompulsoryUnfolding _) = True
349 hasUnfolding other = False
351 hasSomeUnfolding :: Unfolding -> Bool
352 hasSomeUnfolding NoUnfolding = False
353 hasSomeUnfolding other = True
355 neverUnfold :: Unfolding -> Bool
356 neverUnfold NoUnfolding = True
357 neverUnfold (OtherCon _) = True
358 neverUnfold (CoreUnfolding _ _ _ _ UnfoldNever) = True
359 neverUnfold other = False
363 %************************************************************************
365 \subsection{The main data type}
367 %************************************************************************
370 -- The Ord is needed for the FiniteMap used in the lookForConstructor
371 -- in SimplEnv. If you declared that lookForConstructor *ignores*
372 -- constructor-applications with LitArg args, then you could get
375 instance Outputable AltCon where
376 ppr (DataAlt dc) = ppr dc
377 ppr (LitAlt lit) = ppr lit
378 ppr DEFAULT = ptext SLIT("__DEFAULT")
380 instance Show AltCon where
381 showsPrec p con = showsPrecSDoc p (ppr con)
383 cmpAlt :: Alt b -> Alt b -> Ordering
384 cmpAlt (con1, _, _) (con2, _, _) = con1 `cmpAltCon` con2
386 ltAlt :: Alt b -> Alt b -> Bool
387 ltAlt a1 a2 = case a1 `cmpAlt` a2 of { LT -> True; other -> False }
389 cmpAltCon :: AltCon -> AltCon -> Ordering
390 -- Compares AltCons within a single list of alternatives
391 cmpAltCon DEFAULT DEFAULT = EQ
392 cmpAltCon DEFAULT con = LT
394 cmpAltCon (DataAlt d1) (DataAlt d2) = dataConTag d1 `compare` dataConTag d2
395 cmpAltCon (DataAlt _) DEFAULT = GT
396 cmpAltCon (LitAlt l1) (LitAlt l2) = l1 `compare` l2
397 cmpAltCon (LitAlt _) DEFAULT = GT
399 cmpAltCon con1 con2 = WARN( True, text "Comparing incomparable AltCons" <+>
400 ppr con1 <+> ppr con2 )
405 %************************************************************************
407 \subsection{Useful synonyms}
409 %************************************************************************
415 type CoreExpr = Expr CoreBndr
416 type CoreArg = Arg CoreBndr
417 type CoreBind = Bind CoreBndr
418 type CoreAlt = Alt CoreBndr
421 Binders are ``tagged'' with a \tr{t}:
424 data TaggedBndr t = TB CoreBndr t -- TB for "tagged binder"
426 type TaggedBind t = Bind (TaggedBndr t)
427 type TaggedExpr t = Expr (TaggedBndr t)
428 type TaggedArg t = Arg (TaggedBndr t)
429 type TaggedAlt t = Alt (TaggedBndr t)
431 instance Outputable b => Outputable (TaggedBndr b) where
432 ppr (TB b l) = char '<' <> ppr b <> comma <> ppr l <> char '>'
434 instance Outputable b => OutputableBndr (TaggedBndr b) where
435 pprBndr _ b = ppr b -- Simple
439 %************************************************************************
441 \subsection{Core-constructing functions with checking}
443 %************************************************************************
446 mkApps :: Expr b -> [Arg b] -> Expr b
447 mkTyApps :: Expr b -> [Type] -> Expr b
448 mkValApps :: Expr b -> [Expr b] -> Expr b
449 mkVarApps :: Expr b -> [Var] -> Expr b
451 mkApps f args = foldl App f args
452 mkTyApps f args = foldl (\ e a -> App e (Type a)) f args
453 mkValApps f args = foldl (\ e a -> App e a) f args
454 mkVarApps f vars = foldl (\ e a -> App e (varToCoreExpr a)) f vars
456 mkLit :: Literal -> Expr b
457 mkIntLit :: Integer -> Expr b
458 mkIntLitInt :: Int -> Expr b
459 mkConApp :: DataCon -> [Arg b] -> Expr b
460 mkLets :: [Bind b] -> Expr b -> Expr b
461 mkLams :: [b] -> Expr b -> Expr b
464 mkConApp con args = mkApps (Var (dataConWorkId con)) args
466 mkLams binders body = foldr Lam body binders
467 mkLets binds body = foldr Let body binds
469 mkIntLit n = Lit (mkMachInt n)
470 mkIntLitInt n = Lit (mkMachInt (toInteger n))
472 varToCoreExpr :: CoreBndr -> Expr b
473 varToCoreExpr v | isId v = Var v
474 | otherwise = Type (mkTyVarTy v)
476 varsToCoreExprs :: [CoreBndr] -> [Expr b]
477 varsToCoreExprs vs = map varToCoreExpr vs
479 mkCast :: Expr b -> Coercion -> Expr b
480 mkCast e co = Cast e co
484 %************************************************************************
486 \subsection{Simple access functions}
488 %************************************************************************
491 bindersOf :: Bind b -> [b]
492 bindersOf (NonRec binder _) = [binder]
493 bindersOf (Rec pairs) = [binder | (binder, _) <- pairs]
495 bindersOfBinds :: [Bind b] -> [b]
496 bindersOfBinds binds = foldr ((++) . bindersOf) [] binds
498 rhssOfBind :: Bind b -> [Expr b]
499 rhssOfBind (NonRec _ rhs) = [rhs]
500 rhssOfBind (Rec pairs) = [rhs | (_,rhs) <- pairs]
502 rhssOfAlts :: [Alt b] -> [Expr b]
503 rhssOfAlts alts = [e | (_,_,e) <- alts]
505 flattenBinds :: [Bind b] -> [(b, Expr b)] -- Get all the lhs/rhs pairs
506 flattenBinds (NonRec b r : binds) = (b,r) : flattenBinds binds
507 flattenBinds (Rec prs1 : binds) = prs1 ++ flattenBinds binds
511 We often want to strip off leading lambdas before getting down to
512 business. @collectBinders@ is your friend.
514 We expect (by convention) type-, and value- lambdas in that
518 collectBinders :: Expr b -> ([b], Expr b)
519 collectTyBinders :: CoreExpr -> ([TyVar], CoreExpr)
520 collectValBinders :: CoreExpr -> ([Id], CoreExpr)
521 collectTyAndValBinders :: CoreExpr -> ([TyVar], [Id], CoreExpr)
526 go bs (Lam b e) = go (b:bs) e
527 go bs e = (reverse bs, e)
529 collectTyAndValBinders expr
532 (tvs, body1) = collectTyBinders expr
533 (ids, body) = collectValBinders body1
535 collectTyBinders expr
538 go tvs (Lam b e) | isTyVar b = go (b:tvs) e
539 go tvs e = (reverse tvs, e)
541 collectValBinders expr
544 go ids (Lam b e) | isId b = go (b:ids) e
545 go ids body = (reverse ids, body)
549 @collectArgs@ takes an application expression, returning the function
550 and the arguments to which it is applied.
553 collectArgs :: Expr b -> (Expr b, [Arg b])
557 go (App f a) as = go f (a:as)
561 coreExprCc gets the cost centre enclosing an expression, if any.
562 It looks inside lambdas because (scc "foo" \x.e) = \x.scc "foo" e
565 coreExprCc :: Expr b -> CostCentre
566 coreExprCc (Note (SCC cc) e) = cc
567 coreExprCc (Note other_note e) = coreExprCc e
568 coreExprCc (Lam _ e) = coreExprCc e
569 coreExprCc other = noCostCentre
574 %************************************************************************
576 \subsection{Predicates}
578 %************************************************************************
580 @isRuntimeVar v@ returns if (Lam v _) really becomes a lambda at runtime,
581 i.e. if type applications are actual lambdas because types are kept around
584 Similarly isRuntimeArg.
587 isRuntimeVar :: Var -> Bool
588 isRuntimeVar | opt_RuntimeTypes = \v -> True
589 | otherwise = \v -> isId v
591 isRuntimeArg :: CoreExpr -> Bool
592 isRuntimeArg | opt_RuntimeTypes = \e -> True
593 | otherwise = \e -> isValArg e
597 isValArg (Type _) = False
598 isValArg other = True
600 isTypeArg (Type _) = True
601 isTypeArg other = False
603 valBndrCount :: [CoreBndr] -> Int
605 valBndrCount (b : bs) | isId b = 1 + valBndrCount bs
606 | otherwise = valBndrCount bs
608 valArgCount :: [Arg b] -> Int
610 valArgCount (Type _ : args) = valArgCount args
611 valArgCount (other : args) = 1 + valArgCount args
615 %************************************************************************
617 \subsection{Seq stuff}
619 %************************************************************************
622 seqExpr :: CoreExpr -> ()
623 seqExpr (Var v) = v `seq` ()
624 seqExpr (Lit lit) = lit `seq` ()
625 seqExpr (App f a) = seqExpr f `seq` seqExpr a
626 seqExpr (Lam b e) = seqBndr b `seq` seqExpr e
627 seqExpr (Let b e) = seqBind b `seq` seqExpr e
628 seqExpr (Case e b t as) = seqExpr e `seq` seqBndr b `seq` seqType t `seq` seqAlts as
629 seqExpr (Cast e co) = seqExpr e `seq` seqType co
630 seqExpr (Note n e) = seqNote n `seq` seqExpr e
631 seqExpr (Type t) = seqType t
634 seqExprs (e:es) = seqExpr e `seq` seqExprs es
636 seqNote (CoreNote s) = s `seq` ()
639 seqBndr b = b `seq` ()
642 seqBndrs (b:bs) = seqBndr b `seq` seqBndrs bs
644 seqBind (NonRec b e) = seqBndr b `seq` seqExpr e
645 seqBind (Rec prs) = seqPairs prs
648 seqPairs ((b,e):prs) = seqBndr b `seq` seqExpr e `seq` seqPairs prs
651 seqAlts ((c,bs,e):alts) = seqBndrs bs `seq` seqExpr e `seq` seqAlts alts
654 seqRules (Rule { ru_bndrs = bndrs, ru_args = args, ru_rhs = rhs } : rules)
655 = seqBndrs bndrs `seq` seqExprs (rhs:args) `seq` seqRules rules
656 seqRules (BuiltinRule {} : rules) = seqRules rules
661 %************************************************************************
663 \subsection{Annotated core; annotation at every node in the tree}
665 %************************************************************************
668 type AnnExpr bndr annot = (annot, AnnExpr' bndr annot)
670 data AnnExpr' bndr annot
673 | AnnLam bndr (AnnExpr bndr annot)
674 | AnnApp (AnnExpr bndr annot) (AnnExpr bndr annot)
675 | AnnCase (AnnExpr bndr annot) bndr Type [AnnAlt bndr annot]
676 | AnnLet (AnnBind bndr annot) (AnnExpr bndr annot)
677 | AnnCast (AnnExpr bndr annot) Coercion
678 | AnnNote Note (AnnExpr bndr annot)
681 type AnnAlt bndr annot = (AltCon, [bndr], AnnExpr bndr annot)
683 data AnnBind bndr annot
684 = AnnNonRec bndr (AnnExpr bndr annot)
685 | AnnRec [(bndr, AnnExpr bndr annot)]
689 deAnnotate :: AnnExpr bndr annot -> Expr bndr
690 deAnnotate (_, e) = deAnnotate' e
692 deAnnotate' (AnnType t) = Type t
693 deAnnotate' (AnnVar v) = Var v
694 deAnnotate' (AnnLit lit) = Lit lit
695 deAnnotate' (AnnLam binder body) = Lam binder (deAnnotate body)
696 deAnnotate' (AnnApp fun arg) = App (deAnnotate fun) (deAnnotate arg)
697 deAnnotate' (AnnCast e co) = Cast (deAnnotate e) co
698 deAnnotate' (AnnNote note body) = Note note (deAnnotate body)
700 deAnnotate' (AnnLet bind body)
701 = Let (deAnnBind bind) (deAnnotate body)
703 deAnnBind (AnnNonRec var rhs) = NonRec var (deAnnotate rhs)
704 deAnnBind (AnnRec pairs) = Rec [(v,deAnnotate rhs) | (v,rhs) <- pairs]
706 deAnnotate' (AnnCase scrut v t alts)
707 = Case (deAnnotate scrut) v t (map deAnnAlt alts)
709 deAnnAlt :: AnnAlt bndr annot -> Alt bndr
710 deAnnAlt (con,args,rhs) = (con,args,deAnnotate rhs)
714 collectAnnBndrs :: AnnExpr bndr annot -> ([bndr], AnnExpr bndr annot)
718 collect bs (_, AnnLam b body) = collect (b:bs) body
719 collect bs body = (reverse bs, body)