X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2FcoreSyn%2FCoreSyn.lhs;h=ac32bc201b4051e7b7036b40069ac0e2b5ced7cc;hb=6e11b50a24e4a0d86afb7e8617b2ef7701ee0879;hp=76873176b90f42feeff0a4c95f16686ee24dac23;hpb=a907e963e126a7c139ad23819cfb666eeed41274;p=ghc-hetmet.git diff --git a/compiler/coreSyn/CoreSyn.lhs b/compiler/coreSyn/CoreSyn.lhs index 7687317..ac32bc2 100644 --- a/compiler/coreSyn/CoreSyn.lhs +++ b/compiler/coreSyn/CoreSyn.lhs @@ -20,9 +20,8 @@ module CoreSyn ( isTyVar, isId, cmpAltCon, cmpAlt, ltAlt, bindersOf, bindersOfBinds, rhssOfBind, rhssOfAlts, collectBinders, collectTyBinders, collectValBinders, collectTyAndValBinders, - collectArgs, - coreExprCc, - flattenBinds, + collectArgs, coreExprCc, + mkTyBind, flattenBinds, isValArg, isTypeArg, valArgCount, valBndrCount, isRuntimeArg, isRuntimeVar, @@ -48,7 +47,6 @@ module CoreSyn ( #include "HsVersions.h" -import StaticFlags import CostCentre import Var import Type @@ -138,7 +136,7 @@ Invariant: The remaining cases are in order of increasing Invariant: The list of alternatives is ALWAYS EXHAUSTIVE, meaning that it covers all cases that can occur - An "exhausive" case does not necessarily mention all constructors: + An "exhaustive" case does not necessarily mention all constructors: data Foo = Red | Green | Blue ...case x of @@ -151,12 +149,23 @@ Invariant: The list of alternatives is ALWAYS EXHAUSTIVE, Note [CoreSyn let goal] -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~~~~~~~~ * The simplifier tries to ensure that if the RHS of a let is a constructor application, its arguments are trivial, so that the constructor can be inlined vigorously. +Note [Type let] +~~~~~~~~~~~~~~~ +We allow a *non-recursive* let to bind a type variable, thus + Let (NonRec tv (Type ty)) body +This can be very convenient for postponing type substitutions until +the next run of the simplifier. + +At the moment, the rest of the compiler only deals with type-let +in a Let expression, rather than at top level. We may want to revist +this choice. + \begin{code} data Note = SCC CostCentre @@ -389,7 +398,7 @@ neverUnfold _ = False instance Outputable AltCon where ppr (DataAlt dc) = ppr dc ppr (LitAlt lit) = ppr lit - ppr DEFAULT = ptext SLIT("__DEFAULT") + ppr DEFAULT = ptext (sLit "__DEFAULT") instance Show AltCon where showsPrec p con = showsPrecSDoc p (ppr con) @@ -502,6 +511,11 @@ mkCast e co = Cast e co %************************************************************************ \begin{code} +mkTyBind :: TyVar -> Type -> CoreBind +mkTyBind tv ty = NonRec tv (Type ty) + -- Note [Type let] + -- A non-recursive let can bind a type variable + bindersOf :: Bind b -> [b] bindersOf (NonRec binder _) = [binder] bindersOf (Rec pairs) = [binder | (binder, _) <- pairs] @@ -591,23 +605,18 @@ coreExprCc _ = noCostCentre %* * %************************************************************************ +At one time we optionally carried type arguments through to runtime. @isRuntimeVar v@ returns if (Lam v _) really becomes a lambda at runtime, i.e. if type applications are actual lambdas because types are kept around -at runtime. - -Similarly isRuntimeArg. +at runtime. Similarly isRuntimeArg. \begin{code} isRuntimeVar :: Var -> Bool -isRuntimeVar | opt_RuntimeTypes = \_ -> True - | otherwise = \v -> isId v +isRuntimeVar = isId isRuntimeArg :: CoreExpr -> Bool -isRuntimeArg | opt_RuntimeTypes = \_ -> True - | otherwise = \e -> isValArg e -\end{code} +isRuntimeArg = isValArg -\begin{code} isValArg :: Expr b -> Bool isValArg (Type _) = False isValArg _ = True