X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2FbasicTypes%2FIdInfo.lhs;h=0db72f1bd6c4cc5a4290d214b382a31badd0f94f;hb=9adbdb312507dcc7d5777e36376535918549103b;hp=1cf25b1929c406e3f91b5ed6c8a2058fd82aa779;hpb=c77080dd41381bdbdd2fbaa1472a458e415fc429;p=ghc-hetmet.git diff --git a/ghc/compiler/basicTypes/IdInfo.lhs b/ghc/compiler/basicTypes/IdInfo.lhs index 1cf25b1..0db72f1 100644 --- a/ghc/compiler/basicTypes/IdInfo.lhs +++ b/ghc/compiler/basicTypes/IdInfo.lhs @@ -13,7 +13,7 @@ module IdInfo ( vanillaIdInfo, mkIdInfo, seqIdInfo, megaSeqIdInfo, -- Zapping - zapFragileInfo, zapLamInfo, zapSpecPragInfo, copyIdInfo, + zapFragileInfo, zapLamInfo, zapSpecPragInfo, shortableIdInfo, copyIdInfo, -- Flavour IdFlavour(..), flavourInfo, @@ -55,10 +55,6 @@ module IdInfo ( -- Specialisation specInfo, setSpecInfo, - -- Update - UpdateInfo, UpdateSpec, - mkUpdateInfo, updateInfo, updateInfoMaybe, ppUpdateInfo, setUpdateInfo, - -- CAF info CafInfo(..), cafInfo, setCafInfo, ppCafInfo, @@ -86,8 +82,7 @@ import Demand -- Lots of stuff import Outputable import Maybe ( isJust ) -infixl 1 `setUpdateInfo`, - `setDemandInfo`, +infixl 1 `setDemandInfo`, `setStrictnessInfo`, `setSpecInfo`, `setArityInfo`, @@ -127,7 +122,6 @@ data IdInfo strictnessInfo :: StrictnessInfo, -- Strictness properties workerInfo :: WorkerInfo, -- Pointer to Worker Function unfoldingInfo :: Unfolding, -- Its unfolding - updateInfo :: UpdateInfo, -- Which args should be updated cafInfo :: CafInfo, cprInfo :: CprInfo, -- Function always constructs a product result lbvarInfo :: LBVarInfo, -- Info about a lambda-bound variable @@ -185,7 +179,6 @@ setUnfoldingInfo info uf -- actually increases residency significantly. = info { unfoldingInfo = uf } -setUpdateInfo info ud = info { updateInfo = ud } setDemandInfo info dd = info { demandInfo = dd } setArityInfo info ar = info { arityInfo = ar } setCafInfo info cf = info { cafInfo = cf } @@ -214,7 +207,6 @@ mkIdInfo flv = IdInfo { workerInfo = NoWorker, strictnessInfo = NoStrictnessInfo, unfoldingInfo = noUnfolding, - updateInfo = NoUpdateInfo, cafInfo = MayHaveCafRefs, cprInfo = NoCPRInfo, lbvarInfo = NoLBVarInfo, @@ -402,40 +394,6 @@ wrapperArity (HasWorker _ a) = a %************************************************************************ %* * -\subsection[update-IdInfo]{Update-analysis info about an @Id@} -%* * -%************************************************************************ - -\begin{code} -data UpdateInfo - = NoUpdateInfo - | SomeUpdateInfo UpdateSpec - deriving (Eq, Ord) - -- we need Eq/Ord to cross-chk update infos in interfaces - --- the form in which we pass update-analysis info between modules: -type UpdateSpec = [Int] -\end{code} - -\begin{code} -mkUpdateInfo = SomeUpdateInfo - -updateInfoMaybe NoUpdateInfo = Nothing -updateInfoMaybe (SomeUpdateInfo []) = Nothing -updateInfoMaybe (SomeUpdateInfo u) = Just u -\end{code} - -Text instance so that the update annotations can be read in. - -\begin{code} -ppUpdateInfo NoUpdateInfo = empty -ppUpdateInfo (SomeUpdateInfo []) = empty -ppUpdateInfo (SomeUpdateInfo spec) = (<>) (ptext SLIT("__UA ")) (hcat (map int spec)) - -- was "__U "; changed to avoid conflict with unfoldings. KSW 1999-07. -\end{code} - -%************************************************************************ -%* * \subsection[CAF-IdInfo]{CAF-related information} %* * %************************************************************************ @@ -649,26 +607,60 @@ copyIdInfo is used when shorting out a top-level binding where f is exported. We are going to swizzle it around to f = BIG f_local = f -but we must be careful to combine their IdInfos right. -The fact that things can go wrong here is a bad sign, but I can't see -how to make it 'patently right', so copyIdInfo is derived (pretty much) by trial and error -Here 'from' is f_local, 'to' is f, and the result is attached to f +BUT (a) we must be careful about messing up rules + (b) we must ensure f's IdInfo ends up right + +(a) Messing up the rules +~~~~~~~~~~~~~~~~~~~~ +The example that went bad on me was this one: + + iterate :: (a -> a) -> a -> [a] + iterate = iterateList + + iterateFB c f x = x `c` iterateFB c f (f x) + iterateList f x = x : iterateList f (f x) + + {-# RULES + "iterate" forall f x. iterate f x = build (\c _n -> iterateFB c f x) + "iterateFB" iterateFB (:) = iterateList + #-} + +This got shorted out to: + + iterateList :: (a -> a) -> a -> [a] + iterateList = iterate + + iterateFB c f x = x `c` iterateFB c f (f x) + iterate f x = x : iterate f (f x) + + {-# RULES + "iterate" forall f x. iterate f x = build (\c _n -> iterateFB c f x) + "iterateFB" iterateFB (:) = iterate + #-} + +And now we get an infinite loop in the rule system + iterate f x -> build (\cn -> iterateFB c f x + -> iterateFB (:) f x + -> iterate f x + +Tiresome solution: don't do shorting out if f has rewrite rules. +Hence shortableIdInfo. + +(b) Keeping the IdInfo right +~~~~~~~~~~~~~~~~~~~~~~~~ +We want to move strictness/worker info from f_local to f, but keep the rest. +Hence copyIdInfo. \begin{code} -copyIdInfo :: IdInfo -- From - -> IdInfo -- To - -> IdInfo -- To, updated with stuff from From; except flavour unchanged -copyIdInfo from to = from { flavourInfo = flavourInfo to, - specInfo = specInfo to, - inlinePragInfo = inlinePragInfo to +shortableIdInfo :: IdInfo -> Bool +shortableIdInfo info = isEmptyCoreRules (specInfo info) + +copyIdInfo :: IdInfo -- f_local + -> IdInfo -- f (the exported one) + -> IdInfo -- New info for f +copyIdInfo f_local f = f { strictnessInfo = strictnessInfo f_local, + workerInfo = workerInfo f_local, + cprInfo = cprInfo f_local } - -- It's important to preserve the inline pragma on 'f'; e.g. consider - -- {-# NOINLINE f #-} - -- f = local - -- - -- similarly, transformation rules may be attached to f - -- and we want to preserve them. - -- - -- On the other hand, we want the strictness info from f_local. \end{code}