X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2FsimplCore%2FCSE.lhs;h=3354bf86b2b12e9037ed7bc4b31472247fa90425;hb=679a97e27c505c285e0a35ea5c0e572eac07cff3;hp=4eb977d5bb42e417a99925e77e394bbd8d0560f5;hpb=9e93335020e64a811dbbb223e1727c76933a93ae;p=ghc-hetmet.git diff --git a/ghc/compiler/simplCore/CSE.lhs b/ghc/compiler/simplCore/CSE.lhs index 4eb977d..3354bf8 100644 --- a/ghc/compiler/simplCore/CSE.lhs +++ b/ghc/compiler/simplCore/CSE.lhs @@ -11,7 +11,8 @@ module CSE ( #include "HsVersions.h" import CmdLineOpts ( DynFlag(..), DynFlags ) -import Id ( Id, idType ) +import Id ( Id, idType, idWorkerInfo ) +import IdInfo ( workerExists ) import CoreUtils ( hashExpr, cheapEqExpr, exprIsBig, mkAltExpr ) import DataCon ( isUnboxedTupleCon ) import Type ( tyConAppArgs ) @@ -126,12 +127,23 @@ cseBind env (Rec pairs) = let (env', pairs') = mapAccumL do_one env pairs in (env', Rec pairs') -do_one env (id, rhs) = case lookupCSEnv env rhs' of - Just other_id -> (extendSubst env' id other_id, (id', Var other_id)) - Nothing -> (addCSEnvItem env' id' rhs', (id', rhs')) - where - (env', id') = addBinder env id - rhs' = cseExpr env' rhs +do_one env (id, rhs) + = case lookupCSEnv env rhs' of + Just other_id -> (extendSubst env' id other_id, (id', Var other_id)) + Nothing -> (addCSEnvItem env' id' rhs', (id', rhs')) + where + (env', id') = addBinder env id + rhs' | not (workerExists (idWorkerInfo id)) = cseExpr env' rhs + + -- Hack alert: don't do CSE on wrapper RHSs. + -- Otherwise we find: + -- $wf = h + -- f = \x -> ...$wf... + -- ===> + -- f = \x -> ...h... + -- But the WorkerInfo for f still says $wf, which is now dead! + | otherwise = rhs + tryForCSE :: CSEnv -> CoreExpr -> CoreExpr tryForCSE env (Type t) = Type t