{-# LANGUAGE CPP #-}
module GHC.Types.Id (
Var, Id, isId,
InVar, InId,
OutVar, OutId,
mkGlobalId, mkVanillaGlobal, mkVanillaGlobalWithInfo,
mkLocalId, mkLocalCoVar, mkLocalIdOrCoVar,
mkLocalIdWithInfo, mkExportedLocalId, mkExportedVanillaId,
mkSysLocal, mkSysLocalM, mkSysLocalOrCoVar, mkSysLocalOrCoVarM,
mkUserLocal, mkUserLocalOrCoVar,
mkTemplateLocals, mkTemplateLocalsNum, mkTemplateLocal,
mkScaledTemplateLocal,
mkWorkerId,
idName, idType, idMult, idScaledType, idUnique, idInfo, idDetails,
recordSelectorTyCon,
recordSelectorTyCon_maybe,
setIdName, setIdUnique, GHC.Types.Id.setIdType, setIdMult,
updateIdTypeButNotMult, updateIdTypeAndMult, updateIdTypeAndMultM,
setIdExported, setIdNotExported,
globaliseId, localiseId,
setIdInfo, lazySetIdInfo, modifyIdInfo, maybeModifyIdInfo,
zapLamIdInfo, zapIdDemandInfo, zapIdUsageInfo, zapIdUsageEnvInfo,
zapIdUsedOnceInfo, zapIdTailCallInfo,
zapFragileIdInfo, zapIdStrictness, zapStableUnfolding,
transferPolyIdInfo, scaleIdBy, scaleVarBy,
isImplicitId, isDeadBinder,
isStrictId,
isExportedId, isLocalId, isGlobalId,
isRecordSelector, isNaughtyRecordSelector,
isPatSynRecordSelector,
isDataConRecordSelector,
isClassOpId,
isClassOpId_maybe, isDFunId,
isPrimOpId, isPrimOpId_maybe,
isFCallId, isFCallId_maybe,
isDataConWorkId, isDataConWorkId_maybe,
isDataConWrapId, isDataConWrapId_maybe,
isDataConId_maybe,
idDataCon,
isConLikeId, isDeadEndId, 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, idLFInfo_maybe,
idOneShotInfo, idStateHackOneShotInfo,
idOccInfo,
isNeverLevPolyId,
setIdUnfolding, setCaseBndrEvald,
setIdArity,
setIdCallArity,
setIdSpecialisation,
setIdCafInfo,
setIdOccInfo, zapIdOccInfo,
setIdLFInfo,
setIdDemandInfo,
setIdStrictness,
setIdCprInfo,
idDemandInfo,
idStrictness,
idCprInfo,
) where
#include "HsVersions.h"
import GHC.Prelude
import GHC.Core ( CoreRule, isStableUnfolding, evaldUnfolding,
isCompulsoryUnfolding, Unfolding( NoUnfolding ) )
import GHC.Types.Id.Info
import GHC.Types.Basic
import GHC.Types.Var( Id, CoVar, JoinId,
InId, InVar,
OutId, OutVar,
idInfo, idDetails, setIdDetails, globaliseId,
isId, isLocalId, isGlobalId, isExportedId,
setIdMult, updateIdTypeAndMult, updateIdTypeButNotMult, updateIdTypeAndMultM)
import qualified GHC.Types.Var as Var
import GHC.Core.Type
import GHC.Types.RepType
import GHC.Builtin.Types.Prim
import GHC.Core.DataCon
import GHC.Types.Demand
import GHC.Types.Cpr
import GHC.Types.Name
import GHC.Unit.Module
import GHC.Core.Class
import {-# SOURCE #-} GHC.Builtin.PrimOps (PrimOp)
import GHC.Types.ForeignCall
import GHC.Data.Maybe
import GHC.Types.SrcLoc
import GHC.Types.Unique
import GHC.Builtin.Uniques (mkBuiltinUnique)
import GHC.Types.Unique.Supply
import GHC.Data.FastString
import GHC.Core.Multiplicity
import GHC.Utils.Misc
import GHC.Utils.Outputable
import GHC.Utils.Panic
import GHC.Utils.GlobalVars
import GHC.Driver.Ppr
infixl 1 `setIdUnfolding`,
`setIdArity`,
`setIdCallArity`,
`setIdOccInfo`,
`setIdOneShotInfo`,
`setIdSpecialisation`,
`setInlinePragma`,
`setInlineActivation`,
`idCafInfo`,
`setIdDemandInfo`,
`setIdStrictness`,
`setIdCprInfo`,
`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
idMult :: Id -> Mult
idMult :: Id -> Kind
idMult = Id -> Kind
Var.varMult
idScaledType :: Id -> Scaled Type
idScaledType :: Id -> Scaled Kind
idScaledType Id
id = forall a. Kind -> a -> Scaled a
Scaled (Id -> Kind
idMult Id
id) (Id -> Kind
idType Id
id)
scaleIdBy :: Mult -> Id -> Id
scaleIdBy :: Kind -> Id -> Id
scaleIdBy Kind
m Id
id = Id -> Kind -> Id
setIdMult Id
id (Kind
m Kind -> Kind -> Kind
`mkMultMul` Id -> Kind
idMult Id
id)
scaleVarBy :: Mult -> Var -> Var
scaleVarBy :: Kind -> Id -> Id
scaleVarBy Kind
m Id
id
| Id -> Bool
isId Id
id = Kind -> Id -> Id
scaleIdBy Kind
m Id
id
| Bool
otherwise = Id
id
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 seq :: forall a b. a -> b -> b
`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 -> Kind -> IdInfo -> Id
Var.mkLocalVar (Id -> IdDetails
idDetails Id
id) (Name -> Name
localiseName Name
name) (Id -> Kind
Var.varMult Id
id) (Id -> Kind
idType Id
id) (HasDebugCallStack => 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 seq :: forall a b. a -> b -> b
`seq` (Id -> IdInfo -> Id
lazySetIdInfo Id
id IdInfo
info)
modifyIdInfo :: HasDebugCallStack => (IdInfo -> IdInfo) -> Id -> Id
modifyIdInfo :: HasDebugCallStack => (IdInfo -> IdInfo) -> Id -> Id
modifyIdInfo IdInfo -> IdInfo
fn Id
id = Id -> IdInfo -> Id
setIdInfo Id
id (IdInfo -> IdInfo
fn (HasDebugCallStack => 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 :: HasDebugCallStack => Name -> Mult -> Type -> Id
mkLocalId :: HasDebugCallStack => Name -> Kind -> Kind -> Id
mkLocalId Name
name Kind
w Kind
ty = ASSERT( not (isCoVarType ty) )
HasDebugCallStack => Name -> Kind -> Kind -> IdInfo -> Id
mkLocalIdWithInfo Name
name Kind
w Kind
ty IdInfo
vanillaIdInfo
mkLocalCoVar :: Name -> Type -> CoVar
mkLocalCoVar :: Name -> Kind -> Id
mkLocalCoVar Name
name Kind
ty
= ASSERT( isCoVarType ty )
IdDetails -> Name -> Kind -> Kind -> IdInfo -> Id
Var.mkLocalVar IdDetails
CoVarId Name
name Kind
Many Kind
ty IdInfo
vanillaIdInfo
mkLocalIdOrCoVar :: Name -> Mult -> Type -> Id
mkLocalIdOrCoVar :: Name -> Kind -> Kind -> Id
mkLocalIdOrCoVar Name
name Kind
w Kind
ty
| Kind -> Bool
isCoVarType Kind
ty = Name -> Kind -> Id
mkLocalCoVar Name
name Kind
ty
| Bool
otherwise = HasDebugCallStack => Name -> Kind -> Kind -> Id
mkLocalId Name
name Kind
w Kind
ty
mkLocalIdWithInfo :: HasDebugCallStack => Name -> Mult -> Type -> IdInfo -> Id
mkLocalIdWithInfo :: HasDebugCallStack => Name -> Kind -> Kind -> IdInfo -> Id
mkLocalIdWithInfo Name
name Kind
w Kind
ty IdInfo
info = ASSERT( not (isCoVarType ty) )
IdDetails -> Name -> Kind -> Kind -> IdInfo -> Id
Var.mkLocalVar IdDetails
VanillaId Name
name Kind
w 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 -> Mult -> Type -> Id
mkSysLocal :: FastString -> Unique -> Kind -> Kind -> Id
mkSysLocal FastString
fs Unique
uniq Kind
w Kind
ty = ASSERT( not (isCoVarType ty) )
HasDebugCallStack => Name -> Kind -> Kind -> Id
mkLocalId (Unique -> FastString -> Name
mkSystemVarName Unique
uniq FastString
fs) Kind
w Kind
ty
mkSysLocalOrCoVar :: FastString -> Unique -> Mult -> Type -> Id
mkSysLocalOrCoVar :: FastString -> Unique -> Kind -> Kind -> Id
mkSysLocalOrCoVar FastString
fs Unique
uniq Kind
w Kind
ty
= Name -> Kind -> Kind -> Id
mkLocalIdOrCoVar (Unique -> FastString -> Name
mkSystemVarName Unique
uniq FastString
fs) Kind
w Kind
ty
mkSysLocalM :: MonadUnique m => FastString -> Mult -> Type -> m Id
mkSysLocalM :: forall (m :: * -> *).
MonadUnique m =>
FastString -> Kind -> Kind -> m Id
mkSysLocalM FastString
fs Kind
w Kind
ty = forall (m :: * -> *). MonadUnique m => m Unique
getUniqueM forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (\Unique
uniq -> forall (m :: * -> *) a. Monad m => a -> m a
return (FastString -> Unique -> Kind -> Kind -> Id
mkSysLocal FastString
fs Unique
uniq Kind
w Kind
ty))
mkSysLocalOrCoVarM :: MonadUnique m => FastString -> Mult -> Type -> m Id
mkSysLocalOrCoVarM :: forall (m :: * -> *).
MonadUnique m =>
FastString -> Kind -> Kind -> m Id
mkSysLocalOrCoVarM FastString
fs Kind
w Kind
ty
= forall (m :: * -> *). MonadUnique m => m Unique
getUniqueM forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (\Unique
uniq -> forall (m :: * -> *) a. Monad m => a -> m a
return (FastString -> Unique -> Kind -> Kind -> Id
mkSysLocalOrCoVar FastString
fs Unique
uniq Kind
w Kind
ty))
mkUserLocal :: OccName -> Unique -> Mult -> Type -> SrcSpan -> Id
mkUserLocal :: OccName -> Unique -> Kind -> Kind -> SrcSpan -> Id
mkUserLocal OccName
occ Unique
uniq Kind
w Kind
ty SrcSpan
loc = ASSERT( not (isCoVarType ty) )
HasDebugCallStack => Name -> Kind -> Kind -> Id
mkLocalId (Unique -> OccName -> SrcSpan -> Name
mkInternalName Unique
uniq OccName
occ SrcSpan
loc) Kind
w Kind
ty
mkUserLocalOrCoVar :: OccName -> Unique -> Mult -> Type -> SrcSpan -> Id
mkUserLocalOrCoVar :: OccName -> Unique -> Kind -> Kind -> SrcSpan -> Id
mkUserLocalOrCoVar OccName
occ Unique
uniq Kind
w Kind
ty SrcSpan
loc
= Name -> Kind -> Kind -> Id
mkLocalIdOrCoVar (Unique -> OccName -> SrcSpan -> Name
mkInternalName Unique
uniq OccName
occ SrcSpan
loc) Kind
w Kind
ty
mkWorkerId :: Unique -> Id -> Type -> Id
mkWorkerId :: Unique -> Id -> Kind -> Id
mkWorkerId Unique
uniq Id
unwrkr Kind
ty
= HasDebugCallStack => Name -> Kind -> Kind -> Id
mkLocalId ((OccName -> OccName) -> Unique -> Name -> Name
mkDerivedInternalName OccName -> OccName
mkWorkerOcc Unique
uniq (forall a. NamedThing a => a -> Name
getName Id
unwrkr)) Kind
Many Kind
ty
mkTemplateLocal :: Int -> Type -> Id
mkTemplateLocal :: Int -> Kind -> Id
mkTemplateLocal Int
i Kind
ty = Int -> Scaled Kind -> Id
mkScaledTemplateLocal Int
i (forall a. a -> Scaled a
unrestricted Kind
ty)
mkScaledTemplateLocal :: Int -> Scaled Type -> Id
mkScaledTemplateLocal :: Int -> Scaled Kind -> Id
mkScaledTemplateLocal Int
i (Scaled Kind
w Kind
ty) = FastString -> Unique -> Kind -> Kind -> Id
mkSysLocalOrCoVar (String -> FastString
fsLit String
"v") (Int -> Unique
mkBuiltinUnique Int
i) Kind
w 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 = 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 -> Maybe RecSelParent
recordSelectorTyCon_maybe Id
id of
Just RecSelParent
parent -> RecSelParent
parent
Maybe RecSelParent
_ -> forall a. String -> a
panic String
"recordSelectorTyCon"
recordSelectorTyCon_maybe :: Id -> Maybe RecSelParent
recordSelectorTyCon_maybe :: Id -> Maybe RecSelParent
recordSelectorTyCon_maybe Id
id
= case Id -> IdDetails
Var.idDetails Id
id of
RecSelId { sel_tycon :: IdDetails -> RecSelParent
sel_tycon = RecSelParent
parent } -> forall a. a -> Maybe a
Just RecSelParent
parent
IdDetails
_ -> forall a. Maybe a
Nothing
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 :: 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 :: Id -> Bool
isClassOpId Id
id = case Id -> IdDetails
Var.idDetails Id
id of
ClassOpId Class
_ -> Bool
True
IdDetails
_other -> Bool
False
isClassOpId_maybe :: Id -> Maybe Class
isClassOpId_maybe Id
id = case Id -> IdDetails
Var.idDetails Id
id of
ClassOpId Class
cls -> forall a. a -> Maybe a
Just Class
cls
IdDetails
_other -> 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 -> forall a. a -> Maybe a
Just PrimOp
op
IdDetails
_ -> 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 -> forall a. a -> Maybe a
Just ForeignCall
call
IdDetails
_ -> 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 -> forall a. a -> Maybe a
Just DataCon
con
IdDetails
_ -> 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 -> forall a. a -> Maybe a
Just DataCon
con
IdDetails
_ -> 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 -> forall a. a -> Maybe a
Just DataCon
con
DataConWrapId DataCon
con -> forall a. a -> Maybe a
Just DataCon
con
IdDetails
_ -> 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 -> forall a. a -> Maybe a
Just Int
arity
IdDetails
_ -> forall a. Maybe a
Nothing
| Bool
otherwise = forall a. Maybe a
Nothing
idDataCon :: Id -> DataCon
idDataCon :: Id -> DataCon
idDataCon Id
id = Id -> Maybe DataCon
isDataConId_maybe Id
id forall a. Maybe a -> a -> a
`orElse` forall a. HasCallStack => String -> SDoc -> a
pprPanic String
"idDataCon" (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
True
FCallId ForeignCall
_ -> Bool
True
DataConWorkId DataCon
dc -> DataCon -> Bool
isUnboxedTupleDataCon DataCon
dc Bool -> Bool -> Bool
|| DataCon -> Bool
isUnboxedSumDataCon 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 forall a. Maybe a -> a -> a
`orElse` forall a. HasCallStack => String -> SDoc -> a
pprPanic String
"idJoinArity" (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
idInfo Id
id)
setIdArity :: Id -> Arity -> Id
setIdArity :: Id -> Int -> Id
setIdArity Id
id Int
arity = HasDebugCallStack => (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
idInfo Id
id)
setIdCallArity :: Id -> Arity -> Id
setIdCallArity :: Id -> Int -> Id
setIdCallArity Id
id Int
arity = HasDebugCallStack => (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)
isDeadEndId :: Var -> Bool
isDeadEndId :: Id -> Bool
isDeadEndId Id
v
| Id -> Bool
isId Id
v = StrictSig -> Bool
isDeadEndSig (Id -> StrictSig
idStrictness Id
v)
| Bool
otherwise = Bool
False
idStrictness :: Id -> StrictSig
idStrictness :: Id -> StrictSig
idStrictness Id
id = IdInfo -> StrictSig
strictnessInfo (HasDebugCallStack => Id -> IdInfo
idInfo Id
id)
setIdStrictness :: Id -> StrictSig -> Id
setIdStrictness :: Id -> StrictSig -> Id
setIdStrictness Id
id StrictSig
sig = HasDebugCallStack => (IdInfo -> IdInfo) -> Id -> Id
modifyIdInfo (IdInfo -> StrictSig -> IdInfo
`setStrictnessInfo` StrictSig
sig) Id
id
idCprInfo :: Id -> CprSig
idCprInfo :: Id -> CprSig
idCprInfo Id
id = IdInfo -> CprSig
cprInfo (HasDebugCallStack => Id -> IdInfo
idInfo Id
id)
setIdCprInfo :: Id -> CprSig -> Id
setIdCprInfo :: Id -> CprSig -> Id
setIdCprInfo Id
id CprSig
sig = HasDebugCallStack => (IdInfo -> IdInfo) -> Id -> Id
modifyIdInfo (\IdInfo
info -> IdInfo -> CprSig -> IdInfo
setCprInfo IdInfo
info CprSig
sig) Id
id
zapIdStrictness :: Id -> Id
zapIdStrictness :: Id -> Id
zapIdStrictness Id
id = HasDebugCallStack => (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 )
Id -> Bool
isJoinId Id
id = Bool
False
| Bool
otherwise = HasDebugCallStack => Kind -> Bool
isStrictType (Id -> Kind
idType Id
id) Bool -> Bool -> Bool
||
Demand -> Bool
isStrUsedDmd (Id -> Demand
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
idInfo Id
id
realIdUnfolding :: Id -> Unfolding
realIdUnfolding :: Id -> Unfolding
realIdUnfolding Id
id = IdInfo -> Unfolding
unfoldingInfo (HasDebugCallStack => Id -> IdInfo
idInfo Id
id)
setIdUnfolding :: Id -> Unfolding -> Id
setIdUnfolding :: Id -> Unfolding -> Id
setIdUnfolding Id
id Unfolding
unfolding = HasDebugCallStack => (IdInfo -> IdInfo) -> Id -> Id
modifyIdInfo (IdInfo -> Unfolding -> IdInfo
`setUnfoldingInfo` Unfolding
unfolding) Id
id
idDemandInfo :: Id -> Demand
idDemandInfo :: Id -> Demand
idDemandInfo Id
id = IdInfo -> Demand
demandInfo (HasDebugCallStack => Id -> IdInfo
idInfo Id
id)
setIdDemandInfo :: Id -> Demand -> Id
setIdDemandInfo :: Id -> Demand -> Id
setIdDemandInfo Id
id Demand
dmd = HasDebugCallStack => (IdInfo -> IdInfo) -> Id -> Id
modifyIdInfo (IdInfo -> Demand -> IdInfo
`setDemandInfo` Demand
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
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
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
idInfo Id
id)
setIdCafInfo :: Id -> CafInfo -> Id
setIdCafInfo :: Id -> CafInfo -> Id
setIdCafInfo Id
id CafInfo
caf_info = HasDebugCallStack => (IdInfo -> IdInfo) -> Id -> Id
modifyIdInfo (IdInfo -> CafInfo -> IdInfo
`setCafInfo` CafInfo
caf_info) Id
id
idLFInfo_maybe :: Id -> Maybe LambdaFormInfo
idLFInfo_maybe :: Id -> Maybe LambdaFormInfo
idLFInfo_maybe = IdInfo -> Maybe LambdaFormInfo
lfInfo forall b c a. (b -> c) -> (a -> b) -> a -> c
. HasDebugCallStack => Id -> IdInfo
idInfo
setIdLFInfo :: Id -> LambdaFormInfo -> Id
setIdLFInfo :: Id -> LambdaFormInfo -> Id
setIdLFInfo Id
id LambdaFormInfo
lf = HasDebugCallStack => (IdInfo -> IdInfo) -> Id -> Id
modifyIdInfo (IdInfo -> LambdaFormInfo -> IdInfo
`setLFInfo` LambdaFormInfo
lf) Id
id
idOccInfo :: Id -> OccInfo
idOccInfo :: Id -> OccInfo
idOccInfo Id
id = IdInfo -> OccInfo
occInfo (HasDebugCallStack => Id -> IdInfo
idInfo Id
id)
setIdOccInfo :: Id -> OccInfo -> Id
setIdOccInfo :: Id -> OccInfo -> Id
setIdOccInfo Id
id OccInfo
occ_info = HasDebugCallStack => (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
idInfo Id
id)
setInlinePragma :: Id -> InlinePragma -> Id
setInlinePragma :: Id -> InlinePragma -> Id
setInlinePragma Id
id InlinePragma
prag = HasDebugCallStack => (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
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 = RuleMatchInfo -> Bool
isConLike (Id -> RuleMatchInfo
idRuleMatchInfo Id
id)
idOneShotInfo :: Id -> OneShotInfo
idOneShotInfo :: Id -> OneShotInfo
idOneShotInfo Id
id = IdInfo -> OneShotInfo
oneShotInfo (HasDebugCallStack => 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
| Bool
unsafeHasNoStateHack
= Bool
False
| Bool
otherwise
= case Kind -> Maybe TyCon
tyConAppTyCon_maybe Kind
ty of
Just TyCon
tycon -> TyCon
tycon 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
modifyIdInfo (IdInfo -> OneShotInfo -> IdInfo
`setOneShotInfo` OneShotInfo
OneShotLam) Id
id
clearOneShotLambda :: Id -> Id
clearOneShotLambda :: Id -> Id
clearOneShotLambda Id
id = HasDebugCallStack => (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
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
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
modifyIdInfo IdInfo -> IdInfo
transfer Id
new_id
where
arity_increase :: Int
arity_increase = forall a. (a -> Bool) -> [a] -> Int
count Id -> Bool
isId [Id]
abstract_wrt
old_info :: IdInfo
old_info = HasDebugCallStack => 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 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
prependArgsStrictSig Int
arity_increase StrictSig
old_strictness
old_cpr :: CprSig
old_cpr = IdInfo -> CprSig
cprInfo IdInfo
old_info
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
IdInfo -> CprSig -> IdInfo
`setCprInfo` CprSig
old_cpr
isNeverLevPolyId :: Id -> Bool
isNeverLevPolyId :: Id -> Bool
isNeverLevPolyId = IdInfo -> Bool
isNeverLevPolyIdInfo forall b c a. (b -> c) -> (a -> b) -> a -> c
. HasDebugCallStack => Id -> IdInfo
idInfo