Haskell. [WDP 94/11])
\begin{code}
+{-# OPTIONS -w #-}
+-- The above warning supression flag is a temporary kludge.
+-- While working on this module you are encouraged to remove it and fix
+-- any warnings in the module. See
+-- http://hackage.haskell.org/trac/ghc/wiki/Commentary/CodingStyle#Warnings
+-- for details
+
module IdInfo (
GlobalIdDetails(..), notGlobalId, -- Not abstract
= 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]
%************************************************************************
\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
+
+
%************************************************************************
%* *
-- The "unsafe" occ info is the ones that say I'm not in a lambda
-- because that might not be true for an unsaturated lambda
is_safe_occ (OneOcc in_lam _ _) = in_lam
- is_safe_occ other = True
+ is_safe_occ _other = True
safe_occ = case occ of
OneOcc _ once int_cxt -> OneOcc insideLam once int_cxt
- other -> occ
+ _other -> occ
is_safe_dmd Nothing = True
is_safe_dmd (Just dmd) = not (isStrictDmd dmd)
\begin{code}
zapFragileInfo :: IdInfo -> Maybe IdInfo
-zapFragileInfo info = Just (info `setSpecInfo` emptySpecInfo
- `setUnfoldingInfo` NoUnfolding)
+-- Zap info that depends on free variables
+zapFragileInfo info
+ = Just (info `setSpecInfo` emptySpecInfo
+ `setWorkerInfo` NoWorker
+ `setUnfoldingInfo` NoUnfolding
+ `setOccInfo` if isFragileOcc occ then NoOccInfo else occ)
+ where
+ occ = occInfo info
\end{code}
%************************************************************************
type TickBoxId = Int
data TickBoxOp
- = TickBox Module !TickBoxId -- ^Tick box for Hpc-style coverage,
- -- type = State# Void#
- | BinaryTickBox Module !TickBoxId !TickBoxId
- -- ^Binary tick box, with a tick for result = True, result = False,
- -- type = Bool -> Bool
+ = TickBox Module {-# UNPACK #-} !TickBoxId
+ -- ^Tick box for Hpc-style coverage
+
instance Outputable TickBoxOp where
ppr (TickBox mod n) = ptext SLIT("tick") <+> ppr (mod,n)
- ppr (BinaryTickBox mod t f) = ptext SLIT("btick") <+> ppr (mod,t,f)
\end{code}