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, noCafNoTyGenIdInfo,
15 seqIdInfo, megaSeqIdInfo,
18 zapLamInfo, zapDemandInfo,
19 shortableIdInfo, copyIdInfo,
23 exactArity, unknownArity, hasArity,
24 arityInfo, setArityInfo, ppArityInfo, arityLowerBound,
26 -- New demand and strictness info
27 newStrictnessInfo, setNewStrictnessInfo, mkNewStrictnessInfo,
28 newDemandInfo, setNewDemandInfo, newDemand, oldDemand,
30 -- Strictness; imported from Demand
32 mkStrictnessInfo, noStrictnessInfo,
33 ppStrictnessInfo,isBottomingStrictness,
34 strictnessInfo, setStrictnessInfo,
36 -- Usage generalisation
38 tyGenInfo, setTyGenInfo,
39 noTyGenInfo, isNoTyGenInfo, ppTyGenInfo, tyGenInfoString,
42 WorkerInfo(..), workerExists, wrapperArity, workerId,
43 workerInfo, setWorkerInfo, ppWorkerInfo,
46 unfoldingInfo, setUnfoldingInfo,
49 demandInfo, setDemandInfo,
53 inlinePragInfo, setInlinePragInfo, pprInlinePragInfo,
54 isNeverInlinePrag, neverInlinePrag,
57 OccInfo(..), isFragileOcc, isDeadOcc, isLoopBreaker,
58 InsideLam, OneBranch, insideLam, notInsideLam, oneBranch, notOneBranch,
62 specInfo, setSpecInfo,
65 CgInfo(..), cgInfo, setCgInfo, cgMayHaveCafRefs, pprCgInfo,
66 cgArity, cgCafInfo, vanillaCgInfo,
67 CgInfoEnv, lookupCgInfo,
71 CafInfo(..), ppCafInfo, setCafInfo, mayHaveCafRefs,
73 -- Constructed Product Result Info
74 CprInfo(..), cprInfo, setCprInfo, ppCprInfo, noCprInfo,
76 -- Lambda-bound variable info
77 LBVarInfo(..), lbvarInfo, setLBVarInfo, noLBVarInfo, hasNoLBVarInfo
80 #include "HsVersions.h"
84 import Type ( Type, usOnce, eqUsage )
85 import PrimOp ( PrimOp )
86 import NameEnv ( NameEnv, lookupNameEnv )
89 import BasicTypes ( OccInfo(..), isFragileOcc, isDeadOcc, seqOccInfo, isLoopBreaker,
90 InsideLam, insideLam, notInsideLam,
91 OneBranch, oneBranch, notOneBranch,
94 import DataCon ( DataCon )
95 import ForeignCall ( ForeignCall )
96 import FieldLabel ( FieldLabel )
97 import Type ( usOnce, usMany )
98 import Demand hiding( Demand )
99 import qualified Demand
100 import NewDemand ( Demand(..), Keepity(..), DmdResult(..),
101 lazyDmd, topDmd, dmdTypeDepth,
102 StrictSig, mkStrictSig, mkTopDmdType
105 import Util ( seqList )
106 import List ( replicate )
108 infixl 1 `setDemandInfo`,
122 `setNewStrictnessInfo`,
124 -- infixl so you can say (id `set` a `set` b)
127 %************************************************************************
129 \subsection{New strictness info}
131 %************************************************************************
136 mkNewStrictnessInfo :: Id -> Arity -> Demand.StrictnessInfo -> CprInfo -> StrictSig
137 mkNewStrictnessInfo id arity (Demand.StrictnessInfo ds res) cpr
139 -- Sometimes the old strictness analyser has more
140 -- demands than the arity justifies
141 = mk_strict_sig id arity $
142 mkTopDmdType (map newDemand ds) (newRes res cpr)
144 mkNewStrictnessInfo id arity other cpr
145 = -- Either no strictness info, or arity is too small
146 -- In either case we can't say anything useful
147 mk_strict_sig id arity $
148 mkTopDmdType (replicate arity lazyDmd) (newRes False cpr)
150 mk_strict_sig id arity dmd_ty
151 = WARN( arity /= dmdTypeDepth dmd_ty, ppr id <+> (ppr arity $$ ppr dmd_ty) )
154 newRes True _ = BotRes
155 newRes False ReturnsCPR = RetCPR
156 newRes False NoCPRInfo = TopRes
158 newDemand :: Demand.Demand -> NewDemand.Demand
159 newDemand (WwLazy True) = Abs
160 newDemand (WwLazy False) = Lazy
161 newDemand WwStrict = Eval
162 newDemand (WwUnpack unpk ds) = Seq Drop (map newDemand ds)
163 newDemand WwPrim = Lazy
164 newDemand WwEnum = Eval
166 oldDemand :: NewDemand.Demand -> Demand.Demand
167 oldDemand Abs = WwLazy True
168 oldDemand Lazy = WwLazy False
169 oldDemand Bot = WwStrict
170 oldDemand Err = WwStrict
171 oldDemand Eval = WwStrict
172 oldDemand (Seq _ ds) = WwUnpack True (map oldDemand ds)
173 oldDemand (Call _) = WwStrict
177 %************************************************************************
179 \subsection{GlobalIdDetails
181 %************************************************************************
183 This type is here (rather than in Id.lhs) mainly because there's
184 an IdInfo.hi-boot, but no Id.hi-boot, and GlobalIdDetails is imported
185 (recursively) by Var.lhs.
189 = VanillaGlobal -- Imported from elsewhere, a default method Id.
191 | RecordSelId FieldLabel -- The Id for a record selector
192 | DataConId DataCon -- The Id for a data constructor *worker*
193 | DataConWrapId DataCon -- The Id for a data constructor *wrapper*
194 -- [the only reasons we need to know is so that
195 -- a) we can suppress printing a definition in the interface file
196 -- b) when typechecking a pattern we can get from the
197 -- Id back to the data con]
199 | PrimOpId PrimOp -- The Id for a primitive operator
200 | FCallId ForeignCall -- The Id for a foreign call
202 | NotGlobalId -- Used as a convenient extra return value from globalIdDetails
204 notGlobalId = NotGlobalId
206 instance Outputable GlobalIdDetails where
207 ppr NotGlobalId = ptext SLIT("[***NotGlobalId***]")
208 ppr VanillaGlobal = ptext SLIT("[GlobalId]")
209 ppr (DataConId _) = ptext SLIT("[DataCon]")
210 ppr (DataConWrapId _) = ptext SLIT("[DataConWrapper]")
211 ppr (PrimOpId _) = ptext SLIT("[PrimOp]")
212 ppr (FCallId _) = ptext SLIT("[ForeignCall]")
213 ppr (RecordSelId _) = ptext SLIT("[RecSel]")
217 %************************************************************************
219 \subsection{The main IdInfo type}
221 %************************************************************************
223 An @IdInfo@ gives {\em optional} information about an @Id@. If
224 present it never lies, but it may not be present, in which case there
225 is always a conservative assumption which can be made.
227 Two @Id@s may have different info even though they have the same
228 @Unique@ (and are hence the same @Id@); for example, one might lack
229 the properties attached to the other.
231 The @IdInfo@ gives information about the value, or definition, of the
232 @Id@. It does {\em not} contain information about the @Id@'s usage
233 (except for @DemandInfo@? ToDo). (@lbvarInfo@ is also a marginal
239 arityInfo :: ArityInfo, -- Its arity
240 demandInfo :: Demand.Demand, -- Whether or not it is definitely demanded
241 specInfo :: CoreRules, -- Specialisations of this function which exist
242 tyGenInfo :: TyGenInfo, -- Restrictions on usage-generalisation of this Id
243 strictnessInfo :: StrictnessInfo, -- Strictness properties
244 workerInfo :: WorkerInfo, -- Pointer to Worker Function
245 unfoldingInfo :: Unfolding, -- Its unfolding
246 cgInfo :: CgInfo, -- Code generator info (arity, CAF info)
247 cprInfo :: CprInfo, -- Function always constructs a product result
248 lbvarInfo :: LBVarInfo, -- Info about a lambda-bound variable
249 inlinePragInfo :: InlinePragInfo, -- Inline pragma
250 occInfo :: OccInfo, -- How it occurs
252 newStrictnessInfo :: Maybe StrictSig,
253 newDemandInfo :: Demand
256 seqIdInfo :: IdInfo -> ()
257 seqIdInfo (IdInfo {}) = ()
259 megaSeqIdInfo :: IdInfo -> ()
261 = seqArity (arityInfo info) `seq`
262 seqDemand (demandInfo info) `seq`
263 seqRules (specInfo info) `seq`
264 seqTyGenInfo (tyGenInfo info) `seq`
265 seqStrictnessInfo (strictnessInfo info) `seq`
266 seqWorker (workerInfo info) `seq`
268 -- seqUnfolding (unfoldingInfo info) `seq`
269 -- Omitting this improves runtimes a little, presumably because
270 -- some unfoldings are not calculated at all
272 -- CgInfo is involved in a loop, so we have to be careful not to seq it
274 -- seqCg (cgInfo info) `seq`
275 seqCpr (cprInfo info) `seq`
276 seqLBVar (lbvarInfo info) `seq`
277 seqOccInfo (occInfo info)
283 setWorkerInfo info wk = wk `seq` info { workerInfo = wk }
284 setSpecInfo info sp = PSEQ sp (info { specInfo = sp })
285 setTyGenInfo info tg = tg `seq` info { tyGenInfo = tg }
286 setInlinePragInfo info pr = pr `seq` info { inlinePragInfo = pr }
287 setOccInfo info oc = oc `seq` info { occInfo = oc }
288 setStrictnessInfo info st = st `seq` info { strictnessInfo = st }
289 -- Try to avoid spack leaks by seq'ing
291 setUnfoldingInfo info uf
292 | isEvaldUnfolding uf && isStrict (demandInfo info)
293 -- If the unfolding is a value, the demand info may
294 -- go pear-shaped, so we nuke it. Example:
296 -- case x of (p,q) -> h p q x
297 -- Here x is certainly demanded. But after we've nuked
298 -- the case, we'll get just
299 -- let x = (a,b) in h a b x
300 -- and now x is not demanded (I'm assuming h is lazy)
301 -- This really happens. The solution here is a bit ad hoc...
302 = info { unfoldingInfo = uf, demandInfo = wwLazy }
305 -- We do *not* seq on the unfolding info, For some reason, doing so
306 -- actually increases residency significantly.
307 = info { unfoldingInfo = uf }
309 setDemandInfo info dd = info { demandInfo = dd }
310 setArityInfo info ar = info { arityInfo = Just ar }
311 setCgInfo info cg = info { cgInfo = cg }
312 setCprInfo info cp = info { cprInfo = cp }
313 setLBVarInfo info lb = info { lbvarInfo = lb }
315 setNewDemandInfo info dd = info { newDemandInfo = dd }
316 setNewStrictnessInfo info dd = info { newStrictnessInfo = dd }
321 vanillaIdInfo :: IdInfo
325 arityInfo = unknownArity,
327 specInfo = emptyCoreRules,
328 tyGenInfo = noTyGenInfo,
329 workerInfo = NoWorker,
330 strictnessInfo = NoStrictnessInfo,
331 unfoldingInfo = noUnfolding,
333 lbvarInfo = NoLBVarInfo,
334 inlinePragInfo = NoInlinePragInfo,
336 newDemandInfo = topDmd,
337 newStrictnessInfo = Nothing
340 noCafNoTyGenIdInfo = vanillaIdInfo `setTyGenInfo` TyGenNever
341 `setCgInfo` (CgInfo 0 NoCafRefs)
342 -- Used for built-in type Ids in MkId.
343 -- Many built-in things have fixed types, so we shouldn't
344 -- run around generalising them
348 %************************************************************************
350 \subsection[arity-IdInfo]{Arity info about an @Id@}
352 %************************************************************************
354 For locally-defined Ids, the code generator maintains its own notion
355 of their arities; so it should not be asking... (but other things
356 besides the code-generator need arity info!)
359 type ArityInfo = Maybe Arity
360 -- A partial application of this Id to up to n-1 value arguments
361 -- does essentially no work. That is not necessarily the
362 -- same as saying that it has n leading lambdas, because coerces
363 -- may get in the way.
365 -- The arity might increase later in the compilation process, if
366 -- an extra lambda floats up to the binding site.
368 seqArity :: ArityInfo -> ()
369 seqArity a = arityLowerBound a `seq` ()
372 unknownArity = Nothing
374 arityLowerBound :: ArityInfo -> Arity
375 arityLowerBound Nothing = 0
376 arityLowerBound (Just n) = n
378 hasArity :: ArityInfo -> Bool
379 hasArity Nothing = False
380 hasArity other = True
382 ppArityInfo Nothing = empty
383 ppArityInfo (Just arity) = hsep [ptext SLIT("Arity"), int arity]
386 %************************************************************************
388 \subsection{Inline-pragma information}
390 %************************************************************************
395 | IMustNotBeINLINEd Bool -- True <=> came from an INLINE prag, False <=> came from a NOINLINE prag
396 (Maybe Int) -- Phase number from pragma, if any
398 -- The True, Nothing case doesn't need to be recorded
400 -- SEE COMMENTS WITH CoreUnfold.blackListed on the
401 -- exact significance of the IMustNotBeINLINEd pragma
403 isNeverInlinePrag :: InlinePragInfo -> Bool
404 isNeverInlinePrag (IMustNotBeINLINEd _ Nothing) = True
405 isNeverInlinePrag other = False
407 neverInlinePrag :: InlinePragInfo
408 neverInlinePrag = IMustNotBeINLINEd True{-should be False? --SDM -} Nothing
410 instance Outputable InlinePragInfo where
411 -- This is now parsed in interface files
412 ppr NoInlinePragInfo = empty
413 ppr other_prag = ptext SLIT("__U") <> pprInlinePragInfo other_prag
415 pprInlinePragInfo NoInlinePragInfo = empty
416 pprInlinePragInfo (IMustNotBeINLINEd True Nothing) = empty
417 pprInlinePragInfo (IMustNotBeINLINEd True (Just n)) = brackets (int n)
418 pprInlinePragInfo (IMustNotBeINLINEd False Nothing) = brackets (char '!')
419 pprInlinePragInfo (IMustNotBeINLINEd False (Just n)) = brackets (char '!' <> int n)
421 instance Show InlinePragInfo where
422 showsPrec p prag = showsPrecSDoc p (ppr prag)
426 %************************************************************************
428 \subsection[TyGen-IdInfo]{Type generalisation info about an @Id@}
430 %************************************************************************
432 Certain passes (notably usage inference) may change the type of an
433 identifier, modifying all in-scope uses of that identifier
434 appropriately to maintain type safety.
436 However, some identifiers must not have their types changed in this
437 way, because their types are conjured up in the front end of the
438 compiler rather than being read from the interface file. Default
439 methods, dictionary functions, record selectors, and others are in
440 this category. (see comment at TcClassDcl.tcClassSig).
442 To indicate this property, such identifiers are marked TyGenNever.
444 Furthermore, if the usage inference generates a usage-specialised
445 variant of a function, we must NOT re-infer a fully-generalised type
446 at the next inference. This finer property is indicated by a
447 TyGenUInfo on the identifier.
451 = NoTyGenInfo -- no restriction on type generalisation
453 | TyGenUInfo [Maybe Type] -- restrict generalisation of this Id to
454 -- preserve specified usage annotations
456 | TyGenNever -- never generalise the type of this Id
459 For TyGenUInfo, the list has one entry for each usage annotation on
460 the type of the Id, in left-to-right pre-order (annotations come
461 before the type they annotate). Nothing means no restriction; Just
462 usOnce or Just usMany forces that annotation to that value. Other
463 usage annotations are illegal.
466 seqTyGenInfo :: TyGenInfo -> ()
467 seqTyGenInfo NoTyGenInfo = ()
468 seqTyGenInfo (TyGenUInfo us) = seqList us ()
469 seqTyGenInfo TyGenNever = ()
471 noTyGenInfo :: TyGenInfo
472 noTyGenInfo = NoTyGenInfo
474 isNoTyGenInfo :: TyGenInfo -> Bool
475 isNoTyGenInfo NoTyGenInfo = True
476 isNoTyGenInfo _ = False
478 -- NB: There's probably no need to write this information out to the interface file.
479 -- Why? Simply because imported identifiers never get their types re-inferred.
480 -- But it's definitely nice to see in dumps, it for debugging purposes.
482 ppTyGenInfo :: TyGenInfo -> SDoc
483 ppTyGenInfo NoTyGenInfo = empty
484 ppTyGenInfo (TyGenUInfo us) = ptext SLIT("__G") <+> text (tyGenInfoString us)
485 ppTyGenInfo TyGenNever = ptext SLIT("__G N")
487 tyGenInfoString us = map go us
488 where go Nothing = 'x' -- for legibility, choose
489 go (Just u) | u `eqUsage` usOnce = '1' -- chars with identity
490 | u `eqUsage` usMany = 'M' -- Z-encoding.
491 go other = pprPanic "IdInfo.tyGenInfoString: unexpected annotation" (ppr other)
493 instance Outputable TyGenInfo where
496 instance Show TyGenInfo where
497 showsPrec p c = showsPrecSDoc p (ppr c)
501 %************************************************************************
503 \subsection[worker-IdInfo]{Worker info about an @Id@}
505 %************************************************************************
507 If this Id has a worker then we store a reference to it. Worker
508 functions are generated by the worker/wrapper pass. This uses
509 information from the strictness and CPR analyses.
511 There might not be a worker, even for a strict function, because:
512 (a) the function might be small enough to inline, so no need
514 (b) the strictness info might be "SSS" or something, so no w/w split.
516 Sometimes the arity of a wrapper changes from the original arity from
517 which it was generated, so we always emit the "original" arity into
518 the interface file, as part of the worker info.
520 How can this happen? Sometimes we get
521 f = coerce t (\x y -> $wf x y)
522 at the moment of w/w split; but the eta reducer turns it into
524 which is perfectly fine except that the exposed arity so far as
525 the code generator is concerned (zero) differs from the arity
526 when we did the split (2).
528 All this arises because we use 'arity' to mean "exactly how many
529 top level lambdas are there" in interface files; but during the
530 compilation of this module it means "how many things can I apply
535 data WorkerInfo = NoWorker
537 -- The Arity is the arity of the *wrapper* at the moment of the
538 -- w/w split. See comments in MkIface.ifaceId, with the 'Worker' code.
540 seqWorker :: WorkerInfo -> ()
541 seqWorker (HasWorker id _) = id `seq` ()
542 seqWorker NoWorker = ()
544 ppWorkerInfo NoWorker = empty
545 ppWorkerInfo (HasWorker wk_id _) = ptext SLIT("__P") <+> ppr wk_id
547 workerExists :: WorkerInfo -> Bool
548 workerExists NoWorker = False
549 workerExists (HasWorker _ _) = True
551 workerId :: WorkerInfo -> Id
552 workerId (HasWorker id _) = id
554 wrapperArity :: WorkerInfo -> Arity
555 wrapperArity (HasWorker _ a) = a
559 %************************************************************************
561 \subsection[CG-IdInfo]{Code generator-related information}
563 %************************************************************************
565 CgInfo encapsulates calling-convention information produced by the code
566 generator. It is pasted into the IdInfo of each emitted Id by CoreTidy,
567 but only as a thunk --- the information is only actually produced further
568 downstream, by the code generator.
572 !Arity -- Exact arity for calling purposes
575 | NoCgInfo -- In debug mode we don't want a black hole here
578 -- noCgInfo is used for local Ids, which shouldn't need any CgInfo
581 noCgInfo = panic "NoCgInfo!"
584 cgArity (CgInfo arity _) = arity
585 cgCafInfo (CgInfo _ caf_info) = caf_info
587 setCafInfo info caf_info =
588 case cgInfo info of { CgInfo arity _ ->
589 info `setCgInfo` CgInfo arity caf_info }
591 setCgArity info arity =
592 case cgInfo info of { CgInfo _ caf_info ->
593 info `setCgInfo` CgInfo arity caf_info }
595 cgMayHaveCafRefs (CgInfo _ caf_info) = mayHaveCafRefs caf_info
597 seqCg c = c `seq` () -- fields are strict anyhow
599 vanillaCgInfo = CgInfo 0 MayHaveCafRefs -- Definitely safe
601 -- CafInfo is used to build Static Reference Tables (see simplStg/SRT.lhs).
604 = MayHaveCafRefs -- either:
605 -- (1) A function or static constructor
606 -- that refers to one or more CAFs,
607 -- (2) A real live CAF
609 | NoCafRefs -- A function or static constructor
610 -- that refers to no CAFs.
612 mayHaveCafRefs MayHaveCafRefs = True
613 mayHaveCafRefs _ = False
615 seqCaf c = c `seq` ()
617 pprCgInfo (CgInfo arity caf_info) = ppArity arity <+> ppCafInfo caf_info
620 ppArity n = hsep [ptext SLIT("__A"), int n]
622 ppCafInfo NoCafRefs = ptext SLIT("__C")
623 ppCafInfo MayHaveCafRefs = empty
627 type CgInfoEnv = NameEnv CgInfo
629 lookupCgInfo :: NameEnv CgInfo -> Name -> CgInfo
630 lookupCgInfo env n = case lookupNameEnv env n of
632 Nothing -> pprTrace "Urk! Not in CgInfo env" (ppr n) vanillaCgInfo
636 %************************************************************************
638 \subsection[cpr-IdInfo]{Constructed Product Result info about an @Id@}
640 %************************************************************************
642 If the @Id@ is a function then it may have CPR info. A CPR analysis
643 phase detects whether:
647 The function's return value has a product type, i.e. an algebraic type
648 with a single constructor. Examples of such types are tuples and boxed
651 The function always 'constructs' the value that it is returning. It
652 must do this on every path through, and it's OK if it calls another
653 function which constructs the result.
656 If this is the case then we store a template which tells us the
657 function has the CPR property and which components of the result are
663 | ReturnsCPR -- Yes, this function returns a constructed product
664 -- Implicitly, this means "after the function has been applied
665 -- to all its arguments", so the worker/wrapper builder in
666 -- WwLib.mkWWcpr checks that that it is indeed saturated before
667 -- making use of the CPR info
669 -- We used to keep nested info about sub-components, but
670 -- we never used it so I threw it away
674 seqCpr :: CprInfo -> ()
675 seqCpr ReturnsCPR = ()
676 seqCpr NoCPRInfo = ()
678 noCprInfo = NoCPRInfo
680 ppCprInfo NoCPRInfo = empty
681 ppCprInfo ReturnsCPR = ptext SLIT("__M")
683 instance Outputable CprInfo where
686 instance Show CprInfo where
687 showsPrec p c = showsPrecSDoc p (ppr c)
691 %************************************************************************
693 \subsection[lbvar-IdInfo]{Lambda-bound var info about an @Id@}
695 %************************************************************************
697 If the @Id@ is a lambda-bound variable then it may have lambda-bound
698 var info. The usage analysis (UsageSP) detects whether the lambda
699 binding this var is a ``one-shot'' lambda; that is, whether it is
700 applied at most once.
702 This information may be useful in optimisation, as computations may
703 safely be floated inside such a lambda without risk of duplicating
710 | LBVarInfo Type -- The lambda that binds this Id has this usage
711 -- annotation (i.e., if ==usOnce, then the
712 -- lambda is applied at most once).
713 -- The annotation's kind must be `$'
714 -- HACK ALERT! placing this info here is a short-term hack,
715 -- but it minimises changes to the rest of the compiler.
716 -- Hack agreed by SLPJ/KSW 1999-04.
718 seqLBVar l = l `seq` ()
722 hasNoLBVarInfo NoLBVarInfo = True
723 hasNoLBVarInfo other = False
725 noLBVarInfo = NoLBVarInfo
727 -- not safe to print or parse LBVarInfo because it is not really a
728 -- property of the definition, but a property of the context.
729 pprLBVarInfo NoLBVarInfo = empty
730 pprLBVarInfo (LBVarInfo u) | u `eqUsage` usOnce
731 = getPprStyle $ \ sty ->
734 else ptext SLIT("OneShot")
738 instance Outputable LBVarInfo where
741 instance Show LBVarInfo where
742 showsPrec p c = showsPrecSDoc p (ppr c)
746 %************************************************************************
748 \subsection{Bulk operations on IdInfo}
750 %************************************************************************
752 @zapLamInfo@ is used for lambda binders that turn out to to be
753 part of an unsaturated lambda
756 zapLamInfo :: IdInfo -> Maybe IdInfo
757 zapLamInfo info@(IdInfo {occInfo = occ, demandInfo = demand})
758 | is_safe_occ && not (isStrict demand)
761 = Just (info {occInfo = safe_occ,
762 demandInfo = wwLazy})
764 -- The "unsafe" occ info is the ones that say I'm not in a lambda
765 -- because that might not be true for an unsaturated lambda
766 is_safe_occ = case occ of
767 OneOcc in_lam once -> in_lam
770 safe_occ = case occ of
771 OneOcc _ once -> OneOcc insideLam once
776 zapDemandInfo :: IdInfo -> Maybe IdInfo
777 zapDemandInfo info@(IdInfo {demandInfo = demand})
778 | not (isStrict demand) = Nothing
779 | otherwise = Just (info {demandInfo = wwLazy})
783 copyIdInfo is used when shorting out a top-level binding
786 where f is exported. We are going to swizzle it around to
790 BUT (a) we must be careful about messing up rules
791 (b) we must ensure f's IdInfo ends up right
793 (a) Messing up the rules
795 The example that went bad on me was this one:
797 iterate :: (a -> a) -> a -> [a]
798 iterate = iterateList
800 iterateFB c f x = x `c` iterateFB c f (f x)
801 iterateList f x = x : iterateList f (f x)
804 "iterate" forall f x. iterate f x = build (\c _n -> iterateFB c f x)
805 "iterateFB" iterateFB (:) = iterateList
808 This got shorted out to:
810 iterateList :: (a -> a) -> a -> [a]
811 iterateList = iterate
813 iterateFB c f x = x `c` iterateFB c f (f x)
814 iterate f x = x : iterate f (f x)
817 "iterate" forall f x. iterate f x = build (\c _n -> iterateFB c f x)
818 "iterateFB" iterateFB (:) = iterate
821 And now we get an infinite loop in the rule system
822 iterate f x -> build (\cn -> iterateFB c f x)
826 Tiresome solution: don't do shorting out if f has rewrite rules.
827 Hence shortableIdInfo.
829 (b) Keeping the IdInfo right
830 ~~~~~~~~~~~~~~~~~~~~~~~~
831 We want to move strictness/worker info from f_local to f, but keep the rest.
835 shortableIdInfo :: IdInfo -> Bool
836 shortableIdInfo info = isEmptyCoreRules (specInfo info)
838 copyIdInfo :: IdInfo -- f_local
839 -> IdInfo -- f (the exported one)
840 -> IdInfo -- New info for f
841 copyIdInfo f_local f = f { strictnessInfo = strictnessInfo f_local,
842 workerInfo = workerInfo f_local,
843 cprInfo = cprInfo f_local