From 63f16bfb20d33a841b57e25b664e82bb5e5969ef Mon Sep 17 00:00:00 2001 From: Roman Leshchinskiy Date: Thu, 26 Jul 2007 03:12:38 +0000 Subject: [PATCH] Automatically derive PA for vectorised tycons --- compiler/vectorise/VectType.hs | 30 ++++++++++++++++++------------ compiler/vectorise/Vectorise.hs | 12 +++++++----- 2 files changed, 25 insertions(+), 17 deletions(-) diff --git a/compiler/vectorise/VectType.hs b/compiler/vectorise/VectType.hs index 85b9f24..9848acc 100644 --- a/compiler/vectorise/VectType.hs +++ b/compiler/vectorise/VectType.hs @@ -1,4 +1,5 @@ -module VectType ( vectTyCon, vectType, vectTypeEnv ) +module VectType ( vectTyCon, vectType, vectTypeEnv, + PAInstance, painstInstance, buildPADict ) where #include "HsVersions.h" @@ -80,7 +81,7 @@ data PAInstance = PAInstance { , painstArrTyCon :: TyCon } -vectTypeEnv :: TypeEnv -> VM (TypeEnv, [FamInst], [Instance]) +vectTypeEnv :: TypeEnv -> VM (TypeEnv, [FamInst], [PAInstance]) vectTypeEnv env = do cs <- readGEnv $ mk_map . global_tycons @@ -88,17 +89,22 @@ vectTypeEnv env keep_dcs = concatMap tyConDataCons keep_tcs zipWithM_ defTyCon keep_tcs keep_tcs zipWithM_ defDataCon keep_dcs keep_dcs - vect_tcs <- vectTyConDecls conv_tcs - parr_tcs1 <- zipWithM buildPArrayTyCon keep_tcs keep_tcs - parr_tcs2 <- zipWithM buildPArrayTyCon conv_tcs vect_tcs - let new_tcs = vect_tcs ++ parr_tcs1 ++ parr_tcs2 + new_tcs <- vectTyConDecls conv_tcs + + let orig_tcs = keep_tcs ++ conv_tcs + vect_tcs = keep_tcs ++ new_tcs + + parr_tcs <- zipWithM buildPArrayTyCon orig_tcs vect_tcs + pa_insts <- zipWithM buildPAInstance vect_tcs parr_tcs + + let all_new_tcs = new_tcs ++ parr_tcs let new_env = extendTypeEnvList env - (map ATyCon new_tcs - ++ [ADataCon dc | tc <- new_tcs + (map ATyCon all_new_tcs + ++ [ADataCon dc | tc <- all_new_tcs , dc <- tyConDataCons tc]) - return (new_env, map mkLocalFamInst (parr_tcs1 ++ parr_tcs2), []) + return (new_env, map mkLocalFamInst parr_tcs, pa_insts) where tycons = typeEnvTyCons env groups = tyConGroups tycons @@ -261,8 +267,8 @@ buildPArrayDataCon orig_name vect_tc repr_tc types = [ty | dc <- tyConDataCons vect_tc , ty <- dataConRepArgTys dc] -mkPAInstance :: TyCon -> TyCon -> VM PAInstance -mkPAInstance vect_tc arr_tc +buildPAInstance :: TyCon -> TyCon -> VM PAInstance +buildPAInstance vect_tc arr_tc = do pa <- builtin paClass let inst_ty = mkForAllTys tvs @@ -293,7 +299,7 @@ buildPADict (PAInstance { pa_dc <- builtin paDictDataCon let dict = mkConApp pa_dc (Type (mkTyConApp vect_tc arg_tys) : meth_exprs) - return $ (instanceDFunId inst, dict) : meth_binds + return $ (instanceDFunId inst, abstract dict) : meth_binds where tvs = tyConTyVars arr_tc arg_tys = mkTyVarTys tvs diff --git a/compiler/vectorise/Vectorise.hs b/compiler/vectorise/Vectorise.hs index a35c806..fa771d2 100644 --- a/compiler/vectorise/Vectorise.hs +++ b/compiler/vectorise/Vectorise.hs @@ -58,15 +58,17 @@ vectorise hsc_env _ _ guts vectModule :: ModGuts -> VM ModGuts vectModule guts = do - (types', fam_insts, insts) <- vectTypeEnv (mg_types guts) - - let fam_inst_env' = extendFamInstEnvList (mg_fam_inst_env guts) fam_insts + (types', fam_insts, pa_insts) <- vectTypeEnv (mg_types guts) + + let insts = map painstInstance pa_insts + fam_inst_env' = extendFamInstEnvList (mg_fam_inst_env guts) fam_insts inst_env' = extendInstEnvList (mg_inst_env guts) insts updGEnv (setInstEnvs inst_env' fam_inst_env') - + + dicts <- mapM buildPADict pa_insts binds' <- mapM vectTopBind (mg_binds guts) return $ guts { mg_types = types' - , mg_binds = binds' + , mg_binds = Rec (concat dicts) : binds' , mg_inst_env = inst_env' , mg_fam_inst_env = fam_inst_env' , mg_insts = mg_insts guts ++ insts -- 1.7.10.4