{-# LANGUAGE CPP #-}
module Id (
Var, Id, isId,
InVar, InId,
OutVar, OutId,
mkGlobalId, mkVanillaGlobal, mkVanillaGlobalWithInfo,
mkLocalId, mkLocalCoVar, mkLocalIdOrCoVar,
mkLocalIdOrCoVarWithInfo,
mkLocalIdWithInfo, mkExportedLocalId, mkExportedVanillaId,
mkSysLocal, mkSysLocalM, mkSysLocalOrCoVar, mkSysLocalOrCoVarM,
mkUserLocal, mkUserLocalOrCoVar,
mkTemplateLocals, mkTemplateLocalsNum, mkTemplateLocal,
mkWorkerId,
idName, idType, idUnique, idInfo, idDetails,
recordSelectorTyCon,
setIdName, setIdUnique, Id.setIdType,
setIdExported, setIdNotExported,
globaliseId, localiseId,
setIdInfo, lazySetIdInfo, modifyIdInfo, maybeModifyIdInfo,
zapLamIdInfo, zapIdDemandInfo, zapIdUsageInfo, zapIdUsageEnvInfo,
zapIdUsedOnceInfo, zapIdTailCallInfo,
zapFragileIdInfo, zapIdStrictness, zapStableUnfolding,
transferPolyIdInfo,
isImplicitId, isDeadBinder,
isStrictId,
isExportedId, isLocalId, isGlobalId,
isRecordSelector, isNaughtyRecordSelector,
isPatSynRecordSelector,
isDataConRecordSelector,
isClassOpId_maybe, isDFunId,
isPrimOpId, isPrimOpId_maybe,
isFCallId, isFCallId_maybe,
isDataConWorkId, isDataConWorkId_maybe,
isDataConWrapId, isDataConWrapId_maybe,
isDataConId_maybe,
idDataCon,
isConLikeId, isBottomingId, idIsFrom,
hasNoBinding,
JoinId, isJoinId, isJoinId_maybe, idJoinArity,
asJoinId, asJoinId_maybe, zapJoinId,
idInlinePragma, setInlinePragma, modifyInlinePragma,
idInlineActivation, setInlineActivation, idRuleMatchInfo,
isOneShotBndr, isProbablyOneShotLambda,
setOneShotLambda, clearOneShotLambda,
updOneShotInfo, setIdOneShotInfo,
isStateHackType, stateHackOneShot, typeOneShot,
idArity,
idCallArity, idFunRepArity,
idUnfolding, realIdUnfolding,
idSpecialisation, idCoreRules, idHasRules,
idCafInfo,
idOneShotInfo, idStateHackOneShotInfo,
idOccInfo,
isNeverLevPolyId,
setIdUnfolding, setCaseBndrEvald,
setIdArity,
setIdCallArity,
setIdSpecialisation,
setIdCafInfo,
setIdOccInfo, zapIdOccInfo,
setIdDemandInfo,
setIdStrictness,
idDemandInfo,
idStrictness,
) where
#include "GhclibHsVersions.h"
import GhcPrelude
import DynFlags
import CoreSyn ( CoreRule, isStableUnfolding, evaldUnfolding,
isCompulsoryUnfolding, Unfolding( NoUnfolding ) )
import IdInfo
import BasicTypes
import Var( Id, CoVar, JoinId,
InId, InVar,
OutId, OutVar,
idInfo, idDetails, setIdDetails, globaliseId, varType,
isId, isLocalId, isGlobalId, isExportedId )
import qualified Var
import Type
import RepType
import TysPrim
import DataCon
import Demand
import Name
import Module
import Class
import {-# SOURCE #-} PrimOp (PrimOp)
import ForeignCall
import Maybes
import SrcLoc
import Outputable
import Unique
import UniqSupply
import FastString
import Util
infixl 1 `setIdUnfolding`,
`setIdArity`,
`setIdCallArity`,
`setIdOccInfo`,
`setIdOneShotInfo`,
`setIdSpecialisation`,
`setInlinePragma`,
`setInlineActivation`,
`idCafInfo`,
`setIdDemandInfo`,
`setIdStrictness`,
`asJoinId`,
`asJoinId_maybe`
idName :: Id -> Name
idName :: Id -> Name
idName = Id -> Name
Var.varName
idUnique :: Id -> Unique
idUnique :: Id -> Unique
idUnique = Id -> Unique
Var.varUnique
idType :: Id -> Kind
idType :: Id -> Kind
idType = Id -> Kind
Var.varType
setIdName :: Id -> Name -> Id
setIdName :: Id -> Name -> Id
setIdName = Id -> Name -> Id
Var.setVarName
setIdUnique :: Id -> Unique -> Id
setIdUnique :: Id -> Unique -> Id
setIdUnique = Id -> Unique -> Id
Var.setVarUnique
setIdType :: Id -> Type -> Id
setIdType :: Id -> Kind -> Id
setIdType Id
id Kind
ty = Kind -> ()
seqType Kind
ty () -> Id -> Id
`seq` Id -> Kind -> Id
Var.setVarType Id
id Kind
ty
setIdExported :: Id -> Id
setIdExported :: Id -> Id
setIdExported = Id -> Id
Var.setIdExported
setIdNotExported :: Id -> Id
setIdNotExported :: Id -> Id
setIdNotExported = Id -> Id
Var.setIdNotExported
localiseId :: Id -> Id
localiseId :: Id -> Id
localiseId Id
id
| ASSERT( isId id ) isLocalId id && isInternalName name
= Id
id
| Bool
otherwise
= IdDetails -> Name -> Kind -> IdInfo -> Id
Var.mkLocalVar (Id -> IdDetails
idDetails Id
id) (Name -> Name
localiseName Name
name) (Id -> Kind
idType Id
id) (HasDebugCallStack => Id -> IdInfo
Id -> IdInfo
idInfo Id
id)
where
name :: Name
name = Id -> Name
idName Id
id
lazySetIdInfo :: Id -> IdInfo -> Id
lazySetIdInfo :: Id -> IdInfo -> Id
lazySetIdInfo = Id -> IdInfo -> Id
Var.lazySetIdInfo
setIdInfo :: Id -> IdInfo -> Id
setIdInfo :: Id -> IdInfo -> Id
setIdInfo Id
id IdInfo
info = IdInfo
info IdInfo -> Id -> Id
`seq` (Id -> IdInfo -> Id
lazySetIdInfo Id
id IdInfo
info)
modifyIdInfo :: HasDebugCallStack => (IdInfo -> IdInfo) -> Id -> Id
modifyIdInfo :: (IdInfo -> IdInfo) -> Id -> Id
modifyIdInfo IdInfo -> IdInfo
fn Id
id = Id -> IdInfo -> Id
setIdInfo Id
id (IdInfo -> IdInfo
fn (HasDebugCallStack => Id -> IdInfo
Id -> IdInfo
idInfo Id
id))
maybeModifyIdInfo :: Maybe IdInfo -> Id -> Id
maybeModifyIdInfo :: Maybe IdInfo -> Id -> Id
maybeModifyIdInfo (Just IdInfo
new_info) Id
id = Id -> IdInfo -> Id
lazySetIdInfo Id
id IdInfo
new_info
maybeModifyIdInfo Maybe IdInfo
Nothing Id
id = Id
id
mkGlobalId :: IdDetails -> Name -> Type -> IdInfo -> Id
mkGlobalId :: IdDetails -> Name -> Kind -> IdInfo -> Id
mkGlobalId = IdDetails -> Name -> Kind -> IdInfo -> Id
Var.mkGlobalVar
mkVanillaGlobal :: Name -> Type -> Id
mkVanillaGlobal :: Name -> Kind -> Id
mkVanillaGlobal Name
name Kind
ty = Name -> Kind -> IdInfo -> Id
mkVanillaGlobalWithInfo Name
name Kind
ty IdInfo
vanillaIdInfo
mkVanillaGlobalWithInfo :: Name -> Type -> IdInfo -> Id
mkVanillaGlobalWithInfo :: Name -> Kind -> IdInfo -> Id
mkVanillaGlobalWithInfo = IdDetails -> Name -> Kind -> IdInfo -> Id
mkGlobalId IdDetails
VanillaId
mkLocalId :: Name -> Type -> Id
mkLocalId :: Name -> Kind -> Id
mkLocalId Name
name Kind
ty = Name -> Kind -> IdInfo -> Id
mkLocalIdWithInfo Name
name Kind
ty IdInfo
vanillaIdInfo
mkLocalCoVar :: Name -> Type -> CoVar
mkLocalCoVar :: Name -> Kind -> Id
mkLocalCoVar Name
name Kind
ty
= ASSERT( isCoVarType ty )
IdDetails -> Name -> Kind -> IdInfo -> Id
Var.mkLocalVar IdDetails
CoVarId Name
name Kind
ty IdInfo
vanillaIdInfo
mkLocalIdOrCoVar :: Name -> Type -> Id
mkLocalIdOrCoVar :: Name -> Kind -> Id
mkLocalIdOrCoVar Name
name Kind
ty
| Kind -> Bool
isCoVarType Kind
ty = Name -> Kind -> Id
mkLocalCoVar Name
name Kind
ty
| Bool
otherwise = Name -> Kind -> Id
mkLocalId Name
name Kind
ty
mkLocalIdOrCoVarWithInfo :: Name -> Type -> IdInfo -> Id
mkLocalIdOrCoVarWithInfo :: Name -> Kind -> IdInfo -> Id
mkLocalIdOrCoVarWithInfo Name
name Kind
ty IdInfo
info
= IdDetails -> Name -> Kind -> IdInfo -> Id
Var.mkLocalVar IdDetails
details Name
name Kind
ty IdInfo
info
where
details :: IdDetails
details | Kind -> Bool
isCoVarType Kind
ty = IdDetails
CoVarId
| Bool
otherwise = IdDetails
VanillaId
mkLocalIdWithInfo :: Name -> Type -> IdInfo -> Id
mkLocalIdWithInfo :: Name -> Kind -> IdInfo -> Id
mkLocalIdWithInfo Name
name Kind
ty IdInfo
info = IdDetails -> Name -> Kind -> IdInfo -> Id
Var.mkLocalVar IdDetails
VanillaId Name
name Kind
ty IdInfo
info
mkExportedLocalId :: IdDetails -> Name -> Type -> Id
mkExportedLocalId :: IdDetails -> Name -> Kind -> Id
mkExportedLocalId IdDetails
details Name
name Kind
ty = IdDetails -> Name -> Kind -> IdInfo -> Id
Var.mkExportedLocalVar IdDetails
details Name
name Kind
ty IdInfo
vanillaIdInfo
mkExportedVanillaId :: Name -> Type -> Id
mkExportedVanillaId :: Name -> Kind -> Id
mkExportedVanillaId Name
name Kind
ty = IdDetails -> Name -> Kind -> IdInfo -> Id
Var.mkExportedLocalVar IdDetails
VanillaId Name
name Kind
ty IdInfo
vanillaIdInfo
mkSysLocal :: FastString -> Unique -> Type -> Id
mkSysLocal :: FastString -> Unique -> Kind -> Id
mkSysLocal FastString
fs Unique
uniq Kind
ty = ASSERT( not (isCoVarType ty) )
Name -> Kind -> Id
mkLocalId (Unique -> FastString -> Name
mkSystemVarName Unique
uniq FastString
fs) Kind
ty
mkSysLocalOrCoVar :: FastString -> Unique -> Type -> Id
mkSysLocalOrCoVar :: FastString -> Unique -> Kind -> Id
mkSysLocalOrCoVar FastString
fs Unique
uniq Kind
ty
= Name -> Kind -> Id
mkLocalIdOrCoVar (Unique -> FastString -> Name
mkSystemVarName Unique
uniq FastString
fs) Kind
ty
mkSysLocalM :: MonadUnique m => FastString -> Type -> m Id
mkSysLocalM :: FastString -> Kind -> m Id
mkSysLocalM FastString
fs Kind
ty = m Unique
forall (m :: * -> *). MonadUnique m => m Unique
getUniqueM m Unique -> (Unique -> m Id) -> m Id
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (\Unique
uniq -> Id -> m Id
forall (m :: * -> *) a. Monad m => a -> m a
return (FastString -> Unique -> Kind -> Id
mkSysLocal FastString
fs Unique
uniq Kind
ty))
mkSysLocalOrCoVarM :: MonadUnique m => FastString -> Type -> m Id
mkSysLocalOrCoVarM :: FastString -> Kind -> m Id
mkSysLocalOrCoVarM FastString
fs Kind
ty
= m Unique
forall (m :: * -> *). MonadUnique m => m Unique
getUniqueM m Unique -> (Unique -> m Id) -> m Id
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (\Unique
uniq -> Id -> m Id
forall (m :: * -> *) a. Monad m => a -> m a
return (FastString -> Unique -> Kind -> Id
mkSysLocalOrCoVar FastString
fs Unique
uniq Kind
ty))
mkUserLocal :: OccName -> Unique -> Type -> SrcSpan -> Id
mkUserLocal :: OccName -> Unique -> Kind -> SrcSpan -> Id
mkUserLocal OccName
occ Unique
uniq Kind
ty SrcSpan
loc = ASSERT( not (isCoVarType ty) )
Name -> Kind -> Id
mkLocalId (Unique -> OccName -> SrcSpan -> Name
mkInternalName Unique
uniq OccName
occ SrcSpan
loc) Kind
ty
mkUserLocalOrCoVar :: OccName -> Unique -> Type -> SrcSpan -> Id
mkUserLocalOrCoVar :: OccName -> Unique -> Kind -> SrcSpan -> Id
mkUserLocalOrCoVar OccName
occ Unique
uniq Kind
ty SrcSpan
loc
= Name -> Kind -> Id
mkLocalIdOrCoVar (Unique -> OccName -> SrcSpan -> Name
mkInternalName Unique
uniq OccName
occ SrcSpan
loc) Kind
ty
mkWorkerId :: Unique -> Id -> Type -> Id
mkWorkerId :: Unique -> Id -> Kind -> Id
mkWorkerId Unique
uniq Id
unwrkr Kind
ty
= Name -> Kind -> Id
mkLocalIdOrCoVar ((OccName -> OccName) -> Unique -> Name -> Name
mkDerivedInternalName OccName -> OccName
mkWorkerOcc Unique
uniq (Id -> Name
forall a. NamedThing a => a -> Name
getName Id
unwrkr)) Kind
ty
mkTemplateLocal :: Int -> Type -> Id
mkTemplateLocal :: Int -> Kind -> Id
mkTemplateLocal Int
i Kind
ty = FastString -> Unique -> Kind -> Id
mkSysLocalOrCoVar (String -> FastString
fsLit String
"v") (Int -> Unique
mkBuiltinUnique Int
i) Kind
ty
mkTemplateLocals :: [Type] -> [Id]
mkTemplateLocals :: [Kind] -> [Id]
mkTemplateLocals = Int -> [Kind] -> [Id]
mkTemplateLocalsNum Int
1
mkTemplateLocalsNum :: Int -> [Type] -> [Id]
mkTemplateLocalsNum :: Int -> [Kind] -> [Id]
mkTemplateLocalsNum Int
n [Kind]
tys = (Int -> Kind -> Id) -> [Int] -> [Kind] -> [Id]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith Int -> Kind -> Id
mkTemplateLocal [Int
n..] [Kind]
tys
recordSelectorTyCon :: Id -> RecSelParent
recordSelectorTyCon :: Id -> RecSelParent
recordSelectorTyCon Id
id
= case Id -> IdDetails
Var.idDetails Id
id of
RecSelId { sel_tycon :: IdDetails -> RecSelParent
sel_tycon = RecSelParent
parent } -> RecSelParent
parent
IdDetails
_ -> String -> RecSelParent
forall a. String -> a
panic String
"recordSelectorTyCon"
isRecordSelector :: Id -> Bool
isNaughtyRecordSelector :: Id -> Bool
isPatSynRecordSelector :: Id -> Bool
isDataConRecordSelector :: Id -> Bool
isPrimOpId :: Id -> Bool
isFCallId :: Id -> Bool
isDataConWorkId :: Id -> Bool
isDataConWrapId :: Id -> Bool
isDFunId :: Id -> Bool
isClassOpId_maybe :: Id -> Maybe Class
isPrimOpId_maybe :: Id -> Maybe PrimOp
isFCallId_maybe :: Id -> Maybe ForeignCall
isDataConWorkId_maybe :: Id -> Maybe DataCon
isDataConWrapId_maybe :: Id -> Maybe DataCon
isRecordSelector :: Id -> Bool
isRecordSelector Id
id = case Id -> IdDetails
Var.idDetails Id
id of
RecSelId {} -> Bool
True
IdDetails
_ -> Bool
False
isDataConRecordSelector :: Id -> Bool
isDataConRecordSelector Id
id = case Id -> IdDetails
Var.idDetails Id
id of
RecSelId {sel_tycon :: IdDetails -> RecSelParent
sel_tycon = RecSelData TyCon
_} -> Bool
True
IdDetails
_ -> Bool
False
isPatSynRecordSelector :: Id -> Bool
isPatSynRecordSelector Id
id = case Id -> IdDetails
Var.idDetails Id
id of
RecSelId {sel_tycon :: IdDetails -> RecSelParent
sel_tycon = RecSelPatSyn PatSyn
_} -> Bool
True
IdDetails
_ -> Bool
False
isNaughtyRecordSelector :: Id -> Bool
isNaughtyRecordSelector Id
id = case Id -> IdDetails
Var.idDetails Id
id of
RecSelId { sel_naughty :: IdDetails -> Bool
sel_naughty = Bool
n } -> Bool
n
IdDetails
_ -> Bool
False
isClassOpId_maybe :: Id -> Maybe Class
isClassOpId_maybe Id
id = case Id -> IdDetails
Var.idDetails Id
id of
ClassOpId Class
cls -> Class -> Maybe Class
forall a. a -> Maybe a
Just Class
cls
IdDetails
_other -> Maybe Class
forall a. Maybe a
Nothing
isPrimOpId :: Id -> Bool
isPrimOpId Id
id = case Id -> IdDetails
Var.idDetails Id
id of
PrimOpId PrimOp
_ -> Bool
True
IdDetails
_ -> Bool
False
isDFunId :: Id -> Bool
isDFunId Id
id = case Id -> IdDetails
Var.idDetails Id
id of
DFunId {} -> Bool
True
IdDetails
_ -> Bool
False
isPrimOpId_maybe :: Id -> Maybe PrimOp
isPrimOpId_maybe Id
id = case Id -> IdDetails
Var.idDetails Id
id of
PrimOpId PrimOp
op -> PrimOp -> Maybe PrimOp
forall a. a -> Maybe a
Just PrimOp
op
IdDetails
_ -> Maybe PrimOp
forall a. Maybe a
Nothing
isFCallId :: Id -> Bool
isFCallId Id
id = case Id -> IdDetails
Var.idDetails Id
id of
FCallId ForeignCall
_ -> Bool
True
IdDetails
_ -> Bool
False
isFCallId_maybe :: Id -> Maybe ForeignCall
isFCallId_maybe Id
id = case Id -> IdDetails
Var.idDetails Id
id of
FCallId ForeignCall
call -> ForeignCall -> Maybe ForeignCall
forall a. a -> Maybe a
Just ForeignCall
call
IdDetails
_ -> Maybe ForeignCall
forall a. Maybe a
Nothing
isDataConWorkId :: Id -> Bool
isDataConWorkId Id
id = case Id -> IdDetails
Var.idDetails Id
id of
DataConWorkId DataCon
_ -> Bool
True
IdDetails
_ -> Bool
False
isDataConWorkId_maybe :: Id -> Maybe DataCon
isDataConWorkId_maybe Id
id = case Id -> IdDetails
Var.idDetails Id
id of
DataConWorkId DataCon
con -> DataCon -> Maybe DataCon
forall a. a -> Maybe a
Just DataCon
con
IdDetails
_ -> Maybe DataCon
forall a. Maybe a
Nothing
isDataConWrapId :: Id -> Bool
isDataConWrapId Id
id = case Id -> IdDetails
Var.idDetails Id
id of
DataConWrapId DataCon
_ -> Bool
True
IdDetails
_ -> Bool
False
isDataConWrapId_maybe :: Id -> Maybe DataCon
isDataConWrapId_maybe Id
id = case Id -> IdDetails
Var.idDetails Id
id of
DataConWrapId DataCon
con -> DataCon -> Maybe DataCon
forall a. a -> Maybe a
Just DataCon
con
IdDetails
_ -> Maybe DataCon
forall a. Maybe a
Nothing
isDataConId_maybe :: Id -> Maybe DataCon
isDataConId_maybe :: Id -> Maybe DataCon
isDataConId_maybe Id
id = case Id -> IdDetails
Var.idDetails Id
id of
DataConWorkId DataCon
con -> DataCon -> Maybe DataCon
forall a. a -> Maybe a
Just DataCon
con
DataConWrapId DataCon
con -> DataCon -> Maybe DataCon
forall a. a -> Maybe a
Just DataCon
con
IdDetails
_ -> Maybe DataCon
forall a. Maybe a
Nothing
isJoinId :: Var -> Bool
isJoinId :: Id -> Bool
isJoinId Id
id
| Id -> Bool
isId Id
id = case Id -> IdDetails
Var.idDetails Id
id of
JoinId {} -> Bool
True
IdDetails
_ -> Bool
False
| Bool
otherwise = Bool
False
isJoinId_maybe :: Var -> Maybe JoinArity
isJoinId_maybe :: Id -> Maybe Int
isJoinId_maybe Id
id
| Id -> Bool
isId Id
id = ASSERT2( isId id, ppr id )
case Id -> IdDetails
Var.idDetails Id
id of
JoinId Int
arity -> Int -> Maybe Int
forall a. a -> Maybe a
Just Int
arity
IdDetails
_ -> Maybe Int
forall a. Maybe a
Nothing
| Bool
otherwise = Maybe Int
forall a. Maybe a
Nothing
idDataCon :: Id -> DataCon
idDataCon :: Id -> DataCon
idDataCon Id
id = Id -> Maybe DataCon
isDataConId_maybe Id
id Maybe DataCon -> DataCon -> DataCon
forall a. Maybe a -> a -> a
`orElse` String -> SDoc -> DataCon
forall a. HasCallStack => String -> SDoc -> a
pprPanic String
"idDataCon" (Id -> SDoc
forall a. Outputable a => a -> SDoc
ppr Id
id)
hasNoBinding :: Id -> Bool
hasNoBinding :: Id -> Bool
hasNoBinding Id
id = case Id -> IdDetails
Var.idDetails Id
id of
PrimOpId PrimOp
_ -> Bool
False
FCallId ForeignCall
_ -> Bool
True
DataConWorkId DataCon
dc -> DataCon -> Bool
isUnboxedTupleCon DataCon
dc Bool -> Bool -> Bool
|| DataCon -> Bool
isUnboxedSumCon DataCon
dc
IdDetails
_ -> Unfolding -> Bool
isCompulsoryUnfolding (Id -> Unfolding
idUnfolding Id
id)
isImplicitId :: Id -> Bool
isImplicitId :: Id -> Bool
isImplicitId Id
id
= case Id -> IdDetails
Var.idDetails Id
id of
FCallId {} -> Bool
True
ClassOpId {} -> Bool
True
PrimOpId {} -> Bool
True
DataConWorkId {} -> Bool
True
DataConWrapId {} -> Bool
True
IdDetails
_ -> Bool
False
idIsFrom :: Module -> Id -> Bool
idIsFrom :: Module -> Id -> Bool
idIsFrom Module
mod Id
id = Module -> Name -> Bool
nameIsLocalOrFrom Module
mod (Id -> Name
idName Id
id)
isDeadBinder :: Id -> Bool
isDeadBinder :: Id -> Bool
isDeadBinder Id
bndr | Id -> Bool
isId Id
bndr = OccInfo -> Bool
isDeadOcc (Id -> OccInfo
idOccInfo Id
bndr)
| Bool
otherwise = Bool
False
idJoinArity :: JoinId -> JoinArity
idJoinArity :: Id -> Int
idJoinArity Id
id = Id -> Maybe Int
isJoinId_maybe Id
id Maybe Int -> Int -> Int
forall a. Maybe a -> a -> a
`orElse` String -> SDoc -> Int
forall a. HasCallStack => String -> SDoc -> a
pprPanic String
"idJoinArity" (Id -> SDoc
forall a. Outputable a => a -> SDoc
ppr Id
id)
asJoinId :: Id -> JoinArity -> JoinId
asJoinId :: Id -> Int -> Id
asJoinId Id
id Int
arity = WARN(not (isLocalId id),
text "global id being marked as join var:" <+> ppr id)
WARN(not (is_vanilla_or_join id),
ppr id <+> pprIdDetails (idDetails id))
Id
id Id -> IdDetails -> Id
`setIdDetails` Int -> IdDetails
JoinId Int
arity
where
is_vanilla_or_join :: Id -> Bool
is_vanilla_or_join Id
id = case Id -> IdDetails
Var.idDetails Id
id of
IdDetails
VanillaId -> Bool
True
JoinId {} -> Bool
True
IdDetails
_ -> Bool
False
zapJoinId :: Id -> Id
zapJoinId :: Id -> Id
zapJoinId Id
jid | Id -> Bool
isJoinId Id
jid = Id -> Id
zapIdTailCallInfo (Id
jid Id -> IdDetails -> Id
`setIdDetails` IdDetails
VanillaId)
| Bool
otherwise = Id
jid
asJoinId_maybe :: Id -> Maybe JoinArity -> Id
asJoinId_maybe :: Id -> Maybe Int -> Id
asJoinId_maybe Id
id (Just Int
arity) = Id -> Int -> Id
asJoinId Id
id Int
arity
asJoinId_maybe Id
id Maybe Int
Nothing = Id -> Id
zapJoinId Id
id
idArity :: Id -> Arity
idArity :: Id -> Int
idArity Id
id = IdInfo -> Int
arityInfo (HasDebugCallStack => Id -> IdInfo
Id -> IdInfo
idInfo Id
id)
setIdArity :: Id -> Arity -> Id
setIdArity :: Id -> Int -> Id
setIdArity Id
id Int
arity = HasDebugCallStack => (IdInfo -> IdInfo) -> Id -> Id
(IdInfo -> IdInfo) -> Id -> Id
modifyIdInfo (IdInfo -> Int -> IdInfo
`setArityInfo` Int
arity) Id
id
idCallArity :: Id -> Arity
idCallArity :: Id -> Int
idCallArity Id
id = IdInfo -> Int
callArityInfo (HasDebugCallStack => Id -> IdInfo
Id -> IdInfo
idInfo Id
id)
setIdCallArity :: Id -> Arity -> Id
setIdCallArity :: Id -> Int -> Id
setIdCallArity Id
id Int
arity = HasDebugCallStack => (IdInfo -> IdInfo) -> Id -> Id
(IdInfo -> IdInfo) -> Id -> Id
modifyIdInfo (IdInfo -> Int -> IdInfo
`setCallArityInfo` Int
arity) Id
id
idFunRepArity :: Id -> RepArity
idFunRepArity :: Id -> Int
idFunRepArity Id
x = Int -> Kind -> Int
countFunRepArgs (Id -> Int
idArity Id
x) (Id -> Kind
idType Id
x)
isBottomingId :: Var -> Bool
isBottomingId :: Id -> Bool
isBottomingId Id
v
| Id -> Bool
isId Id
v = StrictSig -> Bool
isBottomingSig (Id -> StrictSig
idStrictness Id
v)
| Bool
otherwise = Bool
False
idStrictness :: Id -> StrictSig
idStrictness :: Id -> StrictSig
idStrictness Id
id = IdInfo -> StrictSig
strictnessInfo (HasDebugCallStack => Id -> IdInfo
Id -> IdInfo
idInfo Id
id)
setIdStrictness :: Id -> StrictSig -> Id
setIdStrictness :: Id -> StrictSig -> Id
setIdStrictness Id
id StrictSig
sig = HasDebugCallStack => (IdInfo -> IdInfo) -> Id -> Id
(IdInfo -> IdInfo) -> Id -> Id
modifyIdInfo (IdInfo -> StrictSig -> IdInfo
`setStrictnessInfo` StrictSig
sig) Id
id
zapIdStrictness :: Id -> Id
zapIdStrictness :: Id -> Id
zapIdStrictness Id
id = HasDebugCallStack => (IdInfo -> IdInfo) -> Id -> Id
(IdInfo -> IdInfo) -> Id -> Id
modifyIdInfo (IdInfo -> StrictSig -> IdInfo
`setStrictnessInfo` StrictSig
nopSig) Id
id
isStrictId :: Id -> Bool
isStrictId :: Id -> Bool
isStrictId Id
id
= ASSERT2( isId id, text "isStrictId: not an id: " <+> ppr id )
Bool -> Bool
not (Id -> Bool
isJoinId Id
id) Bool -> Bool -> Bool
&& (
(HasDebugCallStack => Kind -> Bool
Kind -> Bool
isStrictType (Id -> Kind
idType Id
id)) Bool -> Bool -> Bool
||
(JointDmd (Str StrDmd) (Use UseDmd) -> Bool
forall s u. JointDmd (Str s) (Use u) -> Bool
isStrictDmd (Id -> JointDmd (Str StrDmd) (Use UseDmd)
idDemandInfo Id
id))
)
idUnfolding :: Id -> Unfolding
idUnfolding :: Id -> Unfolding
idUnfolding Id
id
| OccInfo -> Bool
isStrongLoopBreaker (IdInfo -> OccInfo
occInfo IdInfo
info) = Unfolding
NoUnfolding
| Bool
otherwise = IdInfo -> Unfolding
unfoldingInfo IdInfo
info
where
info :: IdInfo
info = HasDebugCallStack => Id -> IdInfo
Id -> IdInfo
idInfo Id
id
realIdUnfolding :: Id -> Unfolding
realIdUnfolding :: Id -> Unfolding
realIdUnfolding Id
id = IdInfo -> Unfolding
unfoldingInfo (HasDebugCallStack => Id -> IdInfo
Id -> IdInfo
idInfo Id
id)
setIdUnfolding :: Id -> Unfolding -> Id
setIdUnfolding :: Id -> Unfolding -> Id
setIdUnfolding Id
id Unfolding
unfolding = HasDebugCallStack => (IdInfo -> IdInfo) -> Id -> Id
(IdInfo -> IdInfo) -> Id -> Id
modifyIdInfo (IdInfo -> Unfolding -> IdInfo
`setUnfoldingInfo` Unfolding
unfolding) Id
id
idDemandInfo :: Id -> Demand
idDemandInfo :: Id -> JointDmd (Str StrDmd) (Use UseDmd)
idDemandInfo Id
id = IdInfo -> JointDmd (Str StrDmd) (Use UseDmd)
demandInfo (HasDebugCallStack => Id -> IdInfo
Id -> IdInfo
idInfo Id
id)
setIdDemandInfo :: Id -> Demand -> Id
setIdDemandInfo :: Id -> JointDmd (Str StrDmd) (Use UseDmd) -> Id
setIdDemandInfo Id
id JointDmd (Str StrDmd) (Use UseDmd)
dmd = HasDebugCallStack => (IdInfo -> IdInfo) -> Id -> Id
(IdInfo -> IdInfo) -> Id -> Id
modifyIdInfo (IdInfo -> JointDmd (Str StrDmd) (Use UseDmd) -> IdInfo
`setDemandInfo` JointDmd (Str StrDmd) (Use UseDmd)
dmd) Id
id
setCaseBndrEvald :: StrictnessMark -> Id -> Id
setCaseBndrEvald :: StrictnessMark -> Id -> Id
setCaseBndrEvald StrictnessMark
str Id
id
| StrictnessMark -> Bool
isMarkedStrict StrictnessMark
str = Id
id Id -> Unfolding -> Id
`setIdUnfolding` Unfolding
evaldUnfolding
| Bool
otherwise = Id
id
idSpecialisation :: Id -> RuleInfo
idSpecialisation :: Id -> RuleInfo
idSpecialisation Id
id = IdInfo -> RuleInfo
ruleInfo (HasDebugCallStack => Id -> IdInfo
Id -> IdInfo
idInfo Id
id)
idCoreRules :: Id -> [CoreRule]
idCoreRules :: Id -> [CoreRule]
idCoreRules Id
id = RuleInfo -> [CoreRule]
ruleInfoRules (Id -> RuleInfo
idSpecialisation Id
id)
idHasRules :: Id -> Bool
idHasRules :: Id -> Bool
idHasRules Id
id = Bool -> Bool
not (RuleInfo -> Bool
isEmptyRuleInfo (Id -> RuleInfo
idSpecialisation Id
id))
setIdSpecialisation :: Id -> RuleInfo -> Id
setIdSpecialisation :: Id -> RuleInfo -> Id
setIdSpecialisation Id
id RuleInfo
spec_info = HasDebugCallStack => (IdInfo -> IdInfo) -> Id -> Id
(IdInfo -> IdInfo) -> Id -> Id
modifyIdInfo (IdInfo -> RuleInfo -> IdInfo
`setRuleInfo` RuleInfo
spec_info) Id
id
idCafInfo :: Id -> CafInfo
idCafInfo :: Id -> CafInfo
idCafInfo Id
id = IdInfo -> CafInfo
cafInfo (HasDebugCallStack => Id -> IdInfo
Id -> IdInfo
idInfo Id
id)
setIdCafInfo :: Id -> CafInfo -> Id
setIdCafInfo :: Id -> CafInfo -> Id
setIdCafInfo Id
id CafInfo
caf_info = HasDebugCallStack => (IdInfo -> IdInfo) -> Id -> Id
(IdInfo -> IdInfo) -> Id -> Id
modifyIdInfo (IdInfo -> CafInfo -> IdInfo
`setCafInfo` CafInfo
caf_info) Id
id
idOccInfo :: Id -> OccInfo
idOccInfo :: Id -> OccInfo
idOccInfo Id
id = IdInfo -> OccInfo
occInfo (HasDebugCallStack => Id -> IdInfo
Id -> IdInfo
idInfo Id
id)
setIdOccInfo :: Id -> OccInfo -> Id
setIdOccInfo :: Id -> OccInfo -> Id
setIdOccInfo Id
id OccInfo
occ_info = HasDebugCallStack => (IdInfo -> IdInfo) -> Id -> Id
(IdInfo -> IdInfo) -> Id -> Id
modifyIdInfo (IdInfo -> OccInfo -> IdInfo
`setOccInfo` OccInfo
occ_info) Id
id
zapIdOccInfo :: Id -> Id
zapIdOccInfo :: Id -> Id
zapIdOccInfo Id
b = Id
b Id -> OccInfo -> Id
`setIdOccInfo` OccInfo
noOccInfo
idInlinePragma :: Id -> InlinePragma
idInlinePragma :: Id -> InlinePragma
idInlinePragma Id
id = IdInfo -> InlinePragma
inlinePragInfo (HasDebugCallStack => Id -> IdInfo
Id -> IdInfo
idInfo Id
id)
setInlinePragma :: Id -> InlinePragma -> Id
setInlinePragma :: Id -> InlinePragma -> Id
setInlinePragma Id
id InlinePragma
prag = HasDebugCallStack => (IdInfo -> IdInfo) -> Id -> Id
(IdInfo -> IdInfo) -> Id -> Id
modifyIdInfo (IdInfo -> InlinePragma -> IdInfo
`setInlinePragInfo` InlinePragma
prag) Id
id
modifyInlinePragma :: Id -> (InlinePragma -> InlinePragma) -> Id
modifyInlinePragma :: Id -> (InlinePragma -> InlinePragma) -> Id
modifyInlinePragma Id
id InlinePragma -> InlinePragma
fn = HasDebugCallStack => (IdInfo -> IdInfo) -> Id -> Id
(IdInfo -> IdInfo) -> Id -> Id
modifyIdInfo (\IdInfo
info -> IdInfo
info IdInfo -> InlinePragma -> IdInfo
`setInlinePragInfo` (InlinePragma -> InlinePragma
fn (IdInfo -> InlinePragma
inlinePragInfo IdInfo
info))) Id
id
idInlineActivation :: Id -> Activation
idInlineActivation :: Id -> Activation
idInlineActivation Id
id = InlinePragma -> Activation
inlinePragmaActivation (Id -> InlinePragma
idInlinePragma Id
id)
setInlineActivation :: Id -> Activation -> Id
setInlineActivation :: Id -> Activation -> Id
setInlineActivation Id
id Activation
act = Id -> (InlinePragma -> InlinePragma) -> Id
modifyInlinePragma Id
id (\InlinePragma
prag -> InlinePragma -> Activation -> InlinePragma
setInlinePragmaActivation InlinePragma
prag Activation
act)
idRuleMatchInfo :: Id -> RuleMatchInfo
idRuleMatchInfo :: Id -> RuleMatchInfo
idRuleMatchInfo Id
id = InlinePragma -> RuleMatchInfo
inlinePragmaRuleMatchInfo (Id -> InlinePragma
idInlinePragma Id
id)
isConLikeId :: Id -> Bool
isConLikeId :: Id -> Bool
isConLikeId Id
id = Id -> Bool
isDataConWorkId Id
id Bool -> Bool -> Bool
|| RuleMatchInfo -> Bool
isConLike (Id -> RuleMatchInfo
idRuleMatchInfo Id
id)
idOneShotInfo :: Id -> OneShotInfo
idOneShotInfo :: Id -> OneShotInfo
idOneShotInfo Id
id = IdInfo -> OneShotInfo
oneShotInfo (HasDebugCallStack => Id -> IdInfo
Id -> IdInfo
idInfo Id
id)
idStateHackOneShotInfo :: Id -> OneShotInfo
idStateHackOneShotInfo :: Id -> OneShotInfo
idStateHackOneShotInfo Id
id
| Kind -> Bool
isStateHackType (Id -> Kind
idType Id
id) = OneShotInfo
stateHackOneShot
| Bool
otherwise = Id -> OneShotInfo
idOneShotInfo Id
id
isOneShotBndr :: Var -> Bool
isOneShotBndr :: Id -> Bool
isOneShotBndr Id
var
| Id -> Bool
isTyVar Id
var = Bool
True
| OneShotInfo
OneShotLam <- Id -> OneShotInfo
idStateHackOneShotInfo Id
var = Bool
True
| Bool
otherwise = Bool
False
stateHackOneShot :: OneShotInfo
stateHackOneShot :: OneShotInfo
stateHackOneShot = OneShotInfo
OneShotLam
typeOneShot :: Type -> OneShotInfo
typeOneShot :: Kind -> OneShotInfo
typeOneShot Kind
ty
| Kind -> Bool
isStateHackType Kind
ty = OneShotInfo
stateHackOneShot
| Bool
otherwise = OneShotInfo
NoOneShotInfo
isStateHackType :: Type -> Bool
isStateHackType :: Kind -> Bool
isStateHackType Kind
ty
| DynFlags -> Bool
hasNoStateHack DynFlags
unsafeGlobalDynFlags
= Bool
False
| Bool
otherwise
= case Kind -> Maybe TyCon
tyConAppTyCon_maybe Kind
ty of
Just TyCon
tycon -> TyCon
tycon TyCon -> TyCon -> Bool
forall a. Eq a => a -> a -> Bool
== TyCon
statePrimTyCon
Maybe TyCon
_ -> Bool
False
isProbablyOneShotLambda :: Id -> Bool
isProbablyOneShotLambda :: Id -> Bool
isProbablyOneShotLambda Id
id = case Id -> OneShotInfo
idStateHackOneShotInfo Id
id of
OneShotInfo
OneShotLam -> Bool
True
OneShotInfo
NoOneShotInfo -> Bool
False
setOneShotLambda :: Id -> Id
setOneShotLambda :: Id -> Id
setOneShotLambda Id
id = HasDebugCallStack => (IdInfo -> IdInfo) -> Id -> Id
(IdInfo -> IdInfo) -> Id -> Id
modifyIdInfo (IdInfo -> OneShotInfo -> IdInfo
`setOneShotInfo` OneShotInfo
OneShotLam) Id
id
clearOneShotLambda :: Id -> Id
clearOneShotLambda :: Id -> Id
clearOneShotLambda Id
id = HasDebugCallStack => (IdInfo -> IdInfo) -> Id -> Id
(IdInfo -> IdInfo) -> Id -> Id
modifyIdInfo (IdInfo -> OneShotInfo -> IdInfo
`setOneShotInfo` OneShotInfo
NoOneShotInfo) Id
id
setIdOneShotInfo :: Id -> OneShotInfo -> Id
setIdOneShotInfo :: Id -> OneShotInfo -> Id
setIdOneShotInfo Id
id OneShotInfo
one_shot = HasDebugCallStack => (IdInfo -> IdInfo) -> Id -> Id
(IdInfo -> IdInfo) -> Id -> Id
modifyIdInfo (IdInfo -> OneShotInfo -> IdInfo
`setOneShotInfo` OneShotInfo
one_shot) Id
id
updOneShotInfo :: Id -> OneShotInfo -> Id
updOneShotInfo :: Id -> OneShotInfo -> Id
updOneShotInfo Id
id OneShotInfo
one_shot
| Bool
do_upd = Id -> OneShotInfo -> Id
setIdOneShotInfo Id
id OneShotInfo
one_shot
| Bool
otherwise = Id
id
where
do_upd :: Bool
do_upd = case (Id -> OneShotInfo
idOneShotInfo Id
id, OneShotInfo
one_shot) of
(OneShotInfo
NoOneShotInfo, OneShotInfo
_) -> Bool
True
(OneShotInfo
OneShotLam, OneShotInfo
_) -> Bool
False
zapInfo :: (IdInfo -> Maybe IdInfo) -> Id -> Id
zapInfo :: (IdInfo -> Maybe IdInfo) -> Id -> Id
zapInfo IdInfo -> Maybe IdInfo
zapper Id
id = Maybe IdInfo -> Id -> Id
maybeModifyIdInfo (IdInfo -> Maybe IdInfo
zapper (HasDebugCallStack => Id -> IdInfo
Id -> IdInfo
idInfo Id
id)) Id
id
zapLamIdInfo :: Id -> Id
zapLamIdInfo :: Id -> Id
zapLamIdInfo = (IdInfo -> Maybe IdInfo) -> Id -> Id
zapInfo IdInfo -> Maybe IdInfo
zapLamInfo
zapFragileIdInfo :: Id -> Id
zapFragileIdInfo :: Id -> Id
zapFragileIdInfo = (IdInfo -> Maybe IdInfo) -> Id -> Id
zapInfo IdInfo -> Maybe IdInfo
zapFragileInfo
zapIdDemandInfo :: Id -> Id
zapIdDemandInfo :: Id -> Id
zapIdDemandInfo = (IdInfo -> Maybe IdInfo) -> Id -> Id
zapInfo IdInfo -> Maybe IdInfo
zapDemandInfo
zapIdUsageInfo :: Id -> Id
zapIdUsageInfo :: Id -> Id
zapIdUsageInfo = (IdInfo -> Maybe IdInfo) -> Id -> Id
zapInfo IdInfo -> Maybe IdInfo
zapUsageInfo
zapIdUsageEnvInfo :: Id -> Id
zapIdUsageEnvInfo :: Id -> Id
zapIdUsageEnvInfo = (IdInfo -> Maybe IdInfo) -> Id -> Id
zapInfo IdInfo -> Maybe IdInfo
zapUsageEnvInfo
zapIdUsedOnceInfo :: Id -> Id
zapIdUsedOnceInfo :: Id -> Id
zapIdUsedOnceInfo = (IdInfo -> Maybe IdInfo) -> Id -> Id
zapInfo IdInfo -> Maybe IdInfo
zapUsedOnceInfo
zapIdTailCallInfo :: Id -> Id
zapIdTailCallInfo :: Id -> Id
zapIdTailCallInfo = (IdInfo -> Maybe IdInfo) -> Id -> Id
zapInfo IdInfo -> Maybe IdInfo
zapTailCallInfo
zapStableUnfolding :: Id -> Id
zapStableUnfolding :: Id -> Id
zapStableUnfolding Id
id
| Unfolding -> Bool
isStableUnfolding (Id -> Unfolding
realIdUnfolding Id
id) = Id -> Unfolding -> Id
setIdUnfolding Id
id Unfolding
NoUnfolding
| Bool
otherwise = Id
id
transferPolyIdInfo :: Id
-> [Var]
-> Id
-> Id
transferPolyIdInfo :: Id -> [Id] -> Id -> Id
transferPolyIdInfo Id
old_id [Id]
abstract_wrt Id
new_id
= HasDebugCallStack => (IdInfo -> IdInfo) -> Id -> Id
(IdInfo -> IdInfo) -> Id -> Id
modifyIdInfo IdInfo -> IdInfo
transfer Id
new_id
where
arity_increase :: Int
arity_increase = (Id -> Bool) -> [Id] -> Int
forall a. (a -> Bool) -> [a] -> Int
count Id -> Bool
isId [Id]
abstract_wrt
old_info :: IdInfo
old_info = HasDebugCallStack => Id -> IdInfo
Id -> IdInfo
idInfo Id
old_id
old_arity :: Int
old_arity = IdInfo -> Int
arityInfo IdInfo
old_info
old_inline_prag :: InlinePragma
old_inline_prag = IdInfo -> InlinePragma
inlinePragInfo IdInfo
old_info
old_occ_info :: OccInfo
old_occ_info = IdInfo -> OccInfo
occInfo IdInfo
old_info
new_arity :: Int
new_arity = Int
old_arity Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
arity_increase
new_occ_info :: OccInfo
new_occ_info = OccInfo -> OccInfo
zapOccTailCallInfo OccInfo
old_occ_info
old_strictness :: StrictSig
old_strictness = IdInfo -> StrictSig
strictnessInfo IdInfo
old_info
new_strictness :: StrictSig
new_strictness = Int -> StrictSig -> StrictSig
increaseStrictSigArity Int
arity_increase StrictSig
old_strictness
transfer :: IdInfo -> IdInfo
transfer IdInfo
new_info = IdInfo
new_info IdInfo -> Int -> IdInfo
`setArityInfo` Int
new_arity
IdInfo -> InlinePragma -> IdInfo
`setInlinePragInfo` InlinePragma
old_inline_prag
IdInfo -> OccInfo -> IdInfo
`setOccInfo` OccInfo
new_occ_info
IdInfo -> StrictSig -> IdInfo
`setStrictnessInfo` StrictSig
new_strictness
isNeverLevPolyId :: Id -> Bool
isNeverLevPolyId :: Id -> Bool
isNeverLevPolyId = IdInfo -> Bool
isNeverLevPolyIdInfo (IdInfo -> Bool) -> (Id -> IdInfo) -> Id -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HasDebugCallStack => Id -> IdInfo
Id -> IdInfo
idInfo