| ghc-6.10.4: The GHC API | Contents | Index

IdInfo

Contents

The GlobalIdDetails type
The IdInfo type
  Zapping various forms of Info
  The ArityInfo type
  Demand and strictness Info
  The WorkerInfo type
  Unfolding Info
  The InlinePragInfo type
  The OccInfo type
  The SpecInfo type
  The CAFInfo type
  The LBVarInfo type
  Tick-box Info

Synopsis

data GlobalIdDetails

= VanillaGlobal

| RecordSelId {

sel_tycon :: TyCon
sel_label :: FieldLabel
sel_naughty :: Bool

}

| DataConWorkId DataCon
| DataConWrapId DataCon
| ClassOpId Class
| PrimOpId PrimOp
| FCallId ForeignCall
| TickBoxOpId TickBoxOp
| NotGlobalId

notGlobalId :: GlobalIdDetails
data IdInfo
vanillaIdInfo :: IdInfo
noCafIdInfo :: IdInfo
seqIdInfo :: IdInfo -> ()
megaSeqIdInfo :: IdInfo -> ()
zapLamInfo :: IdInfo -> Maybe IdInfo
zapDemandInfo :: IdInfo -> Maybe IdInfo
zapFragileInfo :: IdInfo -> Maybe IdInfo
type ArityInfo = Arity
unknownArity :: Arity
arityInfo :: IdInfo -> ArityInfo
setArityInfo :: IdInfo -> ArityInfo -> IdInfo
ppArityInfo :: Int -> SDoc
newStrictnessInfo :: IdInfo -> Maybe StrictSig
setNewStrictnessInfo :: IdInfo -> Maybe StrictSig -> IdInfo
newDemandInfo :: IdInfo -> Maybe Demand
setNewDemandInfo :: IdInfo -> Maybe Demand -> IdInfo
pprNewStrictness :: Maybe StrictSig -> SDoc
setAllStrictnessInfo :: IdInfo -> Maybe StrictSig -> IdInfo

data WorkerInfo

= NoWorker
| HasWorker Id Arity

workerExists :: WorkerInfo -> Bool
wrapperArity :: WorkerInfo -> Arity
workerId :: WorkerInfo -> Id
workerInfo :: IdInfo -> WorkerInfo
setWorkerInfo :: IdInfo -> WorkerInfo -> IdInfo
ppWorkerInfo :: WorkerInfo -> SDoc
unfoldingInfo :: IdInfo -> Unfolding
setUnfoldingInfo :: IdInfo -> Unfolding -> IdInfo
setUnfoldingInfoLazily :: IdInfo -> Unfolding -> IdInfo
type InlinePragInfo = Activation
inlinePragInfo :: IdInfo -> InlinePragInfo
setInlinePragInfo :: IdInfo -> InlinePragInfo -> IdInfo

data OccInfo

= NoOccInfo
| IAmDead
| OneOcc !InsideLam !OneBranch !InterestingCxt
| IAmALoopBreaker !RulesOnly

isFragileOcc :: OccInfo -> Bool
isDeadOcc :: OccInfo -> Bool
isLoopBreaker :: OccInfo -> Bool
occInfo :: IdInfo -> OccInfo
setOccInfo :: IdInfo -> OccInfo -> IdInfo
type InsideLam = Bool
type OneBranch = Bool
insideLam :: InsideLam
notInsideLam :: InsideLam
oneBranch :: OneBranch
notOneBranch :: OneBranch
data SpecInfo = SpecInfo [CoreRule] VarSet
isEmptySpecInfo :: SpecInfo -> Bool
specInfoFreeVars :: SpecInfo -> VarSet
specInfoRules :: SpecInfo -> [CoreRule]
seqSpecInfo :: SpecInfo -> ()
setSpecInfoHead :: Name -> SpecInfo -> SpecInfo
specInfo :: IdInfo -> SpecInfo
setSpecInfo :: IdInfo -> SpecInfo -> IdInfo

data CafInfo

= MayHaveCafRefs
| NoCafRefs

ppCafInfo :: CafInfo -> SDoc
mayHaveCafRefs :: CafInfo -> Bool
cafInfo :: IdInfo -> CafInfo
setCafInfo :: IdInfo -> CafInfo -> IdInfo

data LBVarInfo

= NoLBVarInfo
| IsOneShotLambda

noLBVarInfo :: LBVarInfo
hasNoLBVarInfo :: LBVarInfo -> Bool
lbvarInfo :: IdInfo -> LBVarInfo
setLBVarInfo :: IdInfo -> LBVarInfo -> IdInfo
data TickBoxOp = TickBox Module !TickBoxId
type TickBoxId = Int

The GlobalIdDetails type
data GlobalIdDetails

Information pertaining to global `Id`s. See Var for the distinction between global and local in this context
Constructors

VanillaGlobal | The `Id` is imported from elsewhere or is a default method `Id`
RecordSelId | The `Id` for a record selector

sel_tycon :: TyCon | For a data type family, this is the instance `TyCon` not the family `TyCon`
sel_label :: FieldLabel |
sel_naughty :: Bool |

DataConWorkId DataCon | The `Id` is for a data constructor worker
DataConWrapId DataCon | The `Id` is for a data constructor wrapper
ClassOpId Class | The `Id` is an operation of a class
PrimOpId PrimOp | The `Id` is for a primitive operator
FCallId ForeignCall | The `Id` is for a foreign call
TickBoxOpId TickBoxOp | The `Id` is for a HPC tick box (both traditional and binary)
NotGlobalId | Used as a convenient extra return value from globalIdDetails

Instances

Outputable GlobalIdDetails

notGlobalId :: GlobalIdDetails
An entirely unhelpful `GlobalIdDetails`
The IdInfo type
data IdInfo

An `IdInfo` gives optional information about an `Id`. If present it never lies, but it may not be present, in which case there is always a conservative assumption which can be made.

Two `Id`s may have different info even though they have the same Unique (and are hence the same `Id`); for example, one might lack the properties attached to the other.

The `IdInfo` gives information about the value, or definition, of the `Id`. It does not contain information about the Id's usage, except for demandInfo and `lbvarInfo`.

vanillaIdInfo :: IdInfo
Basic `IdInfo` that carries no useful information whatsoever
noCafIdInfo :: IdInfo
More informative `IdInfo` we can use when we know the `Id` has no CAF references
seqIdInfo :: IdInfo -> ()
Just evaluate the `IdInfo` to WHNF
megaSeqIdInfo :: IdInfo -> ()
Evaluate all the fields of the `IdInfo` that are generally demanded by the compiler
Zapping various forms of Info
zapLamInfo :: IdInfo -> Maybe IdInfo

This is used to remove information on lambda binders that we have setup as part of a lambda group, assuming they will be applied all at once, but turn out to be part of an unsaturated lambda as in e.g:

     (\x1. \x2. e) arg1

zapDemandInfo :: IdInfo -> Maybe IdInfo
Remove demand info on the `IdInfo` if it is present, otherwise return `Nothing`
zapFragileInfo :: IdInfo -> Maybe IdInfo
Zap info that depends on free variables
The ArityInfo type
type ArityInfo = Arity
An `ArityInfo` of `n` tells us that partial application of this `Id` to up to `n-1` value arguments does essentially no work. That is not necessarily the same as saying that it has `n` leading lambdas, because coerces may get in the way. The arity might increase later in the compilation process, if an extra lambda floats up to the binding site.
unknownArity :: Arity
It is always safe to assume that an `Id` has an arity of 0
arityInfo :: IdInfo -> ArityInfo
`Id` arity
setArityInfo :: IdInfo -> ArityInfo -> IdInfo
ppArityInfo :: Int -> SDoc
Demand and strictness Info
newStrictnessInfo :: IdInfo -> Maybe StrictSig
Id strictness information. Reason for Maybe: the DmdAnal phase needs to know whether this is the first visit, so it can assign botSig. Other customers want topSig. So `Nothing` is good.
setNewStrictnessInfo :: IdInfo -> Maybe StrictSig -> IdInfo
newDemandInfo :: IdInfo -> Maybe Demand
Id demand information. Similarly we want to know if there's no known demand yet, for when we are looking for CPR info
setNewDemandInfo :: IdInfo -> Maybe Demand -> IdInfo
pprNewStrictness :: Maybe StrictSig -> SDoc
setAllStrictnessInfo :: IdInfo -> Maybe StrictSig -> IdInfo
Set old and new strictness information together
The WorkerInfo type
data WorkerInfo

If this Id has a worker then we store a reference to it. Worker functions are generated by the worker/wrapper pass, using information information from strictness analysis.
Constructors

NoWorker | No known worker function
HasWorker Id Arity | The `Arity` is the arity of the wrapper at the moment of the worker/wrapper split, which may be different from the current `Id` Aritiy

workerExists :: WorkerInfo -> Bool
wrapperArity :: WorkerInfo -> Arity
The `Arity` of the worker function at the time of the split if it exists, or a panic otherwise
workerId :: WorkerInfo -> Id
The `Id` of the worker function if it exists, or a panic otherwise
workerInfo :: IdInfo -> WorkerInfo
Pointer to worker function. Within one module this is irrelevant; the inlining of a worker is handled via the `Unfolding`. However, when the module is imported by others, the `WorkerInfo` is used only to indicate the form of the RHS, so that interface files don't actually need to contain the RHS; it can be derived from the strictness info
setWorkerInfo :: IdInfo -> WorkerInfo -> IdInfo
ppWorkerInfo :: WorkerInfo -> SDoc
Unfolding Info
unfoldingInfo :: IdInfo -> Unfolding
The `Id`s unfolding
setUnfoldingInfo :: IdInfo -> Unfolding -> IdInfo
setUnfoldingInfoLazily :: IdInfo -> Unfolding -> IdInfo
The InlinePragInfo type
type InlinePragInfo = Activation
Tells when the inlining is active. When it is active the thing may be inlined, depending on how big it is. If there was an `INLINE` pragma, then as a separate matter, the RHS will have been made to look small with a Core inline Note The default `InlinePragInfo` is `AlwaysActive`, so the info serves entirely as a way to inhibit inlining until we want it
inlinePragInfo :: IdInfo -> InlinePragInfo
Any inline pragma atached to the `Id`
setInlinePragInfo :: IdInfo -> InlinePragInfo -> IdInfo
The OccInfo type
data OccInfo

Identifier occurrence information
Constructors

NoOccInfo | There are many occurrences, or unknown occurences
IAmDead | Marks unused variables. Sometimes useful for lambda and case-bound variables.
OneOcc !InsideLam !OneBranch !InterestingCxt | Occurs exactly once, not inside a rule
IAmALoopBreaker !RulesOnly | This identifier breaks a loop of mutually recursive functions. The field marks whether it is only a loop breaker due to a reference in a rule

Instances

Show OccInfo
Outputable OccInfo

isFragileOcc :: OccInfo -> Bool
isDeadOcc :: OccInfo -> Bool
isLoopBreaker :: OccInfo -> Bool
occInfo :: IdInfo -> OccInfo
How the `Id` occurs in the program
setOccInfo :: IdInfo -> OccInfo -> IdInfo
type InsideLam = Bool
type OneBranch = Bool
insideLam :: InsideLam
notInsideLam :: InsideLam
oneBranch :: OneBranch
notOneBranch :: OneBranch
The SpecInfo type
data SpecInfo

Records the specializations of this `Id` that we know about in the form of rewrite `CoreRule`s that target them
Constructors

SpecInfo [CoreRule] VarSet |

isEmptySpecInfo :: SpecInfo -> Bool
specInfoFreeVars :: SpecInfo -> VarSet
Retrieve the locally-defined free variables of both the left and right hand sides of the specialization rules
specInfoRules :: SpecInfo -> [CoreRule]
seqSpecInfo :: SpecInfo -> ()
setSpecInfoHead :: Name -> SpecInfo -> SpecInfo
Change the name of the function the rule is keyed on on all of the `CoreRule`s
specInfo :: IdInfo -> SpecInfo
Specialisations of the `Id`s function which exist
setSpecInfo :: IdInfo -> SpecInfo -> IdInfo
The CAFInfo type
data CafInfo

Records whether an `Id` makes Constant Applicative Form references
Constructors

MayHaveCafRefs | Indicates that the `Id` is for either: 1. A function or static constructor that refers to one or more CAFs, or 2. A real live CAF
NoCafRefs | A function or static constructor that refers to no CAFs.

ppCafInfo :: CafInfo -> SDoc
mayHaveCafRefs :: CafInfo -> Bool
cafInfo :: IdInfo -> CafInfo
`Id` CAF info
setCafInfo :: IdInfo -> CafInfo -> IdInfo
The LBVarInfo type
data LBVarInfo

If the `Id` is a lambda-bound variable then it may have lambda-bound variable info. Sometimes we know whether the lambda binding this variable is a "one-shot" lambda; that is, whether it is applied at most once. This information may be useful in optimisation, as computations may safely be floated inside such a lambda without risk of duplicating work.
Constructors

NoLBVarInfo | No information
IsOneShotLambda | The lambda is applied at most once).

Instances

Show LBVarInfo
Outputable LBVarInfo

noLBVarInfo :: LBVarInfo
It is always safe to assume that an `Id` has no lambda-bound variable information
hasNoLBVarInfo :: LBVarInfo -> Bool
lbvarInfo :: IdInfo -> LBVarInfo
Info about a lambda-bound variable, if the `Id` is one
setLBVarInfo :: IdInfo -> LBVarInfo -> IdInfo
Tick-box Info
data TickBoxOp

Tick box for Hpc-style coverage
Constructors

TickBox Module !TickBoxId |

Instances

Outputable TickBoxOp

type TickBoxId = Int
Produced by Haddock version 2.4.2