ghc-9.4.1: The GHC API
Safe HaskellSafe-Inferred
LanguageHaskell2010

GHC.Core

Description

GHC.Core holds all the main data types for use by for the Glasgow Haskell Compiler midsection

Synopsis

Main data types

data Expr b Source #

This is the data type that represents GHCs core intermediate language. Currently GHC uses System FC https://www.microsoft.com/en-us/research/publication/system-f-with-type-equality-coercions/ for this purpose, which is closely related to the simpler and better known System F http://en.wikipedia.org/wiki/System_F.

We get from Haskell source to this Core language in a number of stages:

  1. The source code is parsed into an abstract syntax tree, which is represented by the data type HsExpr with the names being RdrNames
  2. This syntax tree is renamed, which attaches a Unique to every RdrName (yielding a Name) to disambiguate identifiers which are lexically identical. For example, this program:
     f x = let f x = x + 1
           in f (x - 2)

Would be renamed by having Uniques attached so it looked something like this:

     f_1 x_2 = let f_3 x_4 = x_4 + 1
               in f_3 (x_2 - 2)

But see Note [Shadowing] below.

  1. The resulting syntax tree undergoes type checking (which also deals with instantiating type class arguments) to yield a HsExpr type that has Id as it's names.
  2. Finally the syntax tree is desugared from the expressive HsExpr type into this Expr type, which has far fewer constructors and hence is easier to perform optimization, analysis and code generation on.

The type parameter b is for the type of binders in the expression tree.

The language consists of the following elements:

  • Variables See Note [Variable occurrences in Core]
  • Primitive literals
  • Applications: note that the argument may be a Expr. See Note [Core let/app invariant] See Note [Representation polymorphism invariants]
  • Lambda abstraction See Note [Representation polymorphism invariants]
  • Recursive and non recursive lets. Operationally this corresponds to allocating a thunk for the things bound and then executing the sub-expression.

See Note [Core letrec invariant] See Note [Core let/app invariant] See Note [Representation polymorphism invariants] See Note [Core type and coercion invariant]

  • Case expression. Operationally this corresponds to evaluating the scrutinee (expression examined) to weak head normal form and then examining at most one level of resulting constructor (i.e. you cannot do nested pattern matching directly with this).

The binder gets bound to the value of the scrutinee, and the Expr must be that of all the case alternatives

IMPORTANT: see Note [Case expression invariants]

  • Cast an expression to a particular type. This is used to implement newtypes (a newtype constructor or destructor just becomes a Cast in Core) and GADTs.
  • Ticks. These are used to represent all the source annotation we support: profiling SCCs, HPC ticks, and GHCi breakpoints.
  • A type: this should only show up at the top level of an Arg
  • A coercion

Constructors

Var Id 
Lit Literal 
App (Expr b) (Arg b) infixl 4 
Lam b (Expr b) 
Let (Bind b) (Expr b) 
Case (Expr b) b Type [Alt b] 
Cast (Expr b) CoercionR 
Tick CoreTickish (Expr b) 
Type Type 
Coercion Coercion 

Instances

Instances details
Data b => Data (Expr b) Source # 
Instance details

Defined in GHC.Core

Methods

gfoldl :: (forall d b0. Data d => c (d -> b0) -> d -> c b0) -> (forall g. g -> c g) -> Expr b -> c (Expr b) Source #

gunfold :: (forall b0 r. Data b0 => c (b0 -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c (Expr b) Source #

toConstr :: Expr b -> Constr Source #

dataTypeOf :: Expr b -> DataType Source #

dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c (Expr b)) Source #

dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (Expr b)) Source #

gmapT :: (forall b0. Data b0 => b0 -> b0) -> Expr b -> Expr b Source #

gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Expr b -> r Source #

gmapQr :: forall r r'. (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Expr b -> r Source #

gmapQ :: (forall d. Data d => d -> u) -> Expr b -> [u] Source #

gmapQi :: Int -> (forall d. Data d => d -> u) -> Expr b -> u Source #

gmapM :: Monad m => (forall d. Data d => d -> m d) -> Expr b -> m (Expr b) Source #

gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> Expr b -> m (Expr b) Source #

gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> Expr b -> m (Expr b) Source #

OutputableBndr b => Outputable (Expr b) Source # 
Instance details

Defined in GHC.Core.Ppr

Methods

ppr :: Expr b -> SDoc Source #

Eq (DeBruijn CoreExpr) Source # 
Instance details

Defined in GHC.Core.Map.Expr

data Alt b Source #

A case split alternative. Consists of the constructor leading to the alternative, the variables bound from the constructor, and the expression to be executed given that binding. The default alternative is (DEFAULT, [], rhs)

Constructors

Alt AltCon [b] (Expr b) 

Instances

Instances details
Data b => Data (Alt b) Source # 
Instance details

Defined in GHC.Core

Methods

gfoldl :: (forall d b0. Data d => c (d -> b0) -> d -> c b0) -> (forall g. g -> c g) -> Alt b -> c (Alt b) Source #

gunfold :: (forall b0 r. Data b0 => c (b0 -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c (Alt b) Source #

toConstr :: Alt b -> Constr Source #

dataTypeOf :: Alt b -> DataType Source #

dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c (Alt b)) Source #

dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (Alt b)) Source #

gmapT :: (forall b0. Data b0 => b0 -> b0) -> Alt b -> Alt b Source #

gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Alt b -> r Source #

gmapQr :: forall r r'. (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Alt b -> r Source #

gmapQ :: (forall d. Data d => d -> u) -> Alt b -> [u] Source #

gmapQi :: Int -> (forall d. Data d => d -> u) -> Alt b -> u Source #

gmapM :: Monad m => (forall d. Data d => d -> m d) -> Alt b -> m (Alt b) Source #

gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> Alt b -> m (Alt b) Source #

gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> Alt b -> m (Alt b) Source #

OutputableBndr b => Outputable (Alt b) Source # 
Instance details

Defined in GHC.Core.Ppr

Methods

ppr :: Alt b -> SDoc Source #

Eq (DeBruijn CoreAlt) Source # 
Instance details

Defined in GHC.Core.Map.Expr

data Bind b Source #

Binding, used for top level bindings in a module and local bindings in a let.

Constructors

NonRec b (Expr b) 
Rec [(b, Expr b)] 

Instances

Instances details
Data b => Data (Bind b) Source # 
Instance details

Defined in GHC.Core

Methods

gfoldl :: (forall d b0. Data d => c (d -> b0) -> d -> c b0) -> (forall g. g -> c g) -> Bind b -> c (Bind b) Source #

gunfold :: (forall b0 r. Data b0 => c (b0 -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c (Bind b) Source #

toConstr :: Bind b -> Constr Source #

dataTypeOf :: Bind b -> DataType Source #

dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c (Bind b)) Source #

dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (Bind b)) Source #

gmapT :: (forall b0. Data b0 => b0 -> b0) -> Bind b -> Bind b Source #

gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Bind b -> r Source #

gmapQr :: forall r r'. (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Bind b -> r Source #

gmapQ :: (forall d. Data d => d -> u) -> Bind b -> [u] Source #

gmapQi :: Int -> (forall d. Data d => d -> u) -> Bind b -> u Source #

gmapM :: Monad m => (forall d. Data d => d -> m d) -> Bind b -> m (Bind b) Source #

gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> Bind b -> m (Bind b) Source #

gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> Bind b -> m (Bind b) Source #

OutputableBndr b => Outputable (Bind b) Source # 
Instance details

Defined in GHC.Core.Ppr

Methods

ppr :: Bind b -> SDoc Source #

data AltCon Source #

A case alternative constructor (i.e. pattern match)

Constructors

DataAlt DataCon 
LitAlt Literal

A literal: case e of { 1 -> ... } Invariant: always an *unlifted* literal See Note [Literal alternatives]

DEFAULT

Trivial alternative: case e of { _ -> ... }

Instances

Instances details
Data AltCon Source # 
Instance details

Defined in GHC.Core

Methods

gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> AltCon -> c AltCon Source #

gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c AltCon Source #

toConstr :: AltCon -> Constr Source #

dataTypeOf :: AltCon -> DataType Source #

dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c AltCon) Source #

dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c AltCon) Source #

gmapT :: (forall b. Data b => b -> b) -> AltCon -> AltCon Source #

gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> AltCon -> r Source #

gmapQr :: forall r r'. (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> AltCon -> r Source #

gmapQ :: (forall d. Data d => d -> u) -> AltCon -> [u] Source #

gmapQi :: Int -> (forall d. Data d => d -> u) -> AltCon -> u Source #

gmapM :: Monad m => (forall d. Data d => d -> m d) -> AltCon -> m AltCon Source #

gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> AltCon -> m AltCon Source #

gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> AltCon -> m AltCon Source #

Outputable AltCon Source # 
Instance details

Defined in GHC.Core

Methods

ppr :: AltCon -> SDoc Source #

Eq AltCon Source # 
Instance details

Defined in GHC.Core

Methods

(==) :: AltCon -> AltCon -> Bool #

(/=) :: AltCon -> AltCon -> Bool #

Ord AltCon Source # 
Instance details

Defined in GHC.Core

type Arg b = Expr b Source #

Type synonym for expressions that occur in function argument positions. Only Arg should contain a Expr at top level, general Expr should not

type CoreExpr = Expr CoreBndr Source #

Expressions where binders are CoreBndrs

type CoreAlt = Alt CoreBndr Source #

Case alternatives where binders are CoreBndrs

type CoreBind = Bind CoreBndr Source #

Binding groups where binders are CoreBndrs

type CoreArg = Arg CoreBndr Source #

Argument expressions where binders are CoreBndrs

type CoreBndr = Var Source #

The common case for the type of binders and variables when we are manipulating the Core language within GHC

data TaggedBndr t Source #

Binders are tagged with a t

Constructors

TB CoreBndr t 

Instances

Instances details
Outputable b => Outputable (TaggedBndr b) Source # 
Instance details

Defined in GHC.Core

Methods

ppr :: TaggedBndr b -> SDoc Source #

Outputable b => OutputableBndr (TaggedBndr b) Source # 
Instance details

Defined in GHC.Core.Ppr

In/Out type synonyms

type InId = Id Source #

type InVar = Var Source #

type OutId = Id Source #

Expr construction

mkLet :: Bind b -> Expr b -> Expr b Source #

mkLets :: [Bind b] -> Expr b -> Expr b Source #

Bind all supplied binding groups over an expression in a nested let expression. Assumes that the rhs satisfies the let/app invariant. Prefer to use mkCoreLets if possible, which does guarantee the invariant

mkLetNonRec :: b -> Expr b -> Expr b -> Expr b Source #

mkLetNonRec bndr rhs body wraps body in a let binding bndr.

mkLetRec :: [(b, Expr b)] -> Expr b -> Expr b Source #

mkLetRec binds body wraps body in a let rec with the given set of binds if binds is non-empty.

mkLams :: [b] -> Expr b -> Expr b Source #

Bind all supplied binders over an expression in a nested lambda expression. Prefer to use mkCoreLams if possible

mkApps :: Expr b -> [Arg b] -> Expr b infixl 4 Source #

Apply a list of argument expressions to a function expression in a nested fashion. Prefer to use mkCoreApps if possible

mkTyApps :: Expr b -> [Type] -> Expr b infixl 4 Source #

Apply a list of type argument expressions to a function expression in a nested fashion

mkCoApps :: Expr b -> [Coercion] -> Expr b infixl 4 Source #

Apply a list of coercion argument expressions to a function expression in a nested fashion

mkVarApps :: Expr b -> [Var] -> Expr b infixl 4 Source #

Apply a list of type or value variables to a function expression in a nested fashion

mkIntLit :: Platform -> Integer -> Expr b Source #

Create a machine integer literal expression of type Int# from an Integer. If you want an expression of type Int use mkIntExpr

mkIntLitWrap :: Platform -> Integer -> Expr b Source #

Create a machine integer literal expression of type Int# from an Integer, wrapping if necessary. If you want an expression of type Int use mkIntExpr

mkWordLit :: Platform -> Integer -> Expr b Source #

Create a machine word literal expression of type Word# from an Integer. If you want an expression of type Word use mkWordExpr

mkWordLitWrap :: Platform -> Integer -> Expr b Source #

Create a machine word literal expression of type Word# from an Integer, wrapping if necessary. If you want an expression of type Word use mkWordExpr

mkCharLit :: Char -> Expr b Source #

Create a machine character literal expression of type Char#. If you want an expression of type Char use mkCharExpr

mkStringLit :: String -> Expr b Source #

Create a machine string literal expression of type Addr#. If you want an expression of type String use mkStringExpr

mkFloatLit :: Rational -> Expr b Source #

Create a machine single precision literal expression of type Float# from a Rational. If you want an expression of type Float use mkFloatExpr

mkFloatLitFloat :: Float -> Expr b Source #

Create a machine single precision literal expression of type Float# from a Float. If you want an expression of type Float use mkFloatExpr

mkDoubleLit :: Rational -> Expr b Source #

Create a machine double precision literal expression of type Double# from a Rational. If you want an expression of type Double use mkDoubleExpr

mkDoubleLitDouble :: Double -> Expr b Source #

Create a machine double precision literal expression of type Double# from a Double. If you want an expression of type Double use mkDoubleExpr

mkConApp :: DataCon -> [Arg b] -> Expr b Source #

Apply a list of argument expressions to a data constructor in a nested fashion. Prefer to use mkCoreConApps if possible

mkConApp2 :: DataCon -> [Type] -> [Var] -> Expr b Source #

mkTyBind :: TyVar -> Type -> CoreBind Source #

Create a binding group where a type variable is bound to a type. Per Note [Core type and coercion invariant], this can only be used to bind something in a non-recursive let expression

mkCoBind :: CoVar -> Coercion -> CoreBind Source #

Create a binding group where a type variable is bound to a type. Per Note [Core type and coercion invariant], this can only be used to bind something in a non-recursive let expression

varToCoreExpr :: CoreBndr -> Expr b Source #

Convert a binder into either a Expr or Expr Expr appropriately

isId :: Var -> Bool Source #

Is this a value-level (i.e., computationally relevant) Varentifier? Satisfies isId = not . isTyVar.

cmpAltCon :: AltCon -> AltCon -> Ordering Source #

Compares AltCons within a single list of alternatives DEFAULT comes out smallest, so that sorting by AltCon puts alternatives in the order required: see Note [Case expression invariants]

cmpAlt :: Alt a -> Alt a -> Ordering Source #

ltAlt :: Alt a -> Alt a -> Bool Source #

Simple Expr access functions and predicates

bindersOf :: Bind b -> [b] Source #

Extract every variable by this group

bindersOfBinds :: [Bind b] -> [b] Source #

bindersOf applied to a list of binding groups

rhssOfAlts :: [Alt b] -> [Expr b] Source #

collectBinders :: Expr b -> ([b], Expr b) Source #

We often want to strip off leading lambdas before getting down to business. Variants are collectTyBinders, collectValBinders, and collectTyAndValBinders

collectNBinders :: Int -> Expr b -> ([b], Expr b) Source #

Strip off exactly N leading lambdas (type or value). Good for use with join points.

collectArgs :: Expr b -> (Expr b, [Arg b]) Source #

Takes a nested application expression and returns the function being applied and the arguments to which it is applied

stripNArgs :: Word -> Expr a -> Maybe (Expr a) Source #

Attempt to remove the last N arguments of a function call. Strip off any ticks or coercions encountered along the way and any at the end.

collectArgsTicks :: (CoreTickish -> Bool) -> Expr b -> (Expr b, [Arg b], [CoreTickish]) Source #

Like collectArgs, but also collects looks through floatable ticks if it means that we can find more arguments.

flattenBinds :: [Bind b] -> [(b, Expr b)] Source #

Collapse all the bindings in the supplied groups into a single list of lhs/rhs pairs suitable for binding in a Rec binding group

exprToType :: CoreExpr -> Type Source #

If the expression is a Expr, converts. Otherwise, panics. NB: This does not convert Expr to CoercionTy.

wrapLamBody :: (CoreExpr -> CoreExpr) -> CoreExpr -> CoreExpr Source #

fmap on the body of a lambda. wrapLamBody f (x -> body) == (x -> f body)

isValArg :: Expr b -> Bool Source #

Returns True for value arguments, false for type args NB: coercions are value arguments (zero width, to be sure, like State#, but still value args).

isTypeArg :: Expr b -> Bool Source #

Returns True iff the expression is a Expr expression at its top level. Note this does NOT include Exprs.

isCoArg :: Expr b -> Bool Source #

Returns True iff the expression is a Expr expression at its top level

isTyCoArg :: Expr b -> Bool Source #

Returns True iff the expression is a Expr or Expr expression at its top level

valArgCount :: [Arg b] -> Int Source #

The number of argument expressions that are values rather than types at their top level

valBndrCount :: [CoreBndr] -> Int Source #

The number of binders that bind values rather than types

isRuntimeArg :: CoreExpr -> Bool Source #

Will this argument expression exist at runtime?

isRuntimeVar :: Var -> Bool Source #

Will this variable exist at runtime?

Unfolding data types

data Unfolding Source #

Records the unfolding of an identifier, which is approximately the form the identifier would have if we substituted its definition in for the identifier. This type should be treated as abstract everywhere except in GHC.Core.Unfold

Constructors

NoUnfolding

We have no information about the unfolding.

BootUnfolding

We have no information about the unfolding, because this Id came from an hi-boot file. See Note [Inlining and hs-boot files] in GHC.CoreToIface for what this is used for.

OtherCon [AltCon]

It ain't one of these constructors. OtherCon xs also indicates that something has been evaluated and hence there's no point in re-evaluating it. OtherCon [] is used even for non-data-type values to indicated evaluated-ness. Notably:

data C = C !(Int -> Int)
case x of { C f -> ... }

Here, f gets an OtherCon [] unfolding.

DFunUnfolding 

Fields

CoreUnfolding

An unfolding with redundant cached information. Parameters:

uf_tmpl: Template used to perform unfolding; NB: Occurrence info is guaranteed correct: see Note [OccInfo in unfoldings and rules]

uf_is_top: Is this a top level binding?

uf_is_value: exprIsHNF template (cached); it is ok to discard a seq on this variable

uf_is_work_free: Does this waste only a little work if we expand it inside an inlining? Basically this is a cached version of exprIsWorkFree

uf_guidance: Tells us about the size of the unfolding template

Instances

Instances details
Outputable Unfolding Source # 
Instance details

Defined in GHC.Core.Ppr

Methods

ppr :: Unfolding -> SDoc Source #

data UnfoldingGuidance Source #

UnfoldingGuidance says when unfolding should take place

Constructors

UnfWhen 
UnfIfGoodArgs 

Fields

UnfNever 

Instances

Instances details
Outputable UnfoldingGuidance Source # 
Instance details

Defined in GHC.Core.Ppr

Eq UnfoldingGuidance Source # 
Instance details

Defined in GHC.Core

data UnfoldingSource Source #

Instances

Instances details
Outputable UnfoldingSource Source # 
Instance details

Defined in GHC.Core.Ppr

Constructing Unfoldings

noUnfolding :: Unfolding Source #

There is no known Unfolding

bootUnfolding :: Unfolding Source #

There is no known Unfolding, because this came from an hi-boot file.

evaldUnfolding :: Unfolding Source #

This unfolding marks the associated thing as being evaluated

Predicates and deconstruction on Unfolding

unfoldingTemplate :: Unfolding -> CoreExpr Source #

Retrieves the template of an unfolding: panics if none is known

maybeUnfoldingTemplate :: Unfolding -> Maybe CoreExpr Source #

Retrieves the template of an unfolding if possible maybeUnfoldingTemplate is used mainly wnen specialising, and we do want to specialise DFuns, so it's important to return a template for DFunUnfoldings

otherCons :: Unfolding -> [AltCon] Source #

The constructors that the unfolding could never be: returns [] if no information is available

isValueUnfolding :: Unfolding -> Bool Source #

Determines if it is certainly the case that the unfolding will yield a value (something in HNF): returns False if unsure

isEvaldUnfolding :: Unfolding -> Bool Source #

Determines if it possibly the case that the unfolding will yield a value. Unlike isValueUnfolding it returns True for OtherCon

isCheapUnfolding :: Unfolding -> Bool Source #

Is the thing we will unfold into certainly cheap?

isConLikeUnfolding :: Unfolding -> Bool Source #

True if the unfolding is a constructor application, the application of a CONLIKE function or OtherCon

isInlineUnfolding :: Unfolding -> Bool Source #

True of a stable unfolding that is (a) always inlined; that is, with an UnfWhen guidance, or (b) a DFunUnfolding which never needs to be inlined

hasSomeUnfolding :: Unfolding -> Bool Source #

Only returns False if there is no unfolding information available at all

Annotated expression data types

type AnnExpr bndr annot = (annot, AnnExpr' bndr annot) Source #

Annotated core: allows annotation at every node in the tree

data AnnExpr' bndr annot Source #

A clone of the Expr type but allowing annotation at every tree node

Constructors

AnnVar Id 
AnnLit Literal 
AnnLam bndr (AnnExpr bndr annot) 
AnnApp (AnnExpr bndr annot) (AnnExpr bndr annot) 
AnnCase (AnnExpr bndr annot) bndr Type [AnnAlt bndr annot] 
AnnLet (AnnBind bndr annot) (AnnExpr bndr annot) 
AnnCast (AnnExpr bndr annot) (annot, Coercion) 
AnnTick CoreTickish (AnnExpr bndr annot) 
AnnType Type 
AnnCoercion Coercion 

data AnnBind bndr annot Source #

A clone of the Bind type but allowing annotation at every tree node

Constructors

AnnNonRec bndr (AnnExpr bndr annot) 
AnnRec [(bndr, AnnExpr bndr annot)] 

data AnnAlt bndr annot Source #

A clone of the Alt type but allowing annotation at every tree node

Constructors

AnnAlt AltCon [bndr] (AnnExpr bndr annot) 

Operations on annotated expressions

collectAnnArgs :: AnnExpr b a -> (AnnExpr b a, [AnnExpr b a]) Source #

Takes a nested application expression and returns the function being applied and the arguments to which it is applied

Operations on annotations

deAnnotate :: AnnExpr bndr annot -> Expr bndr Source #

deAnnotate' :: AnnExpr' bndr annot -> Expr bndr Source #

deAnnAlt :: AnnAlt bndr annot -> Alt bndr Source #

deAnnBind :: AnnBind b annot -> Bind b Source #

collectAnnBndrs :: AnnExpr bndr annot -> ([bndr], AnnExpr bndr annot) Source #

As collectBinders but for AnnExpr rather than Expr

collectNAnnBndrs :: Int -> AnnExpr bndr annot -> ([bndr], AnnExpr bndr annot) Source #

As collectNBinders but for AnnExpr rather than Expr

Orphanhood

data IsOrphan Source #

Is this instance an orphan? If it is not an orphan, contains an OccName witnessing the instance's non-orphanhood. See Note [Orphans]

Constructors

IsOrphan 
NotOrphan !OccName 

Instances

Instances details
Data IsOrphan Source # 
Instance details

Defined in GHC.Core

Methods

gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> IsOrphan -> c IsOrphan Source #

gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c IsOrphan Source #

toConstr :: IsOrphan -> Constr Source #

dataTypeOf :: IsOrphan -> DataType Source #

dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c IsOrphan) Source #

dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c IsOrphan) Source #

gmapT :: (forall b. Data b => b -> b) -> IsOrphan -> IsOrphan Source #

gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> IsOrphan -> r Source #

gmapQr :: forall r r'. (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> IsOrphan -> r Source #

gmapQ :: (forall d. Data d => d -> u) -> IsOrphan -> [u] Source #

gmapQi :: Int -> (forall d. Data d => d -> u) -> IsOrphan -> u Source #

gmapM :: Monad m => (forall d. Data d => d -> m d) -> IsOrphan -> m IsOrphan Source #

gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> IsOrphan -> m IsOrphan Source #

gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> IsOrphan -> m IsOrphan Source #

Binary IsOrphan Source # 
Instance details

Defined in GHC.Core

isOrphan :: IsOrphan -> Bool Source #

Returns true if IsOrphan is orphan.

notOrphan :: IsOrphan -> Bool Source #

Returns true if IsOrphan is not an orphan.

Core rule data types

data CoreRule Source #

A CoreRule is:

  • "Local" if the function it is a rule for is defined in the same module as the rule itself.
  • "Orphan" if nothing on the LHS is defined in the same module as the rule itself

Constructors

Rule 

Fields

  • ru_name :: RuleName

    Name of the rule, for communication with the user

  • ru_act :: Activation

    When the rule is active

  • ru_fn :: Name

    Name of the Id at the head of this rule

  • ru_rough :: [Maybe Name]

    Name at the head of each argument to the left hand side

  • ru_bndrs :: [CoreBndr]

    Variables quantified over

  • ru_args :: [CoreExpr]

    Left hand side arguments

  • ru_rhs :: CoreExpr

    Right hand side of the rule Occurrence info is guaranteed correct See Note [OccInfo in unfoldings and rules]

  • ru_auto :: Bool

    True = this rule is auto-generated (notably by Specialise or SpecConstr) False = generated at the user's behest See Note [Trimming auto-rules] in GHC.Iface.Tidy for the sole purpose of this field.

  • ru_origin :: !Module

    GenModule the rule was defined in, used to test if we should see an orphan rule.

  • ru_orphan :: !IsOrphan

    Whether or not the rule is an orphan.

  • ru_local :: Bool

    True iff the fn at the head of the rule is defined in the same module as the rule and is not an implicit Id (like a record selector, class operation, or data constructor). This is different from ru_orphan, where a rule can avoid being an orphan if *any* Name in LHS of the rule was defined in the same module as the rule.

BuiltinRule

Built-in rules are used for constant folding and suchlike. They have no free variables. A built-in rule is always visible (there is no such thing as an orphan built-in rule.)

Fields

  • ru_name :: RuleName

    Name of the rule, for communication with the user

  • ru_fn :: Name

    Name of the Id at the head of this rule

  • ru_nargs :: Int

    Number of arguments that ru_try consumes, if it fires, including type arguments

  • ru_try :: RuleFun

    This function does the rewrite. It given too many arguments, it simply discards them; the returned CoreExpr is just the rewrite of ru_fn applied to the first ru_nargs args

Instances

Instances details
Outputable CoreRule Source # 
Instance details

Defined in GHC.Core.Ppr

Methods

ppr :: CoreRule -> SDoc Source #

type RuleBase = NameEnv [CoreRule] Source #

Gathers a collection of CoreRules. Maps (the name of) an Id to its rules

type RuleFun = RuleOpts -> InScopeEnv -> Id -> [CoreExpr] -> Maybe CoreExpr Source #

The InScopeSet in the InScopeEnv is a superset of variables that are currently in scope. See Note [The InScopeSet invariant].

data RuleEnv Source #

A full rule environment which we can apply rules from. Like a RuleBase, but it also includes the set of visible orphans we use to filter out orphan rules which are not visible (even though we can see them...)

Constructors

RuleEnv 

data RuleOpts Source #

Rule options

Constructors

RuleOpts 

Fields

Operations on CoreRules

ruleArity :: CoreRule -> Int Source #

The number of arguments the ru_fn must be applied to before the rule can match on it

ruleIdName :: CoreRule -> Name Source #

The Name of the Id at the head of the rule left hand side

setRuleIdName :: Name -> CoreRule -> CoreRule Source #

Set the Name of the Id at the head of the rule left hand side