%
+% (c) The University of Glasgow 2006
% (c) The GRASP/AQUA Project, Glasgow University, 1993-1998
%
\section[IdInfo]{@IdInfos@: Non-essential information about @Ids@}
seqIdInfo, megaSeqIdInfo,
-- Zapping
- zapLamInfo, zapDemandInfo,
+ zapLamInfo, zapDemandInfo, zapFragileInfo,
-- Arity
ArityInfo,
CafInfo(..), cafInfo, ppCafInfo, setCafInfo, mayHaveCafRefs,
-- Lambda-bound variable info
- LBVarInfo(..), lbvarInfo, setLBVarInfo, noLBVarInfo, hasNoLBVarInfo
+ LBVarInfo(..), lbvarInfo, setLBVarInfo, noLBVarInfo, hasNoLBVarInfo,
+
+ -- Tick-box info
+ TickBoxOp(..), TickBoxId,
) where
#include "HsVersions.h"
-
import CoreSyn
-import Class ( Class )
-import PrimOp ( PrimOp )
-import Var ( Id )
-import VarSet ( VarSet, emptyVarSet, seqVarSet )
-import BasicTypes ( OccInfo(..), isFragileOcc, isDeadOcc, seqOccInfo, isLoopBreaker,
- InsideLam, insideLam, notInsideLam,
- OneBranch, oneBranch, notOneBranch,
- Arity,
- Activation(..)
- )
-import DataCon ( DataCon )
-import TyCon ( TyCon, FieldLabel )
-import ForeignCall ( ForeignCall )
+import Class
+import PrimOp
+import Var
+import VarSet
+import BasicTypes
+import DataCon
+import TyCon
+import ForeignCall
import NewDemand
import Outputable
-import Maybe ( isJust )
+import Module
+
+import Data.Maybe
#ifdef OLD_STRICTNESS
-import Name ( Name )
-import Demand hiding( Demand, seqDemand )
+import Name
+import Demand
import qualified Demand
-import Util ( listLengthCmp )
-import List ( replicate )
+import Util
+import Data.List
#endif
-- infixl so you can say (id `set` a `set` b)
%************************************************************************
%* *
-\subsection{GlobalIdDetails
+\subsection{GlobalIdDetails}
%* *
%************************************************************************
= VanillaGlobal -- Imported from elsewhere, a default method Id.
| RecordSelId -- The Id for a record selector
- { sel_tycon :: TyCon
+ { sel_tycon :: TyCon -- For a data type family, this is the *instance* TyCon
+ -- not the family TyCon
, sel_label :: FieldLabel
, sel_naughty :: Bool -- True <=> naughty
} -- See Note [Naughty record selectors]
| PrimOpId PrimOp -- The Id for a primitive operator
| FCallId ForeignCall -- The Id for a foreign call
+ | TickBoxOpId TickBoxOp -- The Id for a tick box (both traditional and binary)
+
| NotGlobalId -- Used as a convenient extra return value from globalIdDetails
notGlobalId = NotGlobalId
ppr (ClassOpId _) = ptext SLIT("[ClassOp]")
ppr (PrimOpId _) = ptext SLIT("[PrimOp]")
ppr (FCallId _) = ptext SLIT("[ForeignCall]")
+ ppr (TickBoxOpId _) = ptext SLIT("[TickBoxOp]")
ppr (RecordSelId {}) = ptext SLIT("[RecSel]")
\end{code}
%************************************************************************
\begin{code}
--- CoreRules is used only in an idSpecialisation (move to IdInfo?)
data SpecInfo
- = SpecInfo [CoreRule] VarSet -- Locally-defined free vars of RHSs
+ = SpecInfo
+ [CoreRule]
+ VarSet -- Locally-defined free vars of *both* LHS and RHS of rules
+ -- Note [Rule dependency info]
emptySpecInfo :: SpecInfo
emptySpecInfo = SpecInfo [] emptyVarSet
seqSpecInfo (SpecInfo rules fvs) = seqRules rules `seq` seqVarSet fvs
\end{code}
+Note [Rule dependency info]
+~~~~~~~~~~~~~~~~~~~~~~~~~~~
+THe VarSet in a SpecInfo is used for dependency analysis in the
+occurrence analyser. We must track free vars in *both* lhs and rhs. Why both?
+Consider
+ x = y
+ RULE f x = 4
+Then if we substitute y for x, we'd better do so in the
+ rule's LHS too, so we'd better ensure the dependency is respsected
+
+
%************************************************************************
%* *
| otherwise = Nothing
\end{code}
+\begin{code}
+zapFragileInfo :: IdInfo -> Maybe IdInfo
+-- Zap info that depends on free variables
+zapFragileInfo info = Just (info `setSpecInfo` emptySpecInfo
+ `setWorkerInfo` NoWorker
+ `setUnfoldingInfo` NoUnfolding)
+\end{code}
+
+%************************************************************************
+%* *
+\subsection{TickBoxOp}
+%* *
+%************************************************************************
+
+\begin{code}
+type TickBoxId = Int
+
+data TickBoxOp
+ = TickBox Module {-# UNPACK #-} !TickBoxId
+ -- ^Tick box for Hpc-style coverage
+
+instance Outputable TickBoxOp where
+ ppr (TickBox mod n) = ptext SLIT("tick") <+> ppr (mod,n)
+\end{code}