X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2FsimplCore%2FCoreMonad.lhs;h=67a0991ec0b43d7518ee46e6776b78b626637b99;hb=85895e17972cefb40c03359f7ff01c0793e72c81;hp=c527d820c569e3b3c272307899a207880f64cccf;hpb=61899158575bc64e692d6ab350c43c5d8ec1d8e2;p=ghc-hetmet.git diff --git a/compiler/simplCore/CoreMonad.lhs b/compiler/simplCore/CoreMonad.lhs index c527d82..67a0991 100644 --- a/compiler/simplCore/CoreMonad.lhs +++ b/compiler/simplCore/CoreMonad.lhs @@ -43,6 +43,8 @@ module CoreMonad ( debugTraceMsg, debugTraceMsgS, dumpIfSet_dyn, + lookupOrigCoreM, + #ifdef GHCI -- * Getting 'Name's thNameToGhcName @@ -90,6 +92,11 @@ import Data.Word import Control.Monad import Prelude hiding ( read ) +import OccName +import IfaceEnv +import Name +import SrcLoc +import Control.Exception.Base #ifdef GHCI import {-# SOURCE #-} TcSplice ( lookupThName_maybe ) @@ -370,13 +377,21 @@ getCoreToDo dflags simpl_phase phase names iter = CoreDoPasses - [ maybe_strictness_before phase + $ [ maybe_strictness_before phase , CoreDoSimplify iter (base_mode { sm_phase = Phase phase , sm_names = names }) - , maybe_rule_check (Phase phase) - ] + , maybe_rule_check (Phase phase) ] + + -- Vectorisation can introduce a fair few common sub expressions involving + -- DPH primitives. For example, see the Reverse test from dph-examples. + -- We need to eliminate these common sub expressions before their definitions + -- are inlined in phase 2. The CSE introduces lots of v1 = v2 bindings, + -- so we also run simpl_gently to inline them. + ++ (if dopt Opt_Vectorise dflags && phase == 3 + then [CoreCSE, simpl_gently] + else []) vectorisation = runWhen (dopt Opt_Vectorise dflags) $ @@ -1113,3 +1128,29 @@ thNameToGhcName th_name = do liftIO $ initTcForLookup hsc_env (lookupThName_maybe th_name) #endif \end{code} + +\begin{code} +updNameCache' :: (NameCache -> (NameCache, a)) -> CoreM a +updNameCache' upd_fn = do + HscEnv { hsc_NC = nc_var } <- getHscEnv + r <- liftIO $ atomicModifyIORef nc_var upd_fn + r' <- liftIO $ readIORef nc_var + _ <- liftIO $ evaluate r' + return r + +-- cut-and-pasted from IfaceEnv, where it lives in the TcRn monad rather than CoreM +lookupOrigCoreM :: Module -> OccName -> CoreM Name +lookupOrigCoreM mod occ + = do { mod `seq` occ `seq` return () + ; updNameCache' $ \name_cache -> + case lookupOrigNameCache (nsNames name_cache) mod occ of { + Just name -> (name_cache, name); + Nothing -> + case takeUniqFromSupply (nsUniqs name_cache) of { + (uniq, us) -> + let + name = mkExternalName uniq mod occ noSrcSpan + new_cache = extendNameCache (nsNames name_cache) mod occ name + in (name_cache{ nsUniqs = us, nsNames = new_cache }, name) + }}} +\end{code} \ No newline at end of file