From 8adf1ec28fe3a1549e39401e705d013f29da6ef6 Mon Sep 17 00:00:00 2001 From: Roman Leshchinskiy Date: Mon, 16 Jul 2007 10:58:47 +0000 Subject: [PATCH] Abstract over all in-scope type variables when creating closures --- compiler/vectorise/VectMonad.hs | 24 +++++++++++++++++++----- compiler/vectorise/Vectorise.hs | 4 ++-- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/compiler/vectorise/VectMonad.hs b/compiler/vectorise/VectMonad.hs index 68966a1..c6267a5 100644 --- a/compiler/vectorise/VectMonad.hs +++ b/compiler/vectorise/VectMonad.hs @@ -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 } @@ -287,11 +292,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. -- diff --git a/compiler/vectorise/Vectorise.hs b/compiler/vectorise/Vectorise.hs index a73e705..c974c20 100644 --- a/compiler/vectorise/Vectorise.hs +++ b/compiler/vectorise/Vectorise.hs @@ -175,7 +175,7 @@ abstractOverTyVars :: [TyVar] -> ((CoreExpr -> CoreExpr) -> VM a) -> VM a abstractOverTyVars tvs p = do mdicts <- mapM mk_dict_var tvs - zipWithM_ (\tv -> maybe (deleteTyVarPA tv) (extendTyVarPA tv . Var)) tvs mdicts + zipWithM_ (\tv -> maybe (defLocalTyVar tv) (defLocalTyVarWithPA tv . Var)) tvs mdicts p (mk_lams mdicts) where mk_dict_var tv = do @@ -262,7 +262,7 @@ vectExpr lc e@(_, AnnLam bndr body) vectExpr lc (fvs, AnnLam bndr body) = do - let tyvars = filter isTyVar (varSetElems fvs) + tyvars <- localTyVars info <- mkCEnvInfo fvs bndr body (poly_vfn, poly_lfn) <- mkClosureFns info tyvars bndr body -- 1.7.10.4