2 % (c) The GRASP/AQUA Project, Glasgow University, 1993-1998
4 \section[IdInfo]{@IdInfos@: Non-essential information about @Ids@}
6 (And a pretty good illustration of quite a few things wrong with
11 GlobalIdDetails(..), notGlobalId, -- Not abstract
14 vanillaIdInfo, noCafIdInfo,
15 seqIdInfo, megaSeqIdInfo,
18 zapLamInfo, zapDemandInfo,
23 arityInfo, setArityInfo, ppArityInfo,
25 -- New demand and strictness info
26 newStrictnessInfo, setNewStrictnessInfo,
27 newDemandInfo, setNewDemandInfo, pprNewStrictness,
31 -- Strictness; imported from Demand
33 mkStrictnessInfo, noStrictnessInfo,
34 ppStrictnessInfo,isBottomingStrictness,
38 WorkerInfo(..), workerExists, wrapperArity, workerId,
39 workerInfo, setWorkerInfo, ppWorkerInfo,
42 unfoldingInfo, setUnfoldingInfo, setUnfoldingInfoLazily,
45 -- Old DemandInfo and StrictnessInfo
46 demandInfo, setDemandInfo,
47 strictnessInfo, setStrictnessInfo,
48 cprInfoFromNewStrictness,
49 oldStrictnessFromNew, newStrictnessFromOld,
52 -- Constructed Product Result Info
53 CprInfo(..), cprInfo, setCprInfo, ppCprInfo, noCprInfo,
58 inlinePragInfo, setInlinePragInfo,
61 OccInfo(..), isFragileOcc, isDeadOcc, isLoopBreaker,
62 InsideLam, OneBranch, insideLam, notInsideLam, oneBranch, notOneBranch,
66 specInfo, setSpecInfo,
69 CafInfo(..), cafInfo, ppCafInfo, setCafInfo, mayHaveCafRefs,
71 -- Lambda-bound variable info
72 LBVarInfo(..), lbvarInfo, setLBVarInfo, noLBVarInfo, hasNoLBVarInfo
75 #include "HsVersions.h"
79 import Class ( Class )
80 import PrimOp ( PrimOp )
82 import BasicTypes ( OccInfo(..), isFragileOcc, isDeadOcc, seqOccInfo, isLoopBreaker,
83 InsideLam, insideLam, notInsideLam,
84 OneBranch, oneBranch, notOneBranch,
88 import DataCon ( DataCon )
89 import TyCon ( TyCon, FieldLabel )
90 import ForeignCall ( ForeignCall )
93 import Maybe ( isJust )
97 import Demand hiding( Demand, seqDemand )
98 import qualified Demand
99 import Util ( listLengthCmp )
100 import List ( replicate )
103 -- infixl so you can say (id `set` a `set` b)
104 infixl 1 `setSpecInfo`,
112 `setNewStrictnessInfo`,
113 `setAllStrictnessInfo`,
115 #ifdef OLD_STRICTNESS
118 , `setStrictnessInfo`
122 %************************************************************************
124 \subsection{New strictness info}
126 %************************************************************************
131 -- setAllStrictnessInfo :: IdInfo -> Maybe StrictSig -> IdInfo
132 -- Set old and new strictness info
133 setAllStrictnessInfo info Nothing
134 = info { newStrictnessInfo = Nothing
135 #ifdef OLD_STRICTNESS
136 , strictnessInfo = NoStrictnessInfo
137 , cprInfo = NoCPRInfo
141 setAllStrictnessInfo info (Just sig)
142 = info { newStrictnessInfo = Just sig
143 #ifdef OLD_STRICTNESS
144 , strictnessInfo = oldStrictnessFromNew sig
145 , cprInfo = cprInfoFromNewStrictness sig
149 seqNewStrictnessInfo Nothing = ()
150 seqNewStrictnessInfo (Just ty) = seqStrictSig ty
152 pprNewStrictness Nothing = empty
153 pprNewStrictness (Just sig) = ftext FSLIT("Str:") <+> ppr sig
155 #ifdef OLD_STRICTNESS
156 oldStrictnessFromNew :: StrictSig -> Demand.StrictnessInfo
157 oldStrictnessFromNew sig = mkStrictnessInfo (map oldDemand dmds, isBotRes res_info)
159 (dmds, res_info) = splitStrictSig sig
161 cprInfoFromNewStrictness :: StrictSig -> CprInfo
162 cprInfoFromNewStrictness sig = case strictSigResInfo sig of
166 newStrictnessFromOld :: Name -> Arity -> Demand.StrictnessInfo -> CprInfo -> StrictSig
167 newStrictnessFromOld name arity (Demand.StrictnessInfo ds res) cpr
168 | listLengthCmp ds arity /= GT -- length ds <= arity
169 -- Sometimes the old strictness analyser has more
170 -- demands than the arity justifies
171 = mk_strict_sig name arity $
172 mkTopDmdType (map newDemand ds) (newRes res cpr)
174 newStrictnessFromOld name arity other cpr
175 = -- Either no strictness info, or arity is too small
176 -- In either case we can't say anything useful
177 mk_strict_sig name arity $
178 mkTopDmdType (replicate arity lazyDmd) (newRes False cpr)
180 mk_strict_sig name arity dmd_ty
181 = WARN( arity /= dmdTypeDepth dmd_ty, ppr name <+> (ppr arity $$ ppr dmd_ty) )
184 newRes True _ = BotRes
185 newRes False ReturnsCPR = retCPR
186 newRes False NoCPRInfo = TopRes
188 newDemand :: Demand.Demand -> NewDemand.Demand
189 newDemand (WwLazy True) = Abs
190 newDemand (WwLazy False) = lazyDmd
191 newDemand WwStrict = evalDmd
192 newDemand (WwUnpack unpk ds) = Eval (Prod (map newDemand ds))
193 newDemand WwPrim = lazyDmd
194 newDemand WwEnum = evalDmd
196 oldDemand :: NewDemand.Demand -> Demand.Demand
197 oldDemand Abs = WwLazy True
198 oldDemand Top = WwLazy False
199 oldDemand Bot = WwStrict
200 oldDemand (Box Bot) = WwStrict
201 oldDemand (Box Abs) = WwLazy False
202 oldDemand (Box (Eval _)) = WwStrict -- Pass box only
203 oldDemand (Defer d) = WwLazy False
204 oldDemand (Eval (Prod ds)) = WwUnpack True (map oldDemand ds)
205 oldDemand (Eval (Poly _)) = WwStrict
206 oldDemand (Call _) = WwStrict
208 #endif /* OLD_STRICTNESS */
213 seqNewDemandInfo Nothing = ()
214 seqNewDemandInfo (Just dmd) = seqDemand dmd
218 %************************************************************************
220 \subsection{GlobalIdDetails
222 %************************************************************************
224 This type is here (rather than in Id.lhs) mainly because there's
225 an IdInfo.hi-boot, but no Id.hi-boot, and GlobalIdDetails is imported
226 (recursively) by Var.lhs.
230 = VanillaGlobal -- Imported from elsewhere, a default method Id.
232 | RecordSelId TyCon FieldLabel -- The Id for a record selector
234 | DataConWorkId DataCon -- The Id for a data constructor *worker*
235 | DataConWrapId DataCon -- The Id for a data constructor *wrapper*
236 -- [the only reasons we need to know is so that
237 -- a) we can suppress printing a definition in the interface file
238 -- b) when typechecking a pattern we can get from the
239 -- Id back to the data con]
241 | ClassOpId Class -- An operation of a class
243 | PrimOpId PrimOp -- The Id for a primitive operator
244 | FCallId ForeignCall -- The Id for a foreign call
246 | NotGlobalId -- Used as a convenient extra return value from globalIdDetails
248 notGlobalId = NotGlobalId
250 instance Outputable GlobalIdDetails where
251 ppr NotGlobalId = ptext SLIT("[***NotGlobalId***]")
252 ppr VanillaGlobal = ptext SLIT("[GlobalId]")
253 ppr (DataConWorkId _) = ptext SLIT("[DataCon]")
254 ppr (DataConWrapId _) = ptext SLIT("[DataConWrapper]")
255 ppr (ClassOpId _) = ptext SLIT("[ClassOp]")
256 ppr (PrimOpId _) = ptext SLIT("[PrimOp]")
257 ppr (FCallId _) = ptext SLIT("[ForeignCall]")
258 ppr (RecordSelId _ _) = ptext SLIT("[RecSel]")
262 %************************************************************************
264 \subsection{The main IdInfo type}
266 %************************************************************************
268 An @IdInfo@ gives {\em optional} information about an @Id@. If
269 present it never lies, but it may not be present, in which case there
270 is always a conservative assumption which can be made.
272 Two @Id@s may have different info even though they have the same
273 @Unique@ (and are hence the same @Id@); for example, one might lack
274 the properties attached to the other.
276 The @IdInfo@ gives information about the value, or definition, of the
277 @Id@. It does {\em not} contain information about the @Id@'s usage
278 (except for @DemandInfo@? ToDo). (@lbvarInfo@ is also a marginal
284 arityInfo :: !ArityInfo, -- Its arity
285 specInfo :: CoreRules, -- Specialisations of this function which exist
286 #ifdef OLD_STRICTNESS
287 cprInfo :: CprInfo, -- Function always constructs a product result
288 demandInfo :: Demand.Demand, -- Whether or not it is definitely demanded
289 strictnessInfo :: StrictnessInfo, -- Strictness properties
291 workerInfo :: WorkerInfo, -- Pointer to Worker Function
292 -- Within one module this is irrelevant; the
293 -- inlining of a worker is handled via the Unfolding
294 -- WorkerInfo is used *only* to indicate the form of
295 -- the RHS, so that interface files don't actually
296 -- need to contain the RHS; it can be derived from
297 -- the strictness info
299 unfoldingInfo :: Unfolding, -- Its unfolding
300 cafInfo :: CafInfo, -- CAF info
301 lbvarInfo :: LBVarInfo, -- Info about a lambda-bound variable
302 inlinePragInfo :: InlinePragInfo, -- Inline pragma
303 occInfo :: OccInfo, -- How it occurs
305 newStrictnessInfo :: Maybe StrictSig, -- Reason for Maybe: the DmdAnal phase needs to
306 -- know whether whether this is the first visit,
307 -- so it can assign botSig. Other customers want
308 -- topSig. So Nothing is good.
310 newDemandInfo :: Maybe Demand -- Similarly we want to know if there's no
311 -- known demand yet, for when we are looking for
315 seqIdInfo :: IdInfo -> ()
316 seqIdInfo (IdInfo {}) = ()
318 megaSeqIdInfo :: IdInfo -> ()
320 = seqRules (specInfo info) `seq`
321 seqWorker (workerInfo info) `seq`
323 -- Omitting this improves runtimes a little, presumably because
324 -- some unfoldings are not calculated at all
325 -- seqUnfolding (unfoldingInfo info) `seq`
327 seqNewDemandInfo (newDemandInfo info) `seq`
328 seqNewStrictnessInfo (newStrictnessInfo info) `seq`
330 #ifdef OLD_STRICTNESS
331 Demand.seqDemand (demandInfo info) `seq`
332 seqStrictnessInfo (strictnessInfo info) `seq`
333 seqCpr (cprInfo info) `seq`
336 seqCaf (cafInfo info) `seq`
337 seqLBVar (lbvarInfo info) `seq`
338 seqOccInfo (occInfo info)
344 setWorkerInfo info wk = wk `seq` info { workerInfo = wk }
345 setSpecInfo info sp = sp `seq` info { specInfo = sp }
346 setInlinePragInfo info pr = pr `seq` info { inlinePragInfo = pr }
347 setOccInfo info oc = oc `seq` info { occInfo = oc }
348 #ifdef OLD_STRICTNESS
349 setStrictnessInfo info st = st `seq` info { strictnessInfo = st }
351 -- Try to avoid spack leaks by seq'ing
353 setUnfoldingInfoLazily info uf -- Lazy variant to avoid looking at the
354 = -- unfolding of an imported Id unless necessary
355 info { unfoldingInfo = uf } -- (In this case the demand-zapping is redundant.)
357 setUnfoldingInfo info uf
358 -- We do *not* seq on the unfolding info, For some reason, doing so
359 -- actually increases residency significantly.
360 = info { unfoldingInfo = uf }
362 #ifdef OLD_STRICTNESS
363 setDemandInfo info dd = info { demandInfo = dd }
364 setCprInfo info cp = info { cprInfo = cp }
367 setArityInfo info ar = info { arityInfo = ar }
368 setCafInfo info caf = info { cafInfo = caf }
370 setLBVarInfo info lb = {-lb `seq`-} info { lbvarInfo = lb }
372 setNewDemandInfo info dd = dd `seq` info { newDemandInfo = dd }
373 setNewStrictnessInfo info dd = dd `seq` info { newStrictnessInfo = dd }
378 vanillaIdInfo :: IdInfo
381 cafInfo = vanillaCafInfo,
382 arityInfo = unknownArity,
383 #ifdef OLD_STRICTNESS
386 strictnessInfo = NoStrictnessInfo,
388 specInfo = emptyCoreRules,
389 workerInfo = NoWorker,
390 unfoldingInfo = noUnfolding,
391 lbvarInfo = NoLBVarInfo,
392 inlinePragInfo = AlwaysActive,
394 newDemandInfo = Nothing,
395 newStrictnessInfo = Nothing
398 noCafIdInfo = vanillaIdInfo `setCafInfo` NoCafRefs
399 -- Used for built-in type Ids in MkId.
403 %************************************************************************
405 \subsection[arity-IdInfo]{Arity info about an @Id@}
407 %************************************************************************
409 For locally-defined Ids, the code generator maintains its own notion
410 of their arities; so it should not be asking... (but other things
411 besides the code-generator need arity info!)
414 type ArityInfo = Arity
415 -- A partial application of this Id to up to n-1 value arguments
416 -- does essentially no work. That is not necessarily the
417 -- same as saying that it has n leading lambdas, because coerces
418 -- may get in the way.
420 -- The arity might increase later in the compilation process, if
421 -- an extra lambda floats up to the binding site.
423 unknownArity = 0 :: Arity
425 ppArityInfo 0 = empty
426 ppArityInfo n = hsep [ptext SLIT("Arity"), int n]
429 %************************************************************************
431 \subsection{Inline-pragma information}
433 %************************************************************************
436 type InlinePragInfo = Activation
437 -- Tells when the inlining is active
438 -- When it is active the thing may be inlined, depending on how
441 -- If there was an INLINE pragma, then as a separate matter, the
442 -- RHS will have been made to look small with a CoreSyn Inline Note
446 %************************************************************************
448 \subsection[worker-IdInfo]{Worker info about an @Id@}
450 %************************************************************************
452 If this Id has a worker then we store a reference to it. Worker
453 functions are generated by the worker/wrapper pass. This uses
454 information from strictness analysis.
456 There might not be a worker, even for a strict function, because:
457 (a) the function might be small enough to inline, so no need
459 (b) the strictness info might be "SSS" or something, so no w/w split.
461 Sometimes the arity of a wrapper changes from the original arity from
462 which it was generated, so we always emit the "original" arity into
463 the interface file, as part of the worker info.
465 How can this happen? Sometimes we get
466 f = coerce t (\x y -> $wf x y)
467 at the moment of w/w split; but the eta reducer turns it into
469 which is perfectly fine except that the exposed arity so far as
470 the code generator is concerned (zero) differs from the arity
471 when we did the split (2).
473 All this arises because we use 'arity' to mean "exactly how many
474 top level lambdas are there" in interface files; but during the
475 compilation of this module it means "how many things can I apply
480 data WorkerInfo = NoWorker
482 -- The Arity is the arity of the *wrapper* at the moment of the
483 -- w/w split. See notes above.
485 seqWorker :: WorkerInfo -> ()
486 seqWorker (HasWorker id a) = id `seq` a `seq` ()
487 seqWorker NoWorker = ()
489 ppWorkerInfo NoWorker = empty
490 ppWorkerInfo (HasWorker wk_id _) = ptext SLIT("Worker") <+> ppr wk_id
492 workerExists :: WorkerInfo -> Bool
493 workerExists NoWorker = False
494 workerExists (HasWorker _ _) = True
496 workerId :: WorkerInfo -> Id
497 workerId (HasWorker id _) = id
499 wrapperArity :: WorkerInfo -> Arity
500 wrapperArity (HasWorker _ a) = a
504 %************************************************************************
506 \subsection[CG-IdInfo]{Code generator-related information}
508 %************************************************************************
511 -- CafInfo is used to build Static Reference Tables (see simplStg/SRT.lhs).
514 = MayHaveCafRefs -- either:
515 -- (1) A function or static constructor
516 -- that refers to one or more CAFs,
517 -- (2) A real live CAF
519 | NoCafRefs -- A function or static constructor
520 -- that refers to no CAFs.
522 vanillaCafInfo = MayHaveCafRefs -- Definitely safe
524 mayHaveCafRefs MayHaveCafRefs = True
525 mayHaveCafRefs _ = False
527 seqCaf c = c `seq` ()
529 ppCafInfo NoCafRefs = ptext SLIT("NoCafRefs")
530 ppCafInfo MayHaveCafRefs = empty
533 %************************************************************************
535 \subsection[cpr-IdInfo]{Constructed Product Result info about an @Id@}
537 %************************************************************************
539 If the @Id@ is a function then it may have CPR info. A CPR analysis
540 phase detects whether:
544 The function's return value has a product type, i.e. an algebraic type
545 with a single constructor. Examples of such types are tuples and boxed
548 The function always 'constructs' the value that it is returning. It
549 must do this on every path through, and it's OK if it calls another
550 function which constructs the result.
553 If this is the case then we store a template which tells us the
554 function has the CPR property and which components of the result are
558 #ifdef OLD_STRICTNESS
561 | ReturnsCPR -- Yes, this function returns a constructed product
562 -- Implicitly, this means "after the function has been applied
563 -- to all its arguments", so the worker/wrapper builder in
564 -- WwLib.mkWWcpr checks that that it is indeed saturated before
565 -- making use of the CPR info
567 -- We used to keep nested info about sub-components, but
568 -- we never used it so I threw it away
570 seqCpr :: CprInfo -> ()
571 seqCpr ReturnsCPR = ()
572 seqCpr NoCPRInfo = ()
574 noCprInfo = NoCPRInfo
576 ppCprInfo NoCPRInfo = empty
577 ppCprInfo ReturnsCPR = ptext SLIT("__M")
579 instance Outputable CprInfo where
582 instance Show CprInfo where
583 showsPrec p c = showsPrecSDoc p (ppr c)
588 %************************************************************************
590 \subsection[lbvar-IdInfo]{Lambda-bound var info about an @Id@}
592 %************************************************************************
594 If the @Id@ is a lambda-bound variable then it may have lambda-bound
595 var info. Sometimes we know whether the lambda binding this var is a
596 ``one-shot'' lambda; that is, whether it is applied at most once.
598 This information may be useful in optimisation, as computations may
599 safely be floated inside such a lambda without risk of duplicating
603 data LBVarInfo = NoLBVarInfo
604 | IsOneShotLambda -- The lambda is applied at most once).
606 seqLBVar l = l `seq` ()
610 hasNoLBVarInfo NoLBVarInfo = True
611 hasNoLBVarInfo IsOneShotLambda = False
613 noLBVarInfo = NoLBVarInfo
615 pprLBVarInfo NoLBVarInfo = empty
616 pprLBVarInfo IsOneShotLambda = ptext SLIT("OneShot")
618 instance Outputable LBVarInfo where
621 instance Show LBVarInfo where
622 showsPrec p c = showsPrecSDoc p (ppr c)
626 %************************************************************************
628 \subsection{Bulk operations on IdInfo}
630 %************************************************************************
632 @zapLamInfo@ is used for lambda binders that turn out to to be
633 part of an unsaturated lambda
636 zapLamInfo :: IdInfo -> Maybe IdInfo
637 zapLamInfo info@(IdInfo {occInfo = occ, newDemandInfo = demand})
638 | is_safe_occ occ && is_safe_dmd demand
641 = Just (info {occInfo = safe_occ, newDemandInfo = Nothing})
643 -- The "unsafe" occ info is the ones that say I'm not in a lambda
644 -- because that might not be true for an unsaturated lambda
645 is_safe_occ (OneOcc in_lam once) = in_lam
646 is_safe_occ other = True
648 safe_occ = case occ of
649 OneOcc _ once -> OneOcc insideLam once
652 is_safe_dmd Nothing = True
653 is_safe_dmd (Just dmd) = not (isStrictDmd dmd)
657 zapDemandInfo :: IdInfo -> Maybe IdInfo
658 zapDemandInfo info@(IdInfo {newDemandInfo = dmd})
659 | isJust dmd = Just (info {newDemandInfo = Nothing})
660 | otherwise = Nothing