X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2Fspecialise%2FRules.lhs;h=702902f33f7b5ff278a374210be70cf348529278;hb=f2506c8c109dfbf063fa2a239ea95c8f8cd167f1;hp=92206048011dd176636fe61641a6e511f36031dd;hpb=bb026cba3610d8b3037ceade1d7140dd0096da91;p=ghc-hetmet.git diff --git a/ghc/compiler/specialise/Rules.lhs b/ghc/compiler/specialise/Rules.lhs index 9220604..702902f 100644 --- a/ghc/compiler/specialise/Rules.lhs +++ b/ghc/compiler/specialise/Rules.lhs @@ -39,10 +39,9 @@ import Name ( Name, NamedThing(..), nameOccName ) import NameEnv import Unify ( tcMatchTyX, MatchEnv(..) ) import BasicTypes ( Activation, CompilerPhase, isActive ) - import Outputable import FastString -import Maybe ( isJust ) +import Maybes ( isJust, orElse ) import Bag import Util ( singleton ) import List ( isPrefixOf ) @@ -198,10 +197,13 @@ lookupRule :: (Activation -> Bool) -> InScopeSet lookupRule is_active in_scope rule_base fn args = matchRules is_active in_scope fn args rules where - rules | isLocalId fn = idCoreRules fn - | otherwise = case lookupNameEnv rule_base (idName fn) of - Just rules -> rules - Nothing -> [] + -- The rules for an Id come from two places: + -- (a) the ones it is born with (idCoreRules fn) + -- (b) rules added in subsequent modules (extra_rules) + -- PrimOps, for example, are born with a bunch of rules under (a) + rules = extra_rules ++ idCoreRules fn + extra_rules | isLocalId fn = [] + | otherwise = lookupNameEnv rule_base (idName fn) `orElse` [] matchRules :: (Activation -> Bool) -> InScopeSet -> Id -> [CoreExpr]