ghc-7.8.4: The GHC API

Safe HaskellNone
LanguageHaskell98

IdInfo

Contents

Synopsis

The IdDetails type

data IdDetails Source

The IdDetails of an Id give stable, and necessary, information about the Id.

Constructors

VanillaId 
RecSelId

The Id for a record selector

Fields

sel_tycon :: TyCon

For a data type family, this is the instance TyCon not the family TyCon

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 a superclass selector or class 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)

DFunId Int Bool

A dictionary function. Int = the number of "silent" arguments to the dfun e.g. class D a => C a where ... instance C a => C [a] has is_silent = 1, because the dfun has type dfun :: (D a, C a) => C [a] See Note [Silent superclass arguments] in TcInstDcls

Bool = True = the class has only one method, so may be implemented with a newtype, so it might be bad to be strict on this dictionary

The IdInfo type

data IdInfo Source

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 Ids 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 oneShotInfo.

vanillaIdInfo :: IdInfo Source

Basic IdInfo that carries no useful information whatsoever

noCafIdInfo :: IdInfo Source

More informative IdInfo we can use when we know the Id has no CAF references

seqIdInfo :: IdInfo -> () Source

Just evaluate the IdInfo to WHNF

megaSeqIdInfo :: IdInfo -> () Source

Evaluate all the fields of the IdInfo that are generally demanded by the compiler

The OneShotInfo type

data OneShotInfo Source

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

NoOneShotInfo

No information

ProbOneShot

The lambda is probably applied at most once

OneShotLam

The lambda is applied at most once.

oneShotInfo :: IdInfo -> OneShotInfo Source

Info about a lambda-bound variable, if the Id is one

noOneShotInfo :: OneShotInfo Source

It is always safe to assume that an Id has no lambda-bound variable information

Zapping various forms of Info

zapLamInfo :: IdInfo -> Maybe IdInfo Source

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

zapFragileInfo :: IdInfo -> Maybe IdInfo Source

Zap info that depends on free variables

zapDemandInfo :: IdInfo -> Maybe IdInfo Source

Remove demand info on the IdInfo if it is present, otherwise return Nothing

The ArityInfo type

type ArityInfo = Arity Source

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 Source

It is always safe to assume that an Id has an arity of 0

Demand and strictness Info

demandInfo :: IdInfo -> Demand Source

ID demand information

Unfolding Info

unfoldingInfo :: IdInfo -> Unfolding Source

The Ids unfolding

The InlinePragInfo type

type InlinePragInfo = InlinePragma Source

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 -> InlinePragma Source

Any inline pragma atached to the Id

The OccInfo type

data OccInfo Source

Identifier occurrence information

Constructors

NoOccInfo

There are many occurrences, or unknown occurrences

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

occInfo :: IdInfo -> OccInfo Source

How the Id occurs in the program

The SpecInfo type

data SpecInfo Source

Records the specializations of this Id that we know about in the form of rewrite CoreRules that target them

Constructors

SpecInfo [CoreRule] VarSet 

emptySpecInfo :: SpecInfo Source

Assume that no specilizations exist: always safe

specInfoFreeVars :: SpecInfo -> VarSet Source

Retrieve the locally-defined free variables of both the left and right hand sides of the specialization rules

setSpecInfoHead :: Name -> SpecInfo -> SpecInfo Source

Change the name of the function the rule is keyed on on all of the CoreRules

specInfo :: IdInfo -> SpecInfo Source

Specialisations of the Ids function which exist See Note [Specialisations and RULES in IdInfo]

The CAFInfo type

data CafInfo Source

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.

cafInfo :: IdInfo -> CafInfo Source

Id CAF info

Tick-box Info

data TickBoxOp Source

Tick box for Hpc-style coverage

Constructors

TickBox Module !TickBoxId