{-# 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, isDataConId_maybe, idDataCon,
        isConLikeId, isBottomingId, idIsFrom,
        hasNoBinding,
        
        DictId, isDictId, isEvVar,
        
        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, DictId, 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
id ty :: Kind
ty = Kind -> ()
seqType Kind
ty () -> Id -> Id
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
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
id info :: IdInfo
info = IdInfo
info IdInfo -> Id -> Id
forall a b. a -> b -> b
`seq` (Id -> IdInfo -> Id
lazySetIdInfo Id
id IdInfo
info)
        
modifyIdInfo :: HasDebugCallStack => (IdInfo -> IdInfo) -> Id -> Id
modifyIdInfo :: (IdInfo -> IdInfo) -> Id -> Id
modifyIdInfo fn :: IdInfo -> IdInfo
fn id :: 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 new_info :: IdInfo
new_info) id :: Id
id = Id -> IdInfo -> Id
lazySetIdInfo Id
id IdInfo
new_info
maybeModifyIdInfo Nothing         id :: 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
name ty :: 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
name ty :: Kind
ty = Name -> Kind -> IdInfo -> Id
mkLocalIdWithInfo Name
name Kind
ty IdInfo
vanillaIdInfo
 
 
mkLocalCoVar :: Name -> Type -> CoVar
mkLocalCoVar :: Name -> Kind -> Id
mkLocalCoVar name :: Name
name ty :: 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
name ty :: 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
name ty :: Kind
ty info :: 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
name ty :: Kind
ty info :: 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 details :: IdDetails
details name :: Name
name ty :: 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
name ty :: 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 fs :: FastString
fs uniq :: Unique
uniq ty :: 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 fs :: FastString
fs uniq :: Unique
uniq ty :: 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 fs :: FastString
fs ty :: 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
>>= (\uniq :: 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 fs :: FastString
fs ty :: 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
>>= (\uniq :: 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 occ :: OccName
occ uniq :: Unique
uniq ty :: Kind
ty loc :: 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 occ :: OccName
occ uniq :: Unique
uniq ty :: Kind
ty loc :: 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 uniq :: Unique
uniq unwrkr :: Id
unwrkr ty :: 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 i :: Int
i ty :: Kind
ty = FastString -> Unique -> Kind -> Id
mkSysLocalOrCoVar (String -> FastString
fsLit "v") (Int -> Unique
mkBuiltinUnique Int
i) Kind
ty
mkTemplateLocals :: [Type] -> [Id]
mkTemplateLocals :: [Kind] -> [Id]
mkTemplateLocals = Int -> [Kind] -> [Id]
mkTemplateLocalsNum 1
mkTemplateLocalsNum :: Int -> [Type] -> [Id]
mkTemplateLocalsNum :: Int -> [Kind] -> [Id]
mkTemplateLocalsNum n :: Int
n tys :: [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
id
  = case Id -> IdDetails
Var.idDetails Id
id of
        RecSelId { sel_tycon :: IdDetails -> RecSelParent
sel_tycon = RecSelParent
parent } -> RecSelParent
parent
        _ -> String -> RecSelParent
forall a. String -> a
panic "recordSelectorTyCon"
isRecordSelector        :: Id -> Bool
isNaughtyRecordSelector :: Id -> Bool
isPatSynRecordSelector  :: Id -> Bool
isDataConRecordSelector  :: Id -> Bool
isPrimOpId              :: Id -> Bool
isFCallId               :: Id -> Bool
isDataConWorkId         :: 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
isRecordSelector :: Id -> Bool
isRecordSelector id :: Id
id = case Id -> IdDetails
Var.idDetails Id
id of
                        RecSelId {}     -> Bool
True
                        _               -> Bool
False
isDataConRecordSelector :: Id -> Bool
isDataConRecordSelector id :: Id
id = case Id -> IdDetails
Var.idDetails Id
id of
                        RecSelId {sel_tycon :: IdDetails -> RecSelParent
sel_tycon = RecSelData _} -> Bool
True
                        _               -> Bool
False
isPatSynRecordSelector :: Id -> Bool
isPatSynRecordSelector id :: Id
id = case Id -> IdDetails
Var.idDetails Id
id of
                        RecSelId {sel_tycon :: IdDetails -> RecSelParent
sel_tycon = RecSelPatSyn _} -> Bool
True
                        _               -> Bool
False
isNaughtyRecordSelector :: Id -> Bool
isNaughtyRecordSelector id :: Id
id = case Id -> IdDetails
Var.idDetails Id
id of
                        RecSelId { sel_naughty :: IdDetails -> Bool
sel_naughty = Bool
n } -> Bool
n
                        _                               -> Bool
False
isClassOpId_maybe :: Id -> Maybe Class
isClassOpId_maybe id :: Id
id = case Id -> IdDetails
Var.idDetails Id
id of
                        ClassOpId cls :: Class
cls -> Class -> Maybe Class
forall a. a -> Maybe a
Just Class
cls
                        _other :: IdDetails
_other        -> Maybe Class
forall a. Maybe a
Nothing
isPrimOpId :: Id -> Bool
isPrimOpId id :: Id
id = case Id -> IdDetails
Var.idDetails Id
id of
                        PrimOpId _ -> Bool
True
                        _          -> Bool
False
isDFunId :: Id -> Bool
isDFunId id :: Id
id = case Id -> IdDetails
Var.idDetails Id
id of
                        DFunId {} -> Bool
True
                        _         -> Bool
False
isPrimOpId_maybe :: Id -> Maybe PrimOp
isPrimOpId_maybe id :: Id
id = case Id -> IdDetails
Var.idDetails Id
id of
                        PrimOpId op :: PrimOp
op -> PrimOp -> Maybe PrimOp
forall a. a -> Maybe a
Just PrimOp
op
                        _           -> Maybe PrimOp
forall a. Maybe a
Nothing
isFCallId :: Id -> Bool
isFCallId id :: Id
id = case Id -> IdDetails
Var.idDetails Id
id of
                        FCallId _ -> Bool
True
                        _         -> Bool
False
isFCallId_maybe :: Id -> Maybe ForeignCall
isFCallId_maybe id :: Id
id = case Id -> IdDetails
Var.idDetails Id
id of
                        FCallId call :: ForeignCall
call -> ForeignCall -> Maybe ForeignCall
forall a. a -> Maybe a
Just ForeignCall
call
                        _            -> Maybe ForeignCall
forall a. Maybe a
Nothing
isDataConWorkId :: Id -> Bool
isDataConWorkId id :: Id
id = case Id -> IdDetails
Var.idDetails Id
id of
                        DataConWorkId _ -> Bool
True
                        _               -> Bool
False
isDataConWorkId_maybe :: Id -> Maybe DataCon
isDataConWorkId_maybe id :: Id
id = case Id -> IdDetails
Var.idDetails Id
id of
                        DataConWorkId con :: DataCon
con -> DataCon -> Maybe DataCon
forall a. a -> Maybe a
Just DataCon
con
                        _                 -> Maybe DataCon
forall a. Maybe a
Nothing
isDataConId_maybe :: Id -> Maybe DataCon
isDataConId_maybe :: Id -> Maybe DataCon
isDataConId_maybe id :: Id
id = case Id -> IdDetails
Var.idDetails Id
id of
                         DataConWorkId con :: DataCon
con -> DataCon -> Maybe DataCon
forall a. a -> Maybe a
Just DataCon
con
                         DataConWrapId con :: DataCon
con -> DataCon -> Maybe DataCon
forall a. a -> Maybe a
Just DataCon
con
                         _                 -> Maybe DataCon
forall a. Maybe a
Nothing
isJoinId :: Var -> Bool
isJoinId :: Id -> Bool
isJoinId id :: Id
id
  | Id -> Bool
isId Id
id = case Id -> IdDetails
Var.idDetails Id
id of
                JoinId {} -> Bool
True
                _         -> Bool
False
  | Bool
otherwise = Bool
False
isJoinId_maybe :: Var -> Maybe JoinArity
isJoinId_maybe :: Id -> Maybe Int
isJoinId_maybe id :: Id
id
 | Id -> Bool
isId Id
id  = ASSERT2( isId id, ppr id )
              case Id -> IdDetails
Var.idDetails Id
id of
                JoinId arity :: Int
arity -> Int -> Maybe Int
forall a. a -> Maybe a
Just Int
arity
                _            -> 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 = 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 "idDataCon" (Id -> SDoc
forall a. Outputable a => a -> SDoc
ppr Id
id)
hasNoBinding :: Id -> Bool
hasNoBinding :: Id -> Bool
hasNoBinding id :: Id
id = case Id -> IdDetails
Var.idDetails Id
id of
                        PrimOpId _       -> Bool
False   
                        FCallId _        -> Bool
True
                        DataConWorkId dc :: DataCon
dc -> DataCon -> Bool
isUnboxedTupleCon DataCon
dc Bool -> Bool -> Bool
|| DataCon -> Bool
isUnboxedSumCon DataCon
dc
                        _                -> Unfolding -> Bool
isCompulsoryUnfolding (Id -> Unfolding
idUnfolding Id
id)
                                            
isImplicitId :: Id -> Bool
isImplicitId :: Id -> Bool
isImplicitId id :: 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
                
                
                
                
        _               -> Bool
False
idIsFrom :: Module -> Id -> Bool
idIsFrom :: Module -> Id -> Bool
idIsFrom mod :: Module
mod id :: Id
id = Module -> Name -> Bool
nameIsLocalOrFrom Module
mod (Id -> Name
idName Id
id)
isDeadBinder :: Id -> Bool
isDeadBinder :: Id -> Bool
isDeadBinder bndr :: Id
bndr | Id -> Bool
isId Id
bndr = OccInfo -> Bool
isDeadOcc (Id -> OccInfo
idOccInfo Id
bndr)
                  | Bool
otherwise = Bool
False   
isEvVar :: Var -> Bool
isEvVar :: Id -> Bool
isEvVar var :: Id
var = Kind -> Bool
isEvVarType (Id -> Kind
varType Id
var)
isDictId :: Id -> Bool
isDictId :: Id -> Bool
isDictId id :: Id
id = Kind -> Bool
isDictTy (Id -> Kind
idType Id
id)
idJoinArity :: JoinId -> JoinArity
idJoinArity :: Id -> Int
idJoinArity id :: 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 "idJoinArity" (Id -> SDoc
forall a. Outputable a => a -> SDoc
ppr Id
id)
asJoinId :: Id -> JoinArity -> JoinId
asJoinId :: Id -> Int -> Id
asJoinId id :: Id
id arity :: 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
id = case Id -> IdDetails
Var.idDetails Id
id of
                              VanillaId -> Bool
True
                              JoinId {} -> Bool
True
                              _         -> Bool
False
zapJoinId :: Id -> Id
zapJoinId :: Id -> Id
zapJoinId jid :: 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
id (Just arity :: Int
arity) = Id -> Int -> Id
asJoinId Id
id Int
arity
asJoinId_maybe id :: Id
id Nothing      = Id -> Id
zapJoinId Id
id
        
        
idArity :: Id -> Arity
idArity :: Id -> Int
idArity id :: Id
id = IdInfo -> Int
arityInfo (HasDebugCallStack => Id -> IdInfo
Id -> IdInfo
idInfo Id
id)
setIdArity :: Id -> Arity -> Id
setIdArity :: Id -> Int -> Id
setIdArity id :: Id
id arity :: 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
id = IdInfo -> Int
callArityInfo (HasDebugCallStack => Id -> IdInfo
Id -> IdInfo
idInfo Id
id)
setIdCallArity :: Id -> Arity -> Id
setIdCallArity :: Id -> Int -> Id
setIdCallArity id :: Id
id arity :: 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 x :: Id
x = Int -> Kind -> Int
countFunRepArgs (Id -> Int
idArity Id
x) (Id -> Kind
idType Id
x)
isBottomingId :: Var -> Bool
isBottomingId :: Id -> Bool
isBottomingId v :: 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
id = IdInfo -> StrictSig
strictnessInfo (HasDebugCallStack => Id -> IdInfo
Id -> IdInfo
idInfo Id
id)
setIdStrictness :: Id -> StrictSig -> Id
setIdStrictness :: Id -> StrictSig -> Id
setIdStrictness id :: Id
id sig :: 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
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
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
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
id = IdInfo -> Unfolding
unfoldingInfo (HasDebugCallStack => Id -> IdInfo
Id -> IdInfo
idInfo Id
id)
setIdUnfolding :: Id -> Unfolding -> Id
setIdUnfolding :: Id -> Unfolding -> Id
setIdUnfolding id :: Id
id unfolding :: 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
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
id dmd :: 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 str :: StrictnessMark
str id :: 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
id = IdInfo -> RuleInfo
ruleInfo (HasDebugCallStack => Id -> IdInfo
Id -> IdInfo
idInfo Id
id)
idCoreRules :: Id -> [CoreRule]
idCoreRules :: Id -> [CoreRule]
idCoreRules id :: Id
id = RuleInfo -> [CoreRule]
ruleInfoRules (Id -> RuleInfo
idSpecialisation Id
id)
idHasRules :: Id -> Bool
idHasRules :: Id -> Bool
idHasRules id :: Id
id = Bool -> Bool
not (RuleInfo -> Bool
isEmptyRuleInfo (Id -> RuleInfo
idSpecialisation Id
id))
setIdSpecialisation :: Id -> RuleInfo -> Id
setIdSpecialisation :: Id -> RuleInfo -> Id
setIdSpecialisation id :: Id
id spec_info :: 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
id = IdInfo -> CafInfo
cafInfo (HasDebugCallStack => Id -> IdInfo
Id -> IdInfo
idInfo Id
id)
setIdCafInfo :: Id -> CafInfo -> Id
setIdCafInfo :: Id -> CafInfo -> Id
setIdCafInfo id :: Id
id caf_info :: 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
id = IdInfo -> OccInfo
occInfo (HasDebugCallStack => Id -> IdInfo
Id -> IdInfo
idInfo Id
id)
setIdOccInfo :: Id -> OccInfo -> Id
setIdOccInfo :: Id -> OccInfo -> Id
setIdOccInfo id :: Id
id occ_info :: 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 b :: Id
b = Id
b Id -> OccInfo -> Id
`setIdOccInfo` OccInfo
noOccInfo
idInlinePragma :: Id -> InlinePragma
idInlinePragma :: Id -> InlinePragma
idInlinePragma id :: Id
id = IdInfo -> InlinePragma
inlinePragInfo (HasDebugCallStack => Id -> IdInfo
Id -> IdInfo
idInfo Id
id)
setInlinePragma :: Id -> InlinePragma -> Id
setInlinePragma :: Id -> InlinePragma -> Id
setInlinePragma id :: Id
id prag :: 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
id fn :: InlinePragma -> InlinePragma
fn = HasDebugCallStack => (IdInfo -> IdInfo) -> Id -> Id
(IdInfo -> IdInfo) -> Id -> Id
modifyIdInfo (\info :: 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
id = InlinePragma -> Activation
inlinePragmaActivation (Id -> InlinePragma
idInlinePragma Id
id)
setInlineActivation :: Id -> Activation -> Id
setInlineActivation :: Id -> Activation -> Id
setInlineActivation id :: Id
id act :: Activation
act = Id -> (InlinePragma -> InlinePragma) -> Id
modifyInlinePragma Id
id (\prag :: InlinePragma
prag -> InlinePragma -> Activation -> InlinePragma
setInlinePragmaActivation InlinePragma
prag Activation
act)
idRuleMatchInfo :: Id -> RuleMatchInfo
idRuleMatchInfo :: Id -> RuleMatchInfo
idRuleMatchInfo id :: Id
id = InlinePragma -> RuleMatchInfo
inlinePragmaRuleMatchInfo (Id -> InlinePragma
idInlinePragma Id
id)
isConLikeId :: Id -> Bool
isConLikeId :: Id -> Bool
isConLikeId id :: 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
id = IdInfo -> OneShotInfo
oneShotInfo (HasDebugCallStack => Id -> IdInfo
Id -> IdInfo
idInfo Id
id)
idStateHackOneShotInfo :: Id -> OneShotInfo
idStateHackOneShotInfo :: Id -> OneShotInfo
idStateHackOneShotInfo id :: 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 var :: 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 ty :: Kind
ty
   | Kind -> Bool
isStateHackType Kind
ty = OneShotInfo
stateHackOneShot
   | Bool
otherwise          = OneShotInfo
NoOneShotInfo
isStateHackType :: Type -> Bool
isStateHackType :: Kind -> Bool
isStateHackType ty :: 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 -> TyCon -> Bool
forall a. Eq a => a -> a -> Bool
== TyCon
statePrimTyCon
        _          -> Bool
False
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
isProbablyOneShotLambda :: Id -> Bool
isProbablyOneShotLambda :: Id -> Bool
isProbablyOneShotLambda id :: Id
id = case Id -> OneShotInfo
idStateHackOneShotInfo Id
id of
                               OneShotLam    -> Bool
True
                               NoOneShotInfo -> Bool
False
setOneShotLambda :: Id -> Id
setOneShotLambda :: Id -> Id
setOneShotLambda id :: 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
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
id one_shot :: 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
id one_shot :: 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
                (NoOneShotInfo, _) -> Bool
True
                (OneShotLam,    _) -> Bool
False
zapInfo :: (IdInfo -> Maybe IdInfo) -> Id -> Id
zapInfo :: (IdInfo -> Maybe IdInfo) -> Id -> Id
zapInfo zapper :: IdInfo -> Maybe IdInfo
zapper id :: 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
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 old_id :: Id
old_id abstract_wrt :: [Id]
abstract_wrt new_id :: 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 new_info :: 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