Commit ca919ae0 authored by's avatar
Browse files

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.
parent c8b41f85
......@@ -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
import Name
import Demand
import qualified Demand
import Util
......@@ -474,7 +474,9 @@ type InlinePragInfo = Activation
data SpecInfo
= SpecInfo
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
set_head rule = rule { ru_fn = fn }
seqSpecInfo (SpecInfo rules fvs) = seqRules rules `seq` seqVarSet fvs
......@@ -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
......@@ -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
......@@ -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:
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment