[project @ 2000-03-23 17:45:17 by simonpj]
[ghc-hetmet.git] / ghc / compiler / basicTypes / Id.lhs
index 814fcb7..389631a 100644 (file)
@@ -22,18 +22,19 @@ module Id (
        zapFragileIdInfo, zapLamIdInfo,
 
        -- Predicates
-       omitIfaceSigForId,
+       omitIfaceSigForId, isDeadBinder,
        exportWithOrigOccName,
        externallyVisibleId,
        idFreeTyVars,
        isIP,
 
        -- Inline pragma stuff
-       getInlinePragma, setInlinePragma, modifyInlinePragma, 
+       idInlinePragma, setInlinePragma, modifyInlinePragma, 
 
        isSpecPragmaId, isRecordSelector,
-       isPrimitiveId_maybe, isDataConId_maybe,
-       isConstantId, isConstantId_maybe, isBottomingId, idAppIsBottom,
+       isPrimOpId, isPrimOpId_maybe, 
+       isDataConId, isDataConId_maybe, isDataConWrapId, isDataConWrapId_maybe,
+       isBottomingId,
        isExportedId, isUserExportedId,
        mayHaveNoBinding,
 
@@ -42,7 +43,7 @@ module Id (
 
        -- IdInfo stuff
        setIdUnfolding,
-       setIdArity,
+       setIdArityInfo,
        setIdDemandInfo,
        setIdStrictness,
        setIdWorkerInfo,
@@ -52,16 +53,18 @@ module Id (
        setIdCprInfo,
        setIdOccInfo,
 
-       getIdArity,
-       getIdDemandInfo,
-       getIdStrictness,
-       getIdWorkerInfo,
-       getIdUnfolding,
-       getIdSpecialisation,
-       getIdUpdateInfo,
-       getIdCafInfo,
-       getIdCprInfo,
-       getIdOccInfo
+       idArity, idArityInfo, 
+       idFlavour,
+       idDemandInfo,
+       idStrictness,
+       idWorkerInfo,
+       idUnfolding,
+       idSpecialisation,
+       idUpdateInfo,
+       idCafInfo,
+       idCprInfo,
+       idLBVarInfo,
+       idOccInfo
 
     ) where
 
@@ -70,6 +73,7 @@ module Id (
 import {-# SOURCE #-} CoreUnfold ( Unfolding )
 import {-# SOURCE #-} CoreSyn    ( CoreRules )
 
+import BasicTypes      ( Arity )
 import Var             ( Id, DictId,
                          isId, mkIdVar,
                          idName, idType, idUnique, idInfo,
@@ -89,9 +93,8 @@ import Name           ( Name, OccName,
                          getOccName, isIPOcc
                        ) 
 import OccName         ( UserFS )
-import Const           ( Con(..) )
 import PrimRep         ( PrimRep )
-import PrimOp          ( PrimOp )
+import PrimOp          ( PrimOp, primOpIsCheap )
 import TysPrim         ( statePrimTyCon )
 import FieldLabel      ( FieldLabel(..) )
 import SrcLoc          ( SrcLoc )
@@ -99,15 +102,15 @@ import Unique              ( Unique, mkBuiltinUnique, getBuiltinUniques )
 import Outputable
 
 infixl         1 `setIdUnfolding`,
-         `setIdArity`,
+         `setIdArityInfo`,
          `setIdDemandInfo`,
          `setIdStrictness`,
          `setIdWorkerInfo`,
          `setIdSpecialisation`,
          `setIdUpdateInfo`,
          `setInlinePragma`,
-         `getIdCafInfo`,
-         `getIdCprInfo`
+         `idCafInfo`,
+         `idCprInfo`
 
        -- infixl so you can say (id `set` a `set` b)
 \end{code}
@@ -207,27 +210,38 @@ isRecordSelector id = case idFlavour id of
                        RecordSelId lbl -> True
                        other           -> False
 
-isPrimitiveId_maybe id = case idFlavour id of
-                           ConstantId (PrimOp op) -> Just op
-                           other                  -> Nothing
+isPrimOpId id = case idFlavour id of
+                   PrimOpId op -> True
+                   other       -> False
+
+isPrimOpId_maybe id = case idFlavour id of
+                           PrimOpId op -> Just op
+                           other       -> Nothing
+
+isDataConId id = case idFlavour id of
+                       DataConId _ -> True
+                       other       -> False
 
 isDataConId_maybe id = case idFlavour id of
-                         ConstantId (DataCon con) -> Just con
-                         other                    -> Nothing
+                         DataConId con -> Just con
+                         other         -> Nothing
 
-isConstantId id = case idFlavour id of
-                   ConstantId _ -> True
-                   other        -> False
+isDataConWrapId_maybe id = case idFlavour id of
+                                 DataConWrapId con -> Just con
+                                 other             -> Nothing
 
-isConstantId_maybe id = case idFlavour id of
-                         ConstantId const -> Just const
-                         other            -> Nothing
+isDataConWrapId id = case idFlavour id of
+                       DataConWrapId con -> True
+                       other             -> False
 
 isSpecPragmaId id = case idFlavour id of
                        SpecPragmaId -> True
                        other        -> False
 
-mayHaveNoBinding id = isConstantId id
+mayHaveNoBinding id = case idFlavour id of
+                       DataConId _ -> True
+                       PrimOpId _  -> True
+                       other       -> False
        -- mayHaveNoBinding returns True of an Id which may not have a
        -- binding, even though it is defined in this module.  Notably,
        -- the constructors of a dictionary are in this situation.
@@ -261,9 +275,11 @@ omitIfaceSigForId id
 
   | otherwise
   = case idFlavour id of
-       RecordSelId _  -> True  -- Includes dictionary selectors
-        ConstantId _   -> True
-               -- ConstantIds are implied by their type or class decl;
+       RecordSelId _   -> True -- Includes dictionary selectors
+        PrimOpId _      -> True
+        DataConId _     -> True
+       DataConWrapId _ -> True
+               -- These are are implied by their type or class decl;
                -- remember that all type and class decls appear in the interface file.
                -- The dfun id must *not* be omitted, because it carries version info for
                -- the instance decl
@@ -275,12 +291,19 @@ omitIfaceSigForId id
 -- or an explicit user export.
 exportWithOrigOccName :: Id -> Bool
 exportWithOrigOccName id = omitIfaceSigForId id || isUserExportedId id
+\end{code}
+
+\begin{code}
+isDeadBinder :: Id -> Bool
+isDeadBinder bndr | isId bndr = case idOccInfo bndr of
+                                       IAmDead -> True
+                                       other   -> False
+                 | otherwise = False   -- TyVars count as not dead
 
 isIP id = isIPOcc (getOccName id)
 \end{code}
 
 
-
 %************************************************************************
 %*                                                                     *
 \subsection{IdInfo stuff}
@@ -290,87 +313,87 @@ isIP id = isIPOcc (getOccName id)
 \begin{code}
        ---------------------------------
        -- ARITY
-getIdArity :: Id -> ArityInfo
-getIdArity id = arityInfo (idInfo id)
+idArityInfo :: Id -> ArityInfo
+idArityInfo id = arityInfo (idInfo id)
+
+idArity :: Id -> Arity
+idArity id = arityLowerBound (idArityInfo id)
 
-setIdArity :: Id -> ArityInfo -> Id
-setIdArity id arity = modifyIdInfo (`setArityInfo` arity) id
+setIdArityInfo :: Id -> ArityInfo -> Id
+setIdArityInfo id arity = modifyIdInfo (`setArityInfo` arity) id
 
        ---------------------------------
        -- STRICTNESS
-getIdStrictness :: Id -> StrictnessInfo
-getIdStrictness id = strictnessInfo (idInfo id)
+idStrictness :: Id -> StrictnessInfo
+idStrictness id = strictnessInfo (idInfo id)
 
 setIdStrictness :: Id -> StrictnessInfo -> Id
 setIdStrictness id strict_info = modifyIdInfo (`setStrictnessInfo` strict_info) id
 
 -- isBottomingId returns true if an application to n args would diverge
 isBottomingId :: Id -> Bool
-isBottomingId id = isBottomingStrictness (strictnessInfo (idInfo id))
-
-idAppIsBottom :: Id -> Int -> Bool
-idAppIsBottom id n = appIsBottom (strictnessInfo (idInfo id)) n
+isBottomingId id = isBottomingStrictness (idStrictness id)
 
        ---------------------------------
        -- WORKER ID
-getIdWorkerInfo :: Id -> WorkerInfo
-getIdWorkerInfo id = workerInfo (idInfo id)
+idWorkerInfo :: Id -> WorkerInfo
+idWorkerInfo id = workerInfo (idInfo id)
 
 setIdWorkerInfo :: Id -> WorkerInfo -> Id
 setIdWorkerInfo id work_info = modifyIdInfo (`setWorkerInfo` work_info) id
 
        ---------------------------------
        -- UNFOLDING
-getIdUnfolding :: Id -> Unfolding
-getIdUnfolding id = unfoldingInfo (idInfo id)
+idUnfolding :: Id -> Unfolding
+idUnfolding id = unfoldingInfo (idInfo id)
 
 setIdUnfolding :: Id -> Unfolding -> Id
 setIdUnfolding id unfolding = modifyIdInfo (`setUnfoldingInfo` unfolding) id
 
        ---------------------------------
        -- DEMAND
-getIdDemandInfo :: Id -> Demand
-getIdDemandInfo id = demandInfo (idInfo id)
+idDemandInfo :: Id -> Demand
+idDemandInfo id = demandInfo (idInfo id)
 
 setIdDemandInfo :: Id -> Demand -> Id
 setIdDemandInfo id demand_info = modifyIdInfo (`setDemandInfo` demand_info) id
 
        ---------------------------------
        -- UPDATE INFO
-getIdUpdateInfo :: Id -> UpdateInfo
-getIdUpdateInfo id = updateInfo (idInfo id)
+idUpdateInfo :: Id -> UpdateInfo
+idUpdateInfo id = updateInfo (idInfo id)
 
 setIdUpdateInfo :: Id -> UpdateInfo -> Id
 setIdUpdateInfo id upd_info = modifyIdInfo (`setUpdateInfo` upd_info) id
 
        ---------------------------------
        -- SPECIALISATION
-getIdSpecialisation :: Id -> CoreRules
-getIdSpecialisation id = specInfo (idInfo id)
+idSpecialisation :: Id -> CoreRules
+idSpecialisation id = specInfo (idInfo id)
 
 setIdSpecialisation :: Id -> CoreRules -> Id
 setIdSpecialisation id spec_info = modifyIdInfo (`setSpecInfo` spec_info) id
 
        ---------------------------------
        -- CAF INFO
-getIdCafInfo :: Id -> CafInfo
-getIdCafInfo id = cafInfo (idInfo id)
+idCafInfo :: Id -> CafInfo
+idCafInfo id = cafInfo (idInfo id)
 
 setIdCafInfo :: Id -> CafInfo -> Id
 setIdCafInfo id caf_info = modifyIdInfo (`setCafInfo` caf_info) id
 
        ---------------------------------
        -- CPR INFO
-getIdCprInfo :: Id -> CprInfo
-getIdCprInfo id = cprInfo (idInfo id)
+idCprInfo :: Id -> CprInfo
+idCprInfo id = cprInfo (idInfo id)
 
 setIdCprInfo :: Id -> CprInfo -> Id
 setIdCprInfo id cpr_info = modifyIdInfo (`setCprInfo` cpr_info) id
 
        ---------------------------------
        -- Occcurrence INFO
-getIdOccInfo :: Id -> OccInfo
-getIdOccInfo id = occInfo (idInfo id)
+idOccInfo :: Id -> OccInfo
+idOccInfo id = occInfo (idInfo id)
 
 setIdOccInfo :: Id -> OccInfo -> Id
 setIdOccInfo id occ_info = modifyIdInfo (`setOccInfo` occ_info) id
@@ -383,8 +406,8 @@ The inline pragma tells us to be very keen to inline this Id, but it's still
 OK not to if optimisation is switched off.
 
 \begin{code}
-getInlinePragma :: Id -> InlinePragInfo
-getInlinePragma id = inlinePragInfo (idInfo id)
+idInlinePragma :: Id -> InlinePragInfo
+idInlinePragma id = inlinePragInfo (idInfo id)
 
 setInlinePragma :: Id -> InlinePragInfo -> Id
 setInlinePragma id prag = modifyIdInfo (`setInlinePragInfo` prag) id
@@ -397,8 +420,11 @@ modifyInlinePragma id fn = modifyIdInfo (\info -> info `setInlinePragInfo` (fn (
        ---------------------------------
        -- ONE-SHOT LAMBDAS
 \begin{code}
+idLBVarInfo :: Id -> LBVarInfo
+idLBVarInfo id = lbvarInfo (idInfo id)
+
 isOneShotLambda :: Id -> Bool
-isOneShotLambda id = case lbvarInfo (idInfo id) of
+isOneShotLambda id = case idLBVarInfo id of
                        IsOneShotLambda -> True
                        NoLBVarInfo     -> case splitTyConApp_maybe (idType id) of
                                                Just (tycon,_) -> tycon == statePrimTyCon