From: simonpj@microsoft.com Date: Thu, 20 Dec 2007 13:19:12 +0000 (+0000) Subject: Fix Trac #1988; keep the ru_fn field of a RULE up to date X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=commitdiff_plain;h=ca919ae01e81fb4afb2243bb34eceff56ca66043 Fix Trac #1988; keep the ru_fn field of a RULE up to date The ru_fn field was wrong when we moved RULES from one Id to another. The fix is simple enough. However, looking at this makes me realise that the worker/wrapper stuff for recursive newtypes isn't very clever: we generate demand info but then don't properly exploit it. This patch fixes the crash though. --- diff --git a/compiler/basicTypes/IdInfo.lhs b/compiler/basicTypes/IdInfo.lhs index e64e255..7eacbd8 100644 --- a/compiler/basicTypes/IdInfo.lhs +++ b/compiler/basicTypes/IdInfo.lhs @@ -72,7 +72,7 @@ module IdInfo ( -- Specialisation SpecInfo(..), specInfo, setSpecInfo, isEmptySpecInfo, - specInfoFreeVars, specInfoRules, seqSpecInfo, + specInfoFreeVars, specInfoRules, seqSpecInfo, setSpecInfoHead, -- CAF info CafInfo(..), cafInfo, ppCafInfo, setCafInfo, mayHaveCafRefs, @@ -89,6 +89,7 @@ module IdInfo ( import CoreSyn import Class import PrimOp +import Name import Var import VarSet import BasicTypes @@ -102,7 +103,6 @@ import Module import Data.Maybe #ifdef OLD_STRICTNESS -import Name import Demand import qualified Demand import Util @@ -474,7 +474,9 @@ type InlinePragInfo = Activation data SpecInfo = SpecInfo [CoreRule] - VarSet -- Locally-defined free vars of *both* LHS and RHS of rules + VarSet -- Locally-defined free vars of *both* LHS and RHS + -- of rules. I don't think it needs to include the + -- ru_fn though. -- Note [Rule dependency info] emptySpecInfo :: SpecInfo @@ -489,6 +491,12 @@ specInfoFreeVars (SpecInfo _ fvs) = fvs specInfoRules :: SpecInfo -> [CoreRule] specInfoRules (SpecInfo rules _) = rules +setSpecInfoHead :: Name -> SpecInfo -> SpecInfo +setSpecInfoHead fn (SpecInfo rules fvs) + = SpecInfo (map set_head rules) fvs + where + set_head rule = rule { ru_fn = fn } + seqSpecInfo (SpecInfo rules fvs) = seqRules rules `seq` seqVarSet fvs \end{code} @@ -500,7 +508,7 @@ 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 + rule's LHS too, so we'd better ensure the dependency is respected diff --git a/compiler/simplCore/SimplCore.lhs b/compiler/simplCore/SimplCore.lhs index e2ac668..844c401 100644 --- a/compiler/simplCore/SimplCore.lhs +++ b/compiler/simplCore/SimplCore.lhs @@ -29,7 +29,7 @@ import Rules ( RuleBase, emptyRuleBase, mkRuleBase, unionRuleBase, import PprCore ( pprCoreBindings, pprCoreExpr, pprRules ) import OccurAnal ( occurAnalysePgm, occurAnalyseExpr ) import IdInfo ( setNewStrictnessInfo, newStrictnessInfo, - setWorkerInfo, workerInfo, + setWorkerInfo, workerInfo, setSpecInfoHead, setInlinePragInfo, inlinePragInfo, setSpecInfo, specInfo, specInfoRules ) import CoreUtils ( coreBindsSize ) @@ -700,6 +700,9 @@ transferIdInfo exported_id local_id transfer exp_info = exp_info `setNewStrictnessInfo` newStrictnessInfo local_info `setWorkerInfo` workerInfo local_info `setInlinePragInfo` inlinePragInfo local_info - `setSpecInfo` addSpecInfo (specInfo exp_info) - (specInfo local_info) + `setSpecInfo` addSpecInfo (specInfo exp_info) new_info + new_info = setSpecInfoHead (idName exported_id) + (specInfo local_info) + -- Remember to set the function-name field of the + -- rules as we transfer them from one function to another \end{code} diff --git a/compiler/simplCore/Simplify.lhs b/compiler/simplCore/Simplify.lhs index 3f32459..9723dfb 100644 --- a/compiler/simplCore/Simplify.lhs +++ b/compiler/simplCore/Simplify.lhs @@ -1329,7 +1329,7 @@ where x::F Int. Then we'd like to rewrite (F Int) to Int, getting I# x# -> let x = x' `cast` sym co in rhs -so that 'rhs' can take advantage of hte form of x'. Notice that Note +so that 'rhs' can take advantage of the form of x'. Notice that Note [Case of cast] may then apply to the result. This showed up in Roman's experiments. Example: