{-# 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 "HsVersions.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