X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=blobdiff_plain;f=compiler%2Fvectorise%2FVectType.hs;h=90a082527e6948bce21b788b2a2e71a3bff2797b;hp=972aca1b7b9cc4842bfed33a1025d80242bd9fa0;hb=d40970b835f4fddb099e67a0d4ed684ed6802d23;hpb=727fae32ea0b6ca6ebdf1b3137649813e4d7ac3d diff --git a/compiler/vectorise/VectType.hs b/compiler/vectorise/VectType.hs index 972aca1..90a0825 100644 --- a/compiler/vectorise/VectType.hs +++ b/compiler/vectorise/VectType.hs @@ -1,18 +1,10 @@ -{-# 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, + +module VectType ( vectTyCon, vectAndLiftType, vectType, vectTypeEnv, mkRepr, arrShapeTys, arrShapeVars, arrSelector, - PAInstance, buildPADict, + buildPADict, fromVect ) where -#include "HsVersions.h" - import VectMonad import VectUtils import VectCore @@ -27,11 +19,10 @@ import Type import TypeRep import Coercion import FamInstEnv ( FamInst, mkLocalFamInst ) -import InstEnv ( Instance, mkLocalInstance, instanceDFunId ) import OccName import MkId -import BasicTypes ( StrictnessMark(..), OverlapFlag(..), boolToRecFlag ) -import Var ( Var ) +import BasicTypes ( StrictnessMark(..), boolToRecFlag ) +import Var ( Var, TyVar ) import Id ( mkWildId ) import Name ( Name, getOccName ) import NameEnv @@ -39,12 +30,13 @@ import TysWiredIn import TysPrim ( intPrimTy ) import Unique -import LazyUniqFM +import UniqFM import UniqSet 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 ) @@ -65,6 +57,20 @@ vectTyCon tc -- FIXME: just for now Nothing -> pprTrace "ccTyCon:" (ppr tc) $ return tc +vectAndLiftType :: Type -> VM (Type, Type) +vectAndLiftType ty | Just ty' <- coreView ty = vectAndLiftType ty' +vectAndLiftType ty + = do + mdicts <- mapM paDictArgType tyvars + let dicts = [dict | Just dict <- mdicts] + vmono_ty <- vectType mono_ty + lmono_ty <- mkPArrayType vmono_ty + return (abstractType tyvars dicts vmono_ty, + abstractType tyvars dicts lmono_ty) + where + (tyvars, mono_ty) = splitForAllTys ty + + vectType :: Type -> VM Type vectType ty | Just ty' <- coreView ty = vectType ty' vectType (TyVarTy tv) = return $ TyVarTy tv @@ -76,7 +82,7 @@ vectType ty@(ForAllTy _ _) = do mdicts <- mapM paDictArgType tyvars mono_ty' <- vectType mono_ty - return $ tyvars `mkForAllTys` ([dict | Just dict <- mdicts] `mkFunTys` mono_ty') + return $ abstractType tyvars [dict | Just dict <- mdicts] mono_ty' where (tyvars, mono_ty) = splitForAllTys ty @@ -85,6 +91,9 @@ vectType ty = pprPanic "vectType:" (ppr ty) vectAndBoxType :: Type -> VM Type vectAndBoxType ty = vectType ty >>= boxType +abstractType :: [TyVar] -> [Type] -> Type -> Type +abstractType tyvars dicts = mkForAllTys tyvars . mkFunTys dicts + -- ---------------------------------------------------------------------------- -- Boxing @@ -104,13 +113,6 @@ boxType ty = return ty type TyConGroup = ([TyCon], UniqSet TyCon) -data PAInstance = PAInstance { - painstDFun :: Var - , painstOrigTyCon :: TyCon - , painstVectTyCon :: TyCon - , painstArrTyCon :: TyCon - } - vectTypeEnv :: TypeEnv -> VM (TypeEnv, [FamInst], [(Var, CoreExpr)]) vectTypeEnv env = do @@ -148,10 +150,6 @@ vectTypeEnv env mk_map env = listToUFM_Directly [(u, getUnique n /= u) | (u,n) <- nameEnvUniqueElts env] - keep_tc tc = let dcs = tyConDataCons tc - in - defTyCon tc tc >> zipWithM_ defDataCon dcs dcs - vectTyConDecls :: [TyCon] -> VM [TyCon] vectTyConDecls tcs = fixV $ \tcs' -> @@ -191,6 +189,7 @@ vectAlgTyConRhs (DataTyCon { data_cons = data_cons return $ DataTyCon { data_cons = data_cons' , is_enum = is_enum } +vectAlgTyConRhs _ = panic "vectAlgTyConRhs" vectDataCon :: DataCon -> VM DataCon vectDataCon dc @@ -275,6 +274,7 @@ voidRepr , void_bottom = Var var } +{- enumRepr :: VM Repr enumRepr = do @@ -289,6 +289,7 @@ enumRepr , enum_arr_tycon = arr_tycon , enum_arr_data_con = arr_data_con } +-} unboxedProductRepr :: [Type] -> VM Repr unboxedProductRepr [] = voidRepr @@ -371,7 +372,7 @@ sumShapeTys = do 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] @@ -390,6 +391,7 @@ replicateSumShape len tag 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) +arrSelector _ _ = panic "arrSelector" emptyArrRepr :: Repr -> VM [CoreExpr] emptyArrRepr (SumRepr { sum_components = prods }) @@ -402,7 +404,7 @@ emptyArrRepr (IdRepr ty) = liftM singleton $ emptyPA ty emptyArrRepr (VoidRepr { void_tycon = tycon }) = liftM singleton $ emptyPA (mkTyConApp tycon []) -emptyArrRepr (EnumRepr { enum_tycon = tycon }) +emptyArrRepr (EnumRepr {}) = return [] arrReprTys :: Repr -> VM [Type] @@ -426,7 +428,7 @@ 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 @@ -442,7 +444,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 @@ -484,23 +486,25 @@ 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 }) = return ([], bottom) + to_unboxed _ = panic "buildToPRepr/to_unboxed" + 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 @@ -516,7 +520,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 @@ -526,7 +530,7 @@ buildFromPRepr repr vect_tc prepr_tc _ from_repr repr@(EnumRepr { enum_data_con = data_con }) expr = do - var <- newLocalVar FSLIT("n") intPrimTy + var <- newLocalVar (fsLit "n") intPrimTy let res = Case (Var var) (mkWildId intPrimTy) res_ty $ (DEFAULT, [], error_expr) @@ -548,21 +552,23 @@ 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)] from_unboxed (IdRepr _) con expr = return $ con `App` expr - from_unboxed (VoidRepr {}) con expr + from_unboxed (VoidRepr {}) con _ = return con + from_unboxed _ _ _ = panic "buildFromPRepr/from_unboxed" + 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) @@ -590,7 +596,7 @@ buildToArrPRepr repr vect_tc prepr_tc arr_tc [arr_dc] = tyConDataCons arr_tc - to_repr shape_vars@(len_var : _) + to_repr shape_vars@(_ : _) repr_vars (SumRepr { sum_components = prods , sum_arr_tycon = tycon @@ -621,6 +627,8 @@ buildToArrPRepr repr vect_tc prepr_tc arr_tc . mkConApp data_con $ map Var shape_vars + to_repr _ _ _ = panic "buildToArrPRepr/to_repr" + to_prod repr_vars@(r : _) (ProdRepr { prod_components = tys@(ty : _) , prod_arr_tycon = tycon @@ -631,15 +639,16 @@ buildToArrPRepr repr vect_tc prepr_tc arr_tc . mkConApp data_con $ map Type tys ++ len : map Var repr_vars - to_prod [var] (IdRepr ty) = return (Var var) + to_prod [var] (IdRepr _) = return (Var var) to_prod [var] (VoidRepr {}) = return (Var var) + to_prod _ _ = panic "buildToArrPRepr/to_prod" 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 @@ -675,7 +684,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 @@ -688,14 +697,17 @@ 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 + go _ _ _ _ = panic "buildFromArrPRepr/go" from_repr repr expr shape_vars [repr_vars] res_ty body = from_prod repr expr shape_vars repr_vars res_ty body + from_repr _ _ _ _ _ _ = panic "buildFromArrPRepr/from_repr" + from_prod prod@(ProdRepr { prod_components = tys , prod_arr_tycon = tycon , prod_arr_data_con = data_con }) @@ -707,7 +719,7 @@ buildFromArrPRepr repr vect_tc prepr_tc arr_tc = do let scrut = unwrapFamInstScrut tycon tys expr scrut_ty = mkTyConApp tycon tys - ty <- arrReprType prod + _ty <- arrReprType prod return $ Case scrut (mkWildId scrut_ty) res_ty [(DataAlt data_con, shape_vars ++ repr_vars, body)] @@ -725,22 +737,24 @@ buildFromArrPRepr repr vect_tc prepr_tc arr_tc return $ Case scrut (mkWildId scrut_ty) res_ty [(DataAlt data_con, shape_vars, body)] - from_prod (IdRepr ty) + from_prod (IdRepr _) expr - shape_vars + _shape_vars [repr_var] - res_ty + _res_ty body = return $ Let (NonRec repr_var expr) body from_prod (VoidRepr {}) expr - shape_vars + _shape_vars [repr_var] - res_ty + _res_ty body = return $ Let (NonRec repr_var expr) body + from_prod _ _ _ _ _ _ = panic "buildFromArrPRepr/from_prod" + buildPRDictRepr :: Repr -> VM CoreExpr buildPRDictRepr (VoidRepr { void_tycon = tycon }) = prDFunOfTyCon tycon @@ -843,12 +857,6 @@ buildTyConBindings orig_tc vect_tc prepr_tc arr_tc dfun dict <- buildPADict repr vect_tc prepr_tc arr_tc dfun binds <- takeHoisted return $ (dfun, dict) : binds - where - orig_dcs = tyConDataCons orig_tc - vect_dcs = tyConDataCons vect_tc - [arr_dc] = tyConDataCons arr_tc - - repr_tys = map dataConRepArgTys vect_dcs vectDataConWorkers :: Repr -> TyCon -> TyCon -> TyCon -> VM () @@ -881,7 +889,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 @@ -900,7 +908,7 @@ vectDataConWorkers repr orig_tc vect_tc arr_tc units <- replicatePA len (Var unitDataConId) return [units] - mk_arr_repr len arrs = return arrs + mk_arr_repr _ arrs = return arrs def_worker data_con arg_tys mk_body = do @@ -917,7 +925,7 @@ vectDataConWorkers repr orig_tc vect_tc arr_tc orig_worker = dataConWorkId data_con buildPADict :: Repr -> TyCon -> TyCon -> TyCon -> Var -> VM CoreExpr -buildPADict repr vect_tc prepr_tc arr_tc dfun +buildPADict repr vect_tc prepr_tc arr_tc _ = polyAbstract tvs $ \abstract -> do meth_binds <- mapM (mk_method repr) paMethods @@ -938,11 +946,12 @@ 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 :: [(FastString, Repr -> TyCon -> TyCon -> TyCon -> VM CoreExpr)] +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 @@ -955,7 +964,7 @@ paMethods = [(FSLIT("toPRepr"), buildToPRepr), classifyTyCons :: UniqFM Bool -> [TyConGroup] -> ([TyCon], [TyCon]) classifyTyCons = classify [] [] where - classify conv keep cs [] = (conv, keep) + classify conv keep _ [] = (conv, keep) classify conv keep cs ((tcs, ds) : rs) | can_convert && must_convert = classify (tcs ++ conv) keep (cs `addListToUFM` [(tc,True) | tc <- tcs]) rs @@ -991,7 +1000,7 @@ tyConsOfTyCon tyConsOfType :: Type -> UniqSet TyCon tyConsOfType ty | Just ty' <- coreView ty = tyConsOfType ty' -tyConsOfType (TyVarTy v) = emptyUniqSet +tyConsOfType (TyVarTy _) = emptyUniqSet tyConsOfType (TyConApp tc tys) = extend (tyConsOfTypes tys) where extend | isUnLiftedTyCon tc @@ -1016,7 +1025,7 @@ 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 + arg <- newLocalVar (fsLit "x") arg_ty varg <- toVect arg_ty (Var arg) varg_ty <- vectType arg_ty vres_ty <- vectType res_ty @@ -1036,7 +1045,7 @@ identityConv (TyConApp tycon tys) = do mapM_ identityConv tys identityConvTyCon tycon -identityConv ty = noV +identityConv _ = noV identityConvTyCon :: TyCon -> VM () identityConvTyCon tc