X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2Fvectorise%2FVectType.hs;h=79e37fc22d9b592783179309a214e7becf6432f1;hb=e4db45612e3efa59251239e1e0b8a0440783b966;hp=dc0b351ec66de35db7bd851ec228020134f57f3a;hpb=17f77282014f9994ffebc65856b21430f6547fe1;p=ghc-hetmet.git diff --git a/compiler/vectorise/VectType.hs b/compiler/vectorise/VectType.hs index dc0b351..79e37fc 100644 --- a/compiler/vectorise/VectType.hs +++ b/compiler/vectorise/VectType.hs @@ -1,9 +1,16 @@ +{-# OPTIONS -w #-} +-- The above warning supression flag is a temporary kludge. +-- While working on this module you are encouraged to remove it and fix +-- any warnings in the module. See +-- http://hackage.haskell.org/trac/ghc/wiki/Commentary/CodingStyle#Warnings +-- for details + module VectType ( vectTyCon, vectType, vectTypeEnv, - PAInstance, buildPADict ) + mkRepr, arrShapeTys, arrShapeVars, arrSelector, + PAInstance, buildPADict, + fromVect ) where -#include "HsVersions.h" - import VectMonad import VectUtils import VectCore @@ -26,7 +33,7 @@ import Var ( Var ) import Id ( mkWildId ) import Name ( Name, getOccName ) import NameEnv -import TysWiredIn ( unitTy, unitTyCon, intTy, intDataCon, unitDataConId ) +import TysWiredIn import TysPrim ( intPrimTy ) import Unique @@ -36,6 +43,7 @@ import Util ( singleton ) import Digraph ( SCC(..), stronglyConnComp ) import Outputable +import FastString import Control.Monad ( liftM, liftM2, zipWithM, zipWithM_, mapAndUnzipM ) import Data.List ( inits, tails, zipWith4, zipWith5 ) @@ -62,7 +70,7 @@ vectType (TyVarTy tv) = return $ TyVarTy tv vectType (AppTy ty1 ty2) = liftM2 AppTy (vectType ty1) (vectType ty2) vectType (TyConApp tc tys) = liftM2 TyConApp (vectTyCon tc) (mapM vectType tys) vectType (FunTy ty1 ty2) = liftM2 TyConApp (builtin closureTyCon) - (mapM vectType [ty1,ty2]) + (mapM vectAndBoxType [ty1,ty2]) vectType ty@(ForAllTy _ _) = do mdicts <- mapM paDictArgType tyvars @@ -73,6 +81,23 @@ vectType ty@(ForAllTy _ _) vectType ty = pprPanic "vectType:" (ppr ty) +vectAndBoxType :: Type -> VM Type +vectAndBoxType ty = vectType ty >>= boxType + +-- ---------------------------------------------------------------------------- +-- Boxing + +boxType :: Type -> VM Type +boxType ty + | Just (tycon, []) <- splitTyConApp_maybe ty + , isUnLiftedTyCon tycon + = do + r <- lookupBoxedTyCon tycon + case r of + Just tycon' -> return $ mkTyConApp tycon' [] + Nothing -> return ty +boxType ty = return ty + -- ---------------------------------------------------------------------------- -- Type definitions @@ -232,6 +257,13 @@ data Repr = ProdRepr { , void_bottom :: CoreExpr } + | EnumRepr { + enum_tycon :: TyCon + , enum_data_con :: DataCon + , enum_arr_tycon :: TyCon + , enum_arr_data_con :: DataCon + } + voidRepr :: VM Repr voidRepr = do @@ -242,6 +274,21 @@ voidRepr , void_bottom = Var var } +enumRepr :: VM Repr +enumRepr + = do + tycon <- builtin enumerationTyCon + let [data_con] = tyConDataCons tycon + (arr_tycon, _) <- parrayReprTyCon (mkTyConApp tycon []) + let [arr_data_con] = tyConDataCons arr_tycon + + return $ EnumRepr { + enum_tycon = tycon + , enum_data_con = data_con + , enum_arr_tycon = arr_tycon + , enum_arr_data_con = arr_data_con + } + unboxedProductRepr :: [Type] -> VM Repr unboxedProductRepr [] = voidRepr unboxedProductRepr [ty] = return $ IdRepr ty @@ -253,7 +300,8 @@ boxedProductRepr tys tycon <- builtin (prodTyCon arity) let [data_con] = tyConDataCons tycon - (arr_tycon, _) <- parrayReprTyCon $ mkTyConApp tycon tys + tys' <- mapM boxType tys + (arr_tycon, _) <- parrayReprTyCon $ mkTyConApp tycon tys' let [arr_data_con] = tyConDataCons arr_tycon return $ ProdRepr { @@ -303,31 +351,44 @@ reprType (SumRepr { sum_tycon = tycon, sum_components = reprs }) = mkTyConApp tycon (map reprType reprs) reprType (IdRepr ty) = ty reprType (VoidRepr { void_tycon = tycon }) = mkTyConApp tycon [] +reprType (EnumRepr { enum_tycon = tycon }) = mkTyConApp tycon [] arrReprType :: Repr -> VM Type arrReprType = mkPArrayType . reprType arrShapeTys :: Repr -> VM [Type] -arrShapeTys (SumRepr {}) - = do - int_arr <- builtin parrayIntPrimTyCon - return [intPrimTy, mkTyConApp int_arr [], mkTyConApp int_arr []] +arrShapeTys (SumRepr {}) = sumShapeTys arrShapeTys (ProdRepr {}) = return [intPrimTy] arrShapeTys (IdRepr _) = return [] arrShapeTys (VoidRepr {}) = return [intPrimTy] +arrShapeTys (EnumRepr {}) = sumShapeTys + +sumShapeTys :: VM [Type] +sumShapeTys = do + int_arr <- builtin intPrimArrayTy + return [intPrimTy, int_arr, int_arr] + arrShapeVars :: Repr -> VM [Var] -arrShapeVars repr = mapM (newLocalVar FSLIT("sh")) =<< arrShapeTys repr +arrShapeVars repr = mapM (newLocalVar (fsLit "sh")) =<< arrShapeTys repr replicateShape :: Repr -> CoreExpr -> CoreExpr -> VM [CoreExpr] -replicateShape (ProdRepr {}) len _ = return [len] -replicateShape (SumRepr {}) len tag +replicateShape (ProdRepr {}) len _ = return [len] +replicateShape (SumRepr {}) len tag = replicateSumShape len tag +replicateShape (IdRepr _) _ _ = return [] +replicateShape (VoidRepr {}) len _ = return [len] +replicateShape (EnumRepr {}) len tag = replicateSumShape len tag + +replicateSumShape :: CoreExpr -> CoreExpr -> VM [CoreExpr] +replicateSumShape len tag = do rep <- builtin replicatePAIntPrimVar up <- builtin upToPAIntPrimVar return [len, Var rep `mkApps` [len, tag], Var up `App` len] -replicateShape (IdRepr _) _ _ = return [] -replicateShape (VoidRepr {}) len _ = return [len] + +arrSelector :: Repr -> [CoreExpr] -> VM (CoreExpr, CoreExpr, CoreExpr) +arrSelector (SumRepr {}) [len, sel, is] = return (len, sel, is) +arrSelector (EnumRepr {}) [len, sel, is] = return (len, sel, is) emptyArrRepr :: Repr -> VM [CoreExpr] emptyArrRepr (SumRepr { sum_components = prods }) @@ -340,6 +401,8 @@ emptyArrRepr (IdRepr ty) = liftM singleton $ emptyPA ty emptyArrRepr (VoidRepr { void_tycon = tycon }) = liftM singleton $ emptyPA (mkTyConApp tycon []) +emptyArrRepr (EnumRepr { enum_tycon = tycon }) + = return [] arrReprTys :: Repr -> VM [Type] arrReprTys (SumRepr { sum_components = reprs }) @@ -352,6 +415,8 @@ arrReprTys (IdRepr ty) = liftM singleton $ mkPArrayType ty arrReprTys (VoidRepr { void_tycon = tycon }) = liftM singleton $ mkPArrayType (mkTyConApp tycon []) +arrReprTys (EnumRepr {}) + = return [] arrReprTys' :: Repr -> VM [[Type]] arrReprTys' (SumRepr { sum_components = reprs }) @@ -360,11 +425,13 @@ arrReprTys' repr = liftM singleton $ arrReprTys repr arrReprVars :: Repr -> VM [[Var]] arrReprVars repr - = mapM (mapM (newLocalVar FSLIT("rs"))) =<< arrReprTys' repr + = mapM (mapM (newLocalVar (fsLit "rs"))) =<< arrReprTys' repr mkRepr :: TyCon -> VM Repr mkRepr vect_tc - = sumRepr =<< mapM unboxedProductRepr rep_tys + | [tys] <- rep_tys = boxedProductRepr tys + -- | all null rep_tys = enumRepr + | otherwise = sumRepr =<< mapM unboxedProductRepr rep_tys where rep_tys = map dataConRepArgTys $ tyConDataCons vect_tc @@ -374,7 +441,7 @@ buildPReprType = liftM reprType . mkRepr buildToPRepr :: Repr -> TyCon -> TyCon -> TyCon -> VM CoreExpr buildToPRepr repr vect_tc prepr_tc _ = do - arg <- newLocalVar FSLIT("x") arg_ty + arg <- newLocalVar (fsLit "x") arg_ty result <- to_repr repr (Var arg) return . Lam arg @@ -401,6 +468,12 @@ buildToPRepr repr vect_tc prepr_tc _ ty_args = map (Type . reprType) prods + to_repr (EnumRepr { enum_data_con = data_con }) expr + = return . Case expr (mkWildId (exprType expr)) res_ty + $ map mk_alt cons + where + mk_alt con = (DataAlt con, [], mkConApp data_con [mkDataConTag con]) + to_repr prod expr = do (vars, body) <- to_unboxed prod @@ -410,12 +483,12 @@ buildToPRepr repr vect_tc prepr_tc _ to_unboxed (ProdRepr { prod_components = tys , prod_data_con = data_con }) = do - vars <- mapM (newLocalVar FSLIT("r")) tys + vars <- mapM (newLocalVar (fsLit "r")) tys return (vars, mkConApp data_con (map Type tys ++ map Var vars)) to_unboxed (IdRepr ty) = do - var <- newLocalVar FSLIT("y") ty + var <- newLocalVar (fsLit "y") ty return ([var], Var var) to_unboxed (VoidRepr { void_bottom = bottom }) @@ -426,7 +499,7 @@ buildFromPRepr :: Repr -> TyCon -> TyCon -> TyCon -> VM CoreExpr buildFromPRepr repr vect_tc prepr_tc _ = do arg_ty <- mkPReprType res_ty - arg <- newLocalVar FSLIT("x") arg_ty + arg <- newLocalVar (fsLit "x") arg_ty liftM (Lam arg) . from_repr repr @@ -442,7 +515,7 @@ buildFromPRepr repr vect_tc prepr_tc _ , sum_tycon = tycon }) expr = do - vars <- mapM (newLocalVar FSLIT("x")) (map reprType prods) + vars <- mapM (newLocalVar (fsLit "x")) (map reprType prods) bodies <- sequence . zipWith3 from_unboxed prods cons $ map Var vars return . Case expr (mkWildId (reprType repr)) res_ty @@ -450,6 +523,23 @@ buildFromPRepr repr vect_tc prepr_tc _ where sum_alt data_con var body = (DataAlt data_con, [var], body) + from_repr repr@(EnumRepr { enum_data_con = data_con }) expr + = do + var <- newLocalVar (fsLit "n") intPrimTy + + let res = Case (Var var) (mkWildId intPrimTy) res_ty + $ (DEFAULT, [], error_expr) + : zipWith mk_alt (tyConDataCons vect_tc) cons + + return $ Case expr (mkWildId (reprType repr)) res_ty + [(DataAlt data_con, [var], res)] + where + mk_alt data_con con = (LitAlt (mkDataConTagLit data_con), [], con) + + error_expr = mkRuntimeErrorApp rUNTIME_ERROR_ID res_ty + . showSDoc + $ sep [text "Invalid NDP representation of", ppr vect_tc] + from_repr repr expr = from_unboxed repr con expr from_unboxed prod@(ProdRepr { prod_components = tys @@ -457,7 +547,7 @@ buildFromPRepr repr vect_tc prepr_tc _ con expr = do - vars <- mapM (newLocalVar FSLIT("y")) tys + vars <- mapM (newLocalVar (fsLit "y")) tys return $ Case expr (mkWildId (reprType prod)) res_ty [(DataAlt data_con, vars, con `mkVarApps` vars)] @@ -471,7 +561,7 @@ buildToArrPRepr :: Repr -> TyCon -> TyCon -> TyCon -> VM CoreExpr buildToArrPRepr repr vect_tc prepr_tc arr_tc = do arg_ty <- mkPArrayType el_ty - arg <- newLocalVar FSLIT("xs") arg_ty + arg <- newLocalVar (fsLit "xs") arg_ty res_ty <- mkPArrayType (reprType repr) @@ -522,12 +612,20 @@ buildToArrPRepr repr vect_tc prepr_tc arr_tc . mkConApp data_con $ map Type tys ++ map Var (len_var : repr_vars) + to_repr shape_vars + _ + (EnumRepr { enum_arr_tycon = tycon + , enum_arr_data_con = data_con }) + = return . wrapFamInstBody tycon [] + . mkConApp data_con + $ map Var shape_vars + to_prod repr_vars@(r : _) - (ProdRepr { prod_components = tys + (ProdRepr { prod_components = tys@(ty : _) , prod_arr_tycon = tycon , prod_arr_data_con = data_con }) = do - len <- lengthPA (Var r) + len <- lengthPA ty (Var r) return . wrapFamInstBody tycon tys . mkConApp data_con $ map Type tys ++ len : map Var repr_vars @@ -540,7 +638,7 @@ buildFromArrPRepr :: Repr -> TyCon -> TyCon -> TyCon -> VM CoreExpr buildFromArrPRepr repr vect_tc prepr_tc arr_tc = do arg_ty <- mkPArrayType =<< mkPReprType el_ty - arg <- newLocalVar FSLIT("xs") arg_ty + arg <- newLocalVar (fsLit "xs") arg_ty res_ty <- mkPArrayType el_ty @@ -576,7 +674,7 @@ buildFromArrPRepr repr vect_tc prepr_tc arr_tc res_ty body = do - vars <- mapM (newLocalVar FSLIT("xs")) =<< mapM arrReprType prods + vars <- mapM (newLocalVar (fsLit "xs")) =<< mapM arrReprType prods result <- go prods repr_vars vars body let scrut = unwrapFamInstScrut tycon ty_args expr @@ -589,7 +687,7 @@ buildFromArrPRepr repr vect_tc prepr_tc arr_tc go [] [] [] body = return body go (prod : prods) (repr_vars : rss) (var : vars) body = do - shape_vars <- mapM (newLocalVar FSLIT("s")) =<< arrShapeTys prod + shape_vars <- mapM (newLocalVar (fsLit "s")) =<< arrShapeTys prod from_prod prod (Var var) shape_vars repr_vars res_ty =<< go prods rss vars body @@ -613,6 +711,19 @@ buildFromArrPRepr repr vect_tc prepr_tc arr_tc return $ Case scrut (mkWildId scrut_ty) res_ty [(DataAlt data_con, shape_vars ++ repr_vars, body)] + from_prod (EnumRepr { enum_arr_tycon = tycon + , enum_arr_data_con = data_con }) + expr + shape_vars + _ + res_ty + body + = let scrut = unwrapFamInstScrut tycon [] expr + scrut_ty = mkTyConApp tycon [] + in + return $ Case scrut (mkWildId scrut_ty) res_ty + [(DataAlt data_con, shape_vars, body)] + from_prod (IdRepr ty) expr shape_vars @@ -650,6 +761,9 @@ buildPRDictRepr (SumRepr { dfun <- prDFunOfTyCon tycon return $ dfun `mkTyApps` map reprType prods `mkApps` prs +buildPRDictRepr (EnumRepr { enum_tycon = tycon }) + = prDFunOfTyCon tycon + buildPRDict :: Repr -> TyCon -> TyCon -> TyCon -> VM CoreExpr buildPRDict repr vect_tc prepr_tc _ = do @@ -766,7 +880,7 @@ vectDataConWorkers repr orig_tc vect_tc arr_tc lift_data_con tys pre_reprs post_reprs tag = do len <- builtin liftingContext - args <- mapM (newLocalVar FSLIT("xs")) + args <- mapM (newLocalVar (fsLit "xs")) =<< mapM mkPArrayType tys shape <- replicateShape repr (Var len) tag @@ -823,11 +937,11 @@ buildPADict repr vect_tc prepr_tc arr_tc dfun var <- newLocalVar name (exprType body) return (var, mkInlineMe body) -paMethods = [(FSLIT("toPRepr"), buildToPRepr), - (FSLIT("fromPRepr"), buildFromPRepr), - (FSLIT("toArrPRepr"), buildToArrPRepr), - (FSLIT("fromArrPRepr"), buildFromArrPRepr), - (FSLIT("dictPRepr"), buildPRDict)] +paMethods = [(fsLit "toPRepr", buildToPRepr), + (fsLit "fromPRepr", buildFromPRepr), + (fsLit "toArrPRepr", buildToArrPRepr), + (fsLit "fromArrPRepr", buildFromArrPRepr), + (fsLit "dictPRepr", buildPRDict)] -- | Split the given tycons into two sets depending on whether they have to be -- converted (first list) or not (second list). The first argument contains @@ -893,3 +1007,41 @@ tyConsOfType other = pprPanic "ClosureConv.tyConsOfType" $ ppr other tyConsOfTypes :: [Type] -> UniqSet TyCon tyConsOfTypes = unionManyUniqSets . map tyConsOfType + +-- ---------------------------------------------------------------------------- +-- Conversions + +fromVect :: Type -> CoreExpr -> VM CoreExpr +fromVect ty expr | Just ty' <- coreView ty = fromVect ty' expr +fromVect (FunTy arg_ty res_ty) expr + = do + arg <- newLocalVar (fsLit "x") arg_ty + varg <- toVect arg_ty (Var arg) + varg_ty <- vectType arg_ty + vres_ty <- vectType res_ty + apply <- builtin applyClosureVar + body <- fromVect res_ty + $ Var apply `mkTyApps` [varg_ty, vres_ty] `mkApps` [expr, varg] + return $ Lam arg body +fromVect ty expr + = identityConv ty >> return expr + +toVect :: Type -> CoreExpr -> VM CoreExpr +toVect ty expr = identityConv ty >> return expr + +identityConv :: Type -> VM () +identityConv ty | Just ty' <- coreView ty = identityConv ty' +identityConv (TyConApp tycon tys) + = do + mapM_ identityConv tys + identityConvTyCon tycon +identityConv ty = noV + +identityConvTyCon :: TyCon -> VM () +identityConvTyCon tc + | isBoxedTupleTyCon tc = return () + | isUnLiftedTyCon tc = return () + | otherwise = do + tc' <- maybeV (lookupTyCon tc) + if tc == tc' then return () else noV +