Safe Haskell | None |
---|---|
Language | Haskell2010 |
- data IdDetails
- pprIdDetails :: IdDetails -> SDoc
- coVarDetails :: IdDetails
- isCoVarDetails :: IdDetails -> Bool
- data RecSelParent
- data IdInfo
- vanillaIdInfo :: IdInfo
- noCafIdInfo :: IdInfo
- data OneShotInfo
- 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 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
- data CafInfo
- ppCafInfo :: CafInfo -> SDoc
- mayHaveCafRefs :: CafInfo -> Bool
- cafInfo :: IdInfo -> CafInfo
- setCafInfo :: IdInfo -> CafInfo -> IdInfo
- data TickBoxOp = TickBox Module !TickBoxId
- type TickBoxId = Int
The IdDetails type
The IdDetails
of an Id
give stable, and necessary,
information about the Id.
VanillaId | |
RecSelId | The |
| |
DataConWorkId DataCon | The |
DataConWrapId DataCon | The |
ClassOpId Class | The |
PrimOpId PrimOp | The |
FCallId ForeignCall | The |
TickBoxOpId TickBoxOp | The |
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), not their lifted variants |
pprIdDetails :: IdDetails -> SDoc Source #
coVarDetails :: IdDetails Source #
Just a synonym for CoVarId
. Written separately so it can be
exported in the hs-boot file.
data RecSelParent Source #
The IdInfo type
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
.
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.
NoOneShotInfo | No information |
ProbOneShot | The lambda is probably applied at most once See Note [Computing one-shot info, and ProbOneShot] in Demand |
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
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
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
ppArityInfo :: Int -> SDoc Source #
callArityInfo :: IdInfo -> ArityInfo Source #
How this is called. n = all calls have at least n arguments
Demand and strictness Info
strictnessInfo :: IdInfo -> StrictSig Source #
demandInfo :: IdInfo -> Demand Source #
ID demand information
pprStrictness :: StrictSig -> SDoc Source #
Unfolding Info
unfoldingInfo :: IdInfo -> Unfolding Source #
The Id
s 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
setInlinePragInfo :: IdInfo -> InlinePragma -> IdInfo infixl 1 Source #
The OccInfo type
Identifier occurrence information
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 |
isStrongLoopBreaker :: OccInfo -> Bool Source #
isWeakLoopBreaker :: OccInfo -> Bool Source #
The RuleInfo type
Records the specializations of this Id
that we know about
in the form of rewrite CoreRule
s that target them
emptyRuleInfo :: RuleInfo Source #
Assume that no specilizations 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 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]
The CAFInfo type
Records whether an Id
makes Constant Applicative Form references
MayHaveCafRefs | Indicates that the
|
NoCafRefs | A function or static constructor that refers to no CAFs. |
mayHaveCafRefs :: CafInfo -> Bool Source #
Tick-box Info
Tick box for Hpc-style coverage