ghc-9.6.3: The GHC API

Safe Haskell | Safe-Inferred
Language | Haskell2010

GHC.Types.Id.Info

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 RuleInfo type
  - The CAFInfo type
  - The LambdaFormInfo type
  - Tick-box Info

Synopsis

- data IdDetails
  - = VanillaId
  - | RecSelId {
    - sel_tycon :: RecSelParent
    - sel_naughty :: Bool
    }
  - | DataConWorkId DataCon
  - | DataConWrapId DataCon
  - | ClassOpId Class
  - | PrimOpId PrimOp Bool
  - | FCallId ForeignCall
  - | TickBoxOpId TickBoxOp
  - | DFunId Bool
  - | CoVarId
  - | JoinId JoinArity (Maybe [CbvMark])
  - | WorkerLikeId [CbvMark]
- pprIdDetails :: IdDetails -> SDoc
- coVarDetails :: IdDetails
- isCoVarDetails :: IdDetails -> Bool
- type JoinArity = Int
- isJoinIdDetails_maybe :: IdDetails -> Maybe (JoinArity, Maybe [CbvMark])
- data RecSelParent
  - = RecSelData TyCon
  - | RecSelPatSyn PatSyn
- data IdInfo
- vanillaIdInfo :: IdInfo
- noCafIdInfo :: IdInfo
- data OneShotInfo
  - = NoOneShotInfo
  - | 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
- zapUsageEnvInfo :: IdInfo -> Maybe IdInfo
- zapUsedOnceInfo :: IdInfo -> Maybe IdInfo
- zapTailCallInfo :: IdInfo -> Maybe IdInfo
- zapCallArityInfo :: IdInfo -> IdInfo
- trimUnfolding :: Unfolding -> Unfolding
- type ArityInfo = Arity
- unknownArity :: Arity
- arityInfo :: IdInfo -> ArityInfo
- setArityInfo :: IdInfo -> ArityInfo -> IdInfo
- ppArityInfo :: Int -> SDoc
- callArityInfo :: IdInfo -> ArityInfo
- setCallArityInfo :: IdInfo -> ArityInfo -> IdInfo
- dmdSigInfo :: IdInfo -> DmdSig
- setDmdSigInfo :: IdInfo -> DmdSig -> IdInfo
- cprSigInfo :: IdInfo -> CprSig
- setCprSigInfo :: IdInfo -> CprSig -> IdInfo
- demandInfo :: IdInfo -> Demand
- setDemandInfo :: IdInfo -> Demand -> IdInfo
- pprStrictness :: DmdSig -> SDoc
- realUnfoldingInfo :: IdInfo -> Unfolding
- unfoldingInfo :: IdInfo -> Unfolding
- setUnfoldingInfo :: IdInfo -> Unfolding -> IdInfo
- hasInlineUnfolding :: IdInfo -> Bool
- type InlinePragInfo = InlinePragma
- inlinePragInfo :: IdInfo -> InlinePragma
- setInlinePragInfo :: IdInfo -> InlinePragma -> IdInfo
- data OccInfo
  - = ManyOccs {
    - occ_tail :: !TailCallInfo
    }
  - | IAmDead
  - | OneOcc {
    - occ_in_lam :: !InsideLam
    - occ_n_br :: !BranchCount
    - occ_int_cxt :: !InterestingCxt
    - occ_tail :: !TailCallInfo
    }
  - | IAmALoopBreaker {
    - occ_rules_only :: !RulesOnly
    - occ_tail :: !TailCallInfo
    }
- isDeadOcc :: OccInfo -> Bool
- isStrongLoopBreaker :: OccInfo -> Bool
- isWeakLoopBreaker :: OccInfo -> Bool
- occInfo :: IdInfo -> OccInfo
- setOccInfo :: IdInfo -> OccInfo -> IdInfo
- data InsideLam
  - = IsInsideLam
  - | NotInsideLam
- type BranchCount = Int
- data TailCallInfo
  - = AlwaysTailCalled JoinArity
  - | NoTailCallInfo
- tailCallInfo :: OccInfo -> TailCallInfo
- isAlwaysTailCalled :: OccInfo -> Bool
- data RuleInfo = RuleInfo [CoreRule] DVarSet
- emptyRuleInfo :: RuleInfo
- isEmptyRuleInfo :: RuleInfo -> Bool
- ruleInfoFreeVars :: RuleInfo -> DVarSet
- ruleInfoRules :: RuleInfo -> [CoreRule]
- setRuleInfoHead :: Name -> RuleInfo -> RuleInfo
- ruleInfo :: IdInfo -> RuleInfo
- setRuleInfo :: IdInfo -> RuleInfo -> IdInfo
- tagSigInfo :: IdInfo -> Maybe TagSig
- data CafInfo
  - = MayHaveCafRefs
  - | NoCafRefs
- ppCafInfo :: CafInfo -> SDoc
- mayHaveCafRefs :: CafInfo -> Bool
- cafInfo :: IdInfo -> CafInfo
- setCafInfo :: IdInfo -> CafInfo -> IdInfo
- data LambdaFormInfo
- lfInfo :: IdInfo -> Maybe LambdaFormInfo
- setLFInfo :: IdInfo -> LambdaFormInfo -> IdInfo
- setTagSig :: IdInfo -> TagSig -> IdInfo
- tagSig :: IdInfo -> Maybe TagSig
- data TickBoxOp = TickBox Module !TickBoxId
- type TickBoxId = Int

# The IdDetails type

data IdDetails Source #

Identifier Details

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 :: RecSelParent
- 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 Bool | The `Id` is for a primitive operator True = is representation-polymorphic, and hence has no binding This lev-poly flag is used only in GHC.Types.Id.hasNoBinding
FCallId ForeignCall | The `Id` is for a foreign call. Type will be simple: no type families, newtypes, etc
TickBoxOpId TickBoxOp | The `Id` is for a HPC tick box (both traditional and binary)
DFunId Bool | A dictionary function. 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
CoVarId | A coercion variable This only covers un-lifted coercions, of type (t1 ~# t2) or (t1 ~R# t2), not their lifted variants
JoinId JoinArity (Maybe [CbvMark]) | An `Id` for a join point taking n arguments Note [Join points] in GHC.Core Can also work as a WorkerLikeId if given `CbvMark`s. See Note [CBV Function Ids] The [CbvMark] is always empty (and ignored) until after Tidy.
WorkerLikeId [CbvMark] | An `Id` for a worker like function, which might expect some arguments to be passed both evaluated and tagged. Worker like functions are create by W/W and SpecConstr and we can expect that they aren't used unapplied. See Note [CBV Function Ids] See Note [Tag Inference] The [CbvMark] is always empty (and ignored) until after Tidy for ids from the current module.

#### Instances

Instances details

Outputable IdDetails Source # |
Instance details Defined in GHC.Types.Id.Info Methods ppr :: IdDetails -> SDoc Source #

pprIdDetails :: IdDetails -> SDoc Source #

coVarDetails :: IdDetails Source #

Just a synonym for `CoVarId`. Written separately so it can be exported in the hs-boot file.

isCoVarDetails :: IdDetails -> Bool Source #

Check if an `IdDetails` says `CoVarId`.

type JoinArity = Int Source #

The number of arguments that a join point takes. Unlike the arity of a function, this is a purely syntactic property and is fixed when the join point is created (or converted from a value). Both type and value arguments are counted.

isJoinIdDetails_maybe :: IdDetails -> Maybe (JoinArity, Maybe [CbvMark]) Source #

data RecSelParent Source #

Recursive Selector Parent

Constructors

RecSelData TyCon |
RecSelPatSyn PatSyn |

#### Instances

Instances details

Outputable RecSelParent Source # |
Instance details Defined in GHC.Types.Id.Info Methods ppr :: RecSelParent -> SDoc Source #
Eq RecSelParent Source # |
Instance details Defined in GHC.Types.Id.Info Methods (==) :: RecSelParent -> RecSelParent -> Bool # (/=) :: RecSelParent -> RecSelParent -> Bool #

# The IdInfo type

data IdInfo Source #

Identifier Information

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.

Most of the `IdInfo` gives information about the value, or definition, of the `Id`, independent of its usage. Exceptions to this are `demandInfo`, `occInfo`, `oneShotInfo` and `callArityInfo`.

Performance note: when we update `IdInfo`, we have to reallocate this entire record, so it is a good idea not to let this data structure get too big.

#### Instances

Instances details

Outputable IdInfo Source # |
Instance details Defined in GHC.Core.Ppr Methods ppr :: IdInfo -> SDoc Source #

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

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

See also Note [OneShotInfo overview] above.

Constructors

NoOneShotInfo | No information
OneShotLam | The lambda is applied at most once.

#### Instances

Instances details

Outputable OneShotInfo Source # |
Instance details Defined in GHC.Types.Basic Methods ppr :: OneShotInfo -> SDoc Source #
Eq OneShotInfo Source # |
Instance details Defined in GHC.Types.Basic Methods (==) :: OneShotInfo -> OneShotInfo -> Bool # (/=) :: OneShotInfo -> OneShotInfo -> Bool #

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

hasNoOneShotInfo :: OneShotInfo -> Bool Source #

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

## 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 all demand info on the `IdInfo`

zapUsageInfo :: IdInfo -> Maybe IdInfo Source #

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

zapUsageEnvInfo :: IdInfo -> Maybe IdInfo Source #

Remove usage environment info from the strictness signature on the `IdInfo`

zapUsedOnceInfo :: IdInfo -> Maybe IdInfo Source #

zapTailCallInfo :: IdInfo -> Maybe IdInfo Source #

zapCallArityInfo :: IdInfo -> IdInfo Source #

trimUnfolding :: Unfolding -> Unfolding Source #

## The ArityInfo type

type ArityInfo = Arity Source #

Arity Information

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.

Invariant: the `Arity` of an `Id` must never exceed the number of value arguments that appear in the type of the `Id`. See Note [Arity and function types].

unknownArity :: Arity Source #

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

arityInfo :: IdInfo -> ArityInfo Source #

`Id` arity, as computed by GHC.Core.Opt.Arity. Specifies how many arguments this `Id` has to be applied to before it does any meaningful work.

setArityInfo :: IdInfo -> ArityInfo -> IdInfo infixl 1 Source #

ppArityInfo :: Int -> SDoc Source #

callArityInfo :: IdInfo -> ArityInfo Source #

How this is called. This is the number of arguments to which a binding can be eta-expanded without losing any sharing. n = all calls have at least n arguments

setCallArityInfo :: IdInfo -> ArityInfo -> IdInfo Source #

## Demand and strictness Info

dmdSigInfo :: IdInfo -> DmdSig Source #

A strictness signature. Describes how a function uses its arguments See Note [idArity varies independently of dmdTypeDepth] in GHC.Core.Opt.DmdAnal

setDmdSigInfo :: IdInfo -> DmdSig -> IdInfo infixl 1 Source #

cprSigInfo :: IdInfo -> CprSig Source #

Information on whether the function will ultimately return a freshly allocated constructor.

setCprSigInfo :: IdInfo -> CprSig -> IdInfo infixl 1 Source #

demandInfo :: IdInfo -> Demand Source #

ID demand information

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

pprStrictness :: DmdSig -> SDoc Source #

## Unfolding Info

realUnfoldingInfo :: IdInfo -> Unfolding Source #

The `Id`s unfolding

unfoldingInfo :: IdInfo -> Unfolding Source #

Essentially returns the `realUnfoldingInfo` field, but does not expose the unfolding of a strong loop breaker.

This is the right thing to call if you plan to decide whether an unfolding will inline.

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

hasInlineUnfolding :: IdInfo -> Bool Source #

True of a non-loop-breaker Id that has a stable unfolding that is (a) always inlined; that is, with an `UnfWhen` guidance, or (b) a DFunUnfolding which never needs to be inlined

## The InlinePragInfo type

type InlinePragInfo = InlinePragma Source #

Inline Pragma Information

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 attached to the `Id`

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

## The OccInfo type

data OccInfo Source #

identifier Occurrence Information

Constructors

ManyOccs | There are many occurrences, or unknown occurrences

Fields

- occ_tail :: !TailCallInfo

IAmDead | Marks unused variables. Sometimes useful for lambda and case-bound variables.
OneOcc | Occurs exactly once (per branch), not inside a rule

Fields

- occ_in_lam :: !InsideLam
- occ_n_br :: !BranchCount
- occ_int_cxt :: !InterestingCxt
- occ_tail :: !TailCallInfo

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

Fields

- occ_rules_only :: !RulesOnly
- occ_tail :: !TailCallInfo

#### Instances

Instances details

Outputable OccInfo Source # |
Instance details Defined in GHC.Types.Basic Methods ppr :: OccInfo -> SDoc Source #
Eq OccInfo Source # |
Instance details Defined in GHC.Types.Basic Methods (==) :: OccInfo -> OccInfo -> Bool # (/=) :: OccInfo -> OccInfo -> Bool #

isDeadOcc :: OccInfo -> Bool Source #

isStrongLoopBreaker :: OccInfo -> Bool Source #

isWeakLoopBreaker :: OccInfo -> Bool Source #

occInfo :: IdInfo -> OccInfo Source #

How the `Id` occurs in the program

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

data InsideLam Source #

Inside Lambda

Constructors

IsInsideLam | Occurs inside a non-linear lambda Substituting a redex for this occurrence is dangerous because it might duplicate work.
NotInsideLam |

#### Instances

Instances details

Monoid InsideLam Source # |
Instance details Defined in GHC.Types.Basic Methods mempty :: InsideLam Source # mappend :: InsideLam -> InsideLam -> InsideLam Source # mconcat :: [InsideLam] -> InsideLam Source #
Semigroup InsideLam Source # | If any occurrence of an identifier is inside a lambda, then the occurrence info of that identifier marks it as occurring inside a lambda
Instance details Defined in GHC.Types.Basic Methods (<>) :: InsideLam -> InsideLam -> InsideLam Source # sconcat :: NonEmpty InsideLam -> InsideLam Source # stimes :: Integral b => b -> InsideLam -> InsideLam Source #
Eq InsideLam Source # |
Instance details Defined in GHC.Types.Basic Methods (==) :: InsideLam -> InsideLam -> Bool # (/=) :: InsideLam -> InsideLam -> Bool #

type BranchCount = Int Source #

data TailCallInfo Source #

Constructors

AlwaysTailCalled JoinArity |
NoTailCallInfo |

#### Instances

Instances details

Outputable TailCallInfo Source # |
Instance details Defined in GHC.Types.Basic Methods ppr :: TailCallInfo -> SDoc Source #
Eq TailCallInfo Source # |
Instance details Defined in GHC.Types.Basic Methods (==) :: TailCallInfo -> TailCallInfo -> Bool # (/=) :: TailCallInfo -> TailCallInfo -> Bool #

tailCallInfo :: OccInfo -> TailCallInfo Source #

isAlwaysTailCalled :: OccInfo -> Bool Source #

## The RuleInfo type

data RuleInfo Source #

Rule Information

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

Constructors

RuleInfo [CoreRule] DVarSet |

emptyRuleInfo :: RuleInfo Source #

Assume that no specializations exist: always safe

isEmptyRuleInfo :: RuleInfo -> Bool Source #

ruleInfoFreeVars :: RuleInfo -> DVarSet Source #

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

ruleInfoRules :: RuleInfo -> [CoreRule] Source #

setRuleInfoHead :: Name -> RuleInfo -> RuleInfo Source #

Change the name of the function the rule is keyed on all of the `CoreRule`s

ruleInfo :: IdInfo -> RuleInfo Source #

Specialisations of the `Id`s function which exist. See Note [Specialisations and RULES in IdInfo]

setRuleInfo :: IdInfo -> RuleInfo -> IdInfo infixl 1 Source #

tagSigInfo :: IdInfo -> Maybe TagSig Source #

## The CAFInfo type

data CafInfo Source #

Constant applicative form Information

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

Instances details

Outputable CafInfo Source # |
Instance details Defined in GHC.Types.Id.Info Methods ppr :: CafInfo -> SDoc Source #
Eq CafInfo Source # |
Instance details Defined in GHC.Types.Id.Info Methods (==) :: CafInfo -> CafInfo -> Bool # (/=) :: CafInfo -> CafInfo -> Bool #
Ord CafInfo Source # |
Instance details Defined in GHC.Types.Id.Info Methods compare :: CafInfo -> CafInfo -> Ordering # (<) :: CafInfo -> CafInfo -> Bool # (<=) :: CafInfo -> CafInfo -> Bool # (>) :: CafInfo -> CafInfo -> Bool # (>=) :: CafInfo -> CafInfo -> Bool # max :: CafInfo -> CafInfo -> CafInfo # min :: CafInfo -> CafInfo -> CafInfo #

ppCafInfo :: CafInfo -> SDoc Source #

mayHaveCafRefs :: CafInfo -> Bool Source #

cafInfo :: IdInfo -> CafInfo Source #

`Id` CAF info

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

## The LambdaFormInfo type

data LambdaFormInfo Source #

Information about an identifier, from the code generator's point of view. Every identifier is bound to a LambdaFormInfo in the environment, which gives the code generator enough info to be able to tail call or return that identifier.

#### Instances

Instances details

Outputable LambdaFormInfo Source # |
Instance details Defined in GHC.StgToCmm.Types Methods ppr :: LambdaFormInfo -> SDoc Source #

lfInfo :: IdInfo -> Maybe LambdaFormInfo Source #

See Note [The LFInfo of Imported Ids] in GHC.StgToCmm.Closure

setLFInfo :: IdInfo -> LambdaFormInfo -> IdInfo Source #

setTagSig :: IdInfo -> TagSig -> IdInfo Source #

tagSig :: IdInfo -> Maybe TagSig Source #

## Tick-box Info

data TickBoxOp Source #

Tick box for Hpc-style coverage

Constructors

TickBox Module !TickBoxId |

#### Instances

Instances details

Outputable TickBoxOp Source # |
Instance details Defined in GHC.Types.Id.Info Methods ppr :: TickBoxOp -> SDoc Source #

type TickBoxId = Int Source #