X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2Fvectorise%2FVectMonad.hs;h=2e076971cce92bc27e494b357a40ab4df732eb0c;hb=d7c0802c7f6219ccbde97e9aacba1c0e4bed49d4;hp=fee294fc63b01aa422335f4536fb0a34671b8a8c;hpb=b6fc60f5c350f121c9955c131fcdf7e643160ddd;p=ghc-hetmet.git diff --git a/compiler/vectorise/VectMonad.hs b/compiler/vectorise/VectMonad.hs index fee294f..2e07697 100644 --- a/compiler/vectorise/VectMonad.hs +++ b/compiler/vectorise/VectMonad.hs @@ -2,7 +2,7 @@ module VectMonad ( Scope(..), VM, - noV, tryV, maybeV, orElseV, localV, closedV, initV, + noV, tryV, maybeV, orElseV, fixV, localV, closedV, initV, cloneName, newLocalVar, newTyVar, Builtins(..), paDictTyCon, @@ -16,7 +16,7 @@ module VectMonad ( defGlobalVar, lookupVar, lookupTyCon, - lookupTyVarPA, extendTyVarPA, deleteTyVarPA, + lookupTyVarPA, defLocalTyVar, defLocalTyVarWithPA, localTyVars, lookupInst, lookupFamInst ) where @@ -132,6 +132,10 @@ data LocalEnv = LocalEnv { -- local_vars :: VarEnv (CoreExpr, CoreExpr) + -- In-scope type variables + -- + , local_tyvars :: [TyVar] + -- Mapping from tyvars to their PA dictionaries , local_tyvar_pa :: VarEnv CoreExpr } @@ -151,6 +155,7 @@ initGlobalEnv info instEnvs famInstEnvs emptyLocalEnv = LocalEnv { local_vars = emptyVarEnv + , local_tyvars = [] , local_tyvar_pa = emptyVarEnv } @@ -196,6 +201,11 @@ maybeV p = maybe noV return =<< p orElseV :: VM a -> VM a -> VM a orElseV p q = maybe q return =<< tryV p +fixV :: (a -> VM a) -> VM a +fixV f = VM (\bi genv lenv -> fixDs $ \r -> runVM (f (unYes r)) bi genv lenv ) + where + unYes (Yes _ _ x) = x + localV :: VM a -> VM a localV p = do env <- readLEnv id @@ -263,8 +273,14 @@ newTyVar fs k u <- liftDs newUnique return $ mkTyVar (mkSysTvName u fs) k -defGlobalVar :: Var -> CoreExpr -> VM () -defGlobalVar v e = updGEnv $ \env -> env { global_vars = extendVarEnv (global_vars env) v e } +defGlobalVar :: Var -> Var -> VM () +defGlobalVar v v' = updGEnv $ \env -> + env { global_vars = extendVarEnv (global_vars env) v (Var v') + , global_exported_vars = upd (global_exported_vars env) + } + where + upd env | isExportedId v = extendVarEnv env v (v, v') + | otherwise = env lookupVar :: Var -> VM (Scope CoreExpr (CoreExpr, CoreExpr)) lookupVar v @@ -281,11 +297,20 @@ lookupTyCon tc = readGEnv $ \env -> lookupNameEnv (global_tycons env) (tyConName lookupTyVarPA :: Var -> VM (Maybe CoreExpr) lookupTyVarPA tv = readLEnv $ \env -> lookupVarEnv (local_tyvar_pa env) tv -extendTyVarPA :: Var -> CoreExpr -> VM () -extendTyVarPA tv pa = updLEnv $ \env -> env { local_tyvar_pa = extendVarEnv (local_tyvar_pa env) tv pa } +defLocalTyVar :: TyVar -> VM () +defLocalTyVar tv = updLEnv $ \env -> + env { local_tyvars = tv : local_tyvars env + , local_tyvar_pa = local_tyvar_pa env `delVarEnv` tv + } + +defLocalTyVarWithPA :: TyVar -> CoreExpr -> VM () +defLocalTyVarWithPA tv pa = updLEnv $ \env -> + env { local_tyvars = tv : local_tyvars env + , local_tyvar_pa = extendVarEnv (local_tyvar_pa env) tv pa + } -deleteTyVarPA :: Var -> VM () -deleteTyVarPA tv = updLEnv $ \env -> env { local_tyvar_pa = delVarEnv (local_tyvar_pa env) tv } +localTyVars :: VM [TyVar] +localTyVars = readLEnv (reverse . local_tyvars) -- Look up the dfun of a class instance. --