ghc-7.10.3: The GHC API

Safe Haskell | None
Language | Haskell2010

IdInfo

Contents

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

Synopsis

- data IdDetails
  - = VanillaId
  - | RecSelId {
    - sel_tycon :: TyCon
    - sel_naughty :: Bool
    }
  - | DataConWorkId DataCon
  - | DataConWrapId DataCon
  - | ClassOpId Class
  - | PrimOpId PrimOp
  - | FCallId ForeignCall
  - | TickBoxOpId TickBoxOp
  - | DFunId Int Bool
- pprIdDetails :: IdDetails -> SDoc
- coVarDetails :: IdDetails
- data IdInfo
- vanillaIdInfo :: IdInfo
- noCafIdInfo :: IdInfo
- seqIdInfo :: IdInfo -> ()
- megaSeqIdInfo :: IdInfo -> ()
- data OneShotInfo
  - = NoOneShotInfo
  - | ProbOneShot
  - | OneShotLam
- oneShotInfo :: IdInfo -> OneShotInfo
- noOneShotInfo :: OneShotInfo
- hasNoOneShotInfo :: OneShotInfo -> Bool
- setOneShotInfo :: IdInfo -> OneShotInfo -> IdInfo
- zapLamInfo :: IdInfo -> Maybe IdInfo
- zapFragileInfo :: IdInfo -> Maybe IdInfo
- zapDemandInfo :: IdInfo -> Maybe IdInfo
- zapUsageInfo :: IdInfo -> Maybe IdInfo
- type ArityInfo = Arity
- unknownArity :: Arity
- arityInfo :: IdInfo -> ArityInfo
- setArityInfo :: IdInfo -> ArityInfo -> IdInfo
- ppArityInfo :: Int -> SDoc
- callArityInfo :: IdInfo -> ArityInfo
- setCallArityInfo :: IdInfo -> ArityInfo -> IdInfo
- strictnessInfo :: IdInfo -> StrictSig
- setStrictnessInfo :: IdInfo -> StrictSig -> IdInfo
- demandInfo :: IdInfo -> Demand
- setDemandInfo :: IdInfo -> Demand -> IdInfo
- pprStrictness :: StrictSig -> SDoc
- unfoldingInfo :: IdInfo -> Unfolding
- setUnfoldingInfo :: IdInfo -> Unfolding -> IdInfo
- setUnfoldingInfoLazily :: IdInfo -> Unfolding -> IdInfo
- type InlinePragInfo = InlinePragma
- inlinePragInfo :: IdInfo -> InlinePragma
- setInlinePragInfo :: IdInfo -> InlinePragma -> IdInfo
- data OccInfo
  - = NoOccInfo
  - | IAmDead
  - | OneOcc !InsideLam !OneBranch !InterestingCxt
  - | IAmALoopBreaker !RulesOnly
- isDeadOcc :: OccInfo -> Bool
- isStrongLoopBreaker :: OccInfo -> Bool
- isWeakLoopBreaker :: 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
- emptySpecInfo :: SpecInfo
- 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 TickBoxOp = TickBox Module !TickBoxId
- type TickBoxId = Int

# The IdDetails type

data IdDetails

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

Instances

Outputable IdDetails |

pprIdDetails :: IdDetails -> SDoc

coVarDetails :: IdDetails

# 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 `oneShotInfo`.

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

## The OneShotInfo type

data OneShotInfo

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 See Note [Computing one-shot info, and ProbOneShot] in OccurAnl
OneShotLam | The lambda is applied at most once.

Instances

Eq OneShotInfo |
Outputable OneShotInfo |

oneShotInfo :: IdInfo -> OneShotInfo

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

noOneShotInfo :: OneShotInfo

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

hasNoOneShotInfo :: OneShotInfo -> Bool

setOneShotInfo :: IdInfo -> OneShotInfo -> IdInfo infixl 1

## 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

zapFragileInfo :: IdInfo -> Maybe IdInfo

Zap info that depends on free variables

zapDemandInfo :: IdInfo -> Maybe IdInfo

Remove all demand info on the `IdInfo`

zapUsageInfo :: IdInfo -> Maybe IdInfo

Remove usage (but not strictness) info on the `IdInfo`

## 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 infixl 1

ppArityInfo :: Int -> SDoc

callArityInfo :: IdInfo -> ArityInfo

How this is called. n = all calls have at least n arguments

setCallArityInfo :: IdInfo -> ArityInfo -> IdInfo

## Demand and strictness Info

strictnessInfo :: IdInfo -> StrictSig

setStrictnessInfo :: IdInfo -> StrictSig -> IdInfo infixl 1

demandInfo :: IdInfo -> Demand

ID demand information

setDemandInfo :: IdInfo -> Demand -> IdInfo infixl 1

pprStrictness :: StrictSig -> SDoc

## Unfolding Info

unfoldingInfo :: IdInfo -> Unfolding

The `Id`s unfolding

setUnfoldingInfo :: IdInfo -> Unfolding -> IdInfo infixl 1

setUnfoldingInfoLazily :: IdInfo -> Unfolding -> IdInfo

## The InlinePragInfo type

type InlinePragInfo = InlinePragma

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

Any inline pragma atached to the `Id`

setInlinePragInfo :: IdInfo -> InlinePragma -> IdInfo infixl 1

## The OccInfo type

data OccInfo

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

Eq OccInfo |
Outputable OccInfo |

isDeadOcc :: OccInfo -> Bool

isStrongLoopBreaker :: OccInfo -> Bool

isWeakLoopBreaker :: OccInfo -> Bool

occInfo :: IdInfo -> OccInfo

How the `Id` occurs in the program

setOccInfo :: IdInfo -> OccInfo -> IdInfo infixl 1

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 |

emptySpecInfo :: SpecInfo

Assume that no specilizations exist: always safe

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 See Note [Specialisations and RULES in IdInfo]

setSpecInfo :: IdInfo -> SpecInfo -> IdInfo infixl 1

## 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.

Instances

Eq CafInfo |
Ord CafInfo |
Outputable CafInfo |

ppCafInfo :: CafInfo -> SDoc

mayHaveCafRefs :: CafInfo -> Bool

cafInfo :: IdInfo -> CafInfo

`Id` CAF info

setCafInfo :: IdInfo -> CafInfo -> IdInfo infixl 1

## Tick-box Info

data TickBoxOp

Tick box for Hpc-style coverage

Constructors

TickBox Module !TickBoxId |

Instances

Outputable TickBoxOp |

type TickBoxId = Int