X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=blobdiff_plain;f=compiler%2Fvectorise%2FVectType.hs;h=c77343b7e5b6ebc0b073ad84d3fb03b54edffdef;hp=4f8ab7ff870544fa3cc8b05d94f5f6d71a6c163b;hb=9396c0736a7e7d73c2a13f1a18104e0c43b924b0;hpb=c4f31cc44f596c5fb04083da9bc0ee39e3e44646 diff --git a/compiler/vectorise/VectType.hs b/compiler/vectorise/VectType.hs index 4f8ab7f..c77343b 100644 --- a/compiler/vectorise/VectType.hs +++ b/compiler/vectorise/VectType.hs @@ -26,7 +26,7 @@ import Var ( Var ) import Id ( mkWildId ) import Name ( Name, getOccName ) import NameEnv -import TysWiredIn ( intTy, intDataCon ) +import TysWiredIn ( unitTy, intTy, intDataCon ) import TysPrim ( intPrimTy ) import Unique @@ -37,7 +37,7 @@ import Digraph ( SCC(..), stronglyConnComp ) import Outputable import Control.Monad ( liftM, liftM2, zipWithM, zipWithM_ ) -import Data.List ( inits, tails, zipWith4 ) +import Data.List ( inits, tails, zipWith4, zipWith5 ) -- ---------------------------------------------------------------------------- -- Types @@ -97,19 +97,24 @@ vectTypeEnv env let orig_tcs = keep_tcs ++ conv_tcs vect_tcs = keep_tcs ++ new_tcs + repr_tcs <- zipWithM buildPReprTyCon orig_tcs vect_tcs parr_tcs <- zipWithM buildPArrayTyCon orig_tcs vect_tcs dfuns <- mapM mkPADFun vect_tcs defTyConPAs (zip vect_tcs dfuns) - binds <- sequence (zipWith4 buildTyConBindings orig_tcs vect_tcs parr_tcs dfuns) - - let all_new_tcs = new_tcs ++ parr_tcs + binds <- sequence (zipWith5 buildTyConBindings orig_tcs + vect_tcs + repr_tcs + parr_tcs + dfuns) + + let all_new_tcs = new_tcs ++ repr_tcs ++ parr_tcs let new_env = extendTypeEnvList env (map ATyCon all_new_tcs ++ [ADataCon dc | tc <- all_new_tcs , dc <- tyConDataCons tc]) - return (new_env, map mkLocalFamInst parr_tcs, concat binds) + return (new_env, map mkLocalFamInst (repr_tcs ++ parr_tcs), concat binds) where tycons = typeEnvTyCons env groups = tyConGroups tycons @@ -186,6 +191,63 @@ vectDataCon dc rep_arg_tys = dataConRepArgTys dc tycon = dataConTyCon dc +mk_fam_inst :: TyCon -> TyCon -> (TyCon, [Type]) +mk_fam_inst fam_tc arg_tc + = (fam_tc, [mkTyConApp arg_tc . mkTyVarTys $ tyConTyVars arg_tc]) + +buildPReprTyCon :: TyCon -> TyCon -> VM TyCon +buildPReprTyCon orig_tc vect_tc + = do + name <- cloneName mkPReprTyConOcc (tyConName orig_tc) + rhs_ty <- buildPReprType vect_tc + prepr_tc <- builtin preprTyCon + liftDs $ buildSynTyCon name + tyvars + (SynonymTyCon rhs_ty) + (Just $ mk_fam_inst prepr_tc vect_tc) + where + tyvars = tyConTyVars vect_tc + +buildPReprType :: TyCon -> VM Type +buildPReprType = mkPRepr . map dataConRepArgTys . tyConDataCons + +buildToPRepr :: Shape -> TyCon -> TyCon -> TyCon -> VM CoreExpr +buildToPRepr _ vect_tc prepr_tc _ + = do + arg <- newLocalVar FSLIT("x") arg_ty + bndrss <- mapM (mapM (newLocalVar FSLIT("x"))) rep_tys + (alt_bodies, res_ty) <- mkToPRepr $ map (map Var) bndrss + + return . Lam arg + . wrapFamInstBody prepr_tc var_tys + . Case (Var arg) (mkWildId arg_ty) res_ty + $ zipWith3 mk_alt data_cons bndrss alt_bodies + where + var_tys = mkTyVarTys $ tyConTyVars vect_tc + arg_ty = mkTyConApp vect_tc var_tys + data_cons = tyConDataCons vect_tc + rep_tys = map dataConRepArgTys data_cons + + mk_alt data_con bndrs body = (DataAlt data_con, bndrs, body) + +buildFromPRepr :: Shape -> TyCon -> TyCon -> TyCon -> VM CoreExpr +buildFromPRepr _ vect_tc prepr_tc _ + = do + arg_ty <- mkPReprType res_ty + arg <- newLocalVar FSLIT("x") arg_ty + alts <- mapM mk_alt data_cons + body <- mkFromPRepr (unwrapFamInstScrut prepr_tc var_tys (Var arg)) + res_ty alts + return $ Lam arg body + where + var_tys = mkTyVarTys $ tyConTyVars vect_tc + res_ty = mkTyConApp vect_tc var_tys + data_cons = tyConDataCons vect_tc + + mk_alt dc = do + bndrs <- mapM (newLocalVar FSLIT("x")) $ dataConRepArgTys dc + return (bndrs, mkConApp dc (map Type var_tys ++ map Var bndrs)) + buildPArrayTyCon :: TyCon -> TyCon -> VM TyCon buildPArrayTyCon orig_tc vect_tc = fixV $ \repr_tc -> do @@ -200,7 +262,7 @@ buildPArrayTyCon orig_tc vect_tc = fixV $ \repr_tc -> rec_flag -- FIXME: is this ok? False -- FIXME: no generics False -- not GADT syntax - (Just (parray, [mkTyConApp vect_tc (map mkTyVarTy tyvars)])) + (Just $ mk_fam_inst parray vect_tc) where orig_name = tyConName orig_tc tyvars = tyConTyVars vect_tc @@ -267,8 +329,9 @@ tyConShape vect_tc return [e] } -buildTyConBindings :: TyCon -> TyCon -> TyCon -> Var -> VM [(Var, CoreExpr)] -buildTyConBindings orig_tc vect_tc arr_tc dfun +buildTyConBindings :: TyCon -> TyCon -> TyCon -> TyCon -> Var + -> VM [(Var, CoreExpr)] +buildTyConBindings orig_tc vect_tc prepr_tc arr_tc dfun = do shape <- tyConShape vect_tc sequence_ (zipWith4 (vectDataConWorker shape vect_tc arr_tc arr_dc) @@ -276,7 +339,7 @@ buildTyConBindings orig_tc vect_tc arr_tc dfun vect_dcs (inits repr_tys) (tails repr_tys)) - dict <- buildPADict shape vect_tc arr_tc dfun + dict <- buildPADict shape vect_tc prepr_tc arr_tc dfun binds <- takeHoisted return $ (dfun, dict) : binds where @@ -328,8 +391,8 @@ vectDataConWorker shape vect_tc arr_tc arr_dc orig_dc vect_dc pre (dc_tys : post ++ map Var args ++ empty_post -buildPADict :: Shape -> TyCon -> TyCon -> Var -> VM CoreExpr -buildPADict shape vect_tc arr_tc dfun +buildPADict :: Shape -> TyCon -> TyCon -> TyCon -> Var -> VM CoreExpr +buildPADict shape vect_tc prepr_tc arr_tc dfun = polyAbstract tvs $ \abstract -> do meth_binds <- mapM (mk_method shape) paMethods @@ -346,15 +409,17 @@ buildPADict shape vect_tc arr_tc dfun mk_method shape (name, build) = localV $ do - body <- build shape vect_tc arr_tc + body <- build shape vect_tc prepr_tc arr_tc var <- newLocalVar name (exprType body) return (var, mkInlineMe body) paMethods = [(FSLIT("lengthPA"), buildLengthPA), - (FSLIT("replicatePA"), buildReplicatePA)] + (FSLIT("replicatePA"), buildReplicatePA), + (FSLIT("toPRepr"), buildToPRepr), + (FSLIT("fromPRepr"), buildFromPRepr)] -buildLengthPA :: Shape -> TyCon -> TyCon -> VM CoreExpr -buildLengthPA shape vect_tc arr_tc +buildLengthPA :: Shape -> TyCon -> TyCon -> TyCon -> VM CoreExpr +buildLengthPA shape vect_tc _ arr_tc = do parr_ty <- mkPArrayType (mkTyConApp vect_tc arg_tys) arg <- newLocalVar FSLIT("xs") parr_ty @@ -402,8 +467,8 @@ buildLengthPA shape vect_tc arr_tc -- -- -buildReplicatePA :: Shape -> TyCon -> TyCon -> VM CoreExpr -buildReplicatePA shape vect_tc arr_tc +buildReplicatePA :: Shape -> TyCon -> TyCon -> TyCon -> VM CoreExpr +buildReplicatePA shape vect_tc _ arr_tc = do len_var <- newLocalVar FSLIT("n") intPrimTy val_var <- newLocalVar FSLIT("x") val_ty