X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2Fvectorise%2FVectType.hs;h=9bf11e6708cb1272ed89539cb19052265afabba8;hb=d622593f562e74f734b4b6929de5d8258cf30278;hp=c6310544c17651273627168a98a44492b017f30f;hpb=7fc749a43b4b6b85d234fa95d4928648259584f4;p=ghc-hetmet.git diff --git a/compiler/vectorise/VectType.hs b/compiler/vectorise/VectType.hs index c631054..9bf11e6 100644 --- a/compiler/vectorise/VectType.hs +++ b/compiler/vectorise/VectType.hs @@ -6,7 +6,9 @@ -- for details module VectType ( vectTyCon, vectType, vectTypeEnv, - PAInstance, buildPADict ) + mkRepr, arrShapeTys, arrShapeVars, arrSelector, + PAInstance, buildPADict, + fromVect ) where #include "HsVersions.h" @@ -69,7 +71,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 @@ -80,6 +82,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 @@ -259,7 +278,9 @@ voidRepr enumRepr :: VM Repr enumRepr = do - (arr_tycon, _) <- parrayReprTyCon intTy + tycon <- builtin enumerationTyCon + let [data_con] = tyConDataCons tycon + (arr_tycon, _) <- parrayReprTyCon (mkTyConApp tycon []) let [arr_data_con] = tyConDataCons arr_tycon return $ EnumRepr { @@ -268,9 +289,6 @@ enumRepr , enum_arr_tycon = arr_tycon , enum_arr_data_con = arr_data_con } - where - tycon = intTyCon - data_con = intDataCon unboxedProductRepr :: [Type] -> VM Repr unboxedProductRepr [] = voidRepr @@ -283,7 +301,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 { @@ -339,28 +358,38 @@ 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 {}) = return [intPrimTy] +arrShapeTys (EnumRepr {}) = sumShapeTys + +sumShapeTys :: VM [Type] +sumShapeTys = do + int_arr <- builtin parrayIntPrimTyCon + return [intPrimTy, mkTyConApp int_arr [], mkTyConApp int_arr []] + arrShapeVars :: Repr -> VM [Var] 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] -replicateShape (EnumRepr {}) 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 }) @@ -374,7 +403,7 @@ emptyArrRepr (IdRepr ty) emptyArrRepr (VoidRepr { void_tycon = tycon }) = liftM singleton $ emptyPA (mkTyConApp tycon []) emptyArrRepr (EnumRepr { enum_tycon = tycon }) - = liftM singleton $ emptyPA (mkTyConApp tycon []) + = return [] arrReprTys :: Repr -> VM [Type] arrReprTys (SumRepr { sum_components = reprs }) @@ -388,7 +417,7 @@ arrReprTys (IdRepr ty) arrReprTys (VoidRepr { void_tycon = tycon }) = liftM singleton $ mkPArrayType (mkTyConApp tycon []) arrReprTys (EnumRepr {}) - = liftM singleton $ mkPArrayType intPrimTy + = return [] arrReprTys' :: Repr -> VM [[Type]] arrReprTys' (SumRepr { sum_components = reprs }) @@ -584,12 +613,13 @@ buildToArrPRepr repr vect_tc prepr_tc arr_tc . mkConApp data_con $ map Type tys ++ map Var (len_var : repr_vars) - to_repr [len_var] - [[repr_var]] + to_repr shape_vars + _ (EnumRepr { enum_arr_tycon = tycon , enum_arr_data_con = data_con }) = return . wrapFamInstBody tycon [] - $ mkConApp data_con [Var len_var, Var repr_var] + . mkConApp data_con + $ map Var shape_vars to_prod repr_vars@(r : _) (ProdRepr { prod_components = tys@(ty : _) @@ -685,15 +715,15 @@ buildFromArrPRepr repr vect_tc prepr_tc arr_tc from_prod (EnumRepr { enum_arr_tycon = tycon , enum_arr_data_con = data_con }) expr - [len_var] - [repr_var] + 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, [len_var, repr_var], body)] + [(DataAlt data_con, shape_vars, body)] from_prod (IdRepr ty) expr @@ -978,3 +1008,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` [arg_ty, res_ty] `mkApps` [expr, Var arg] + 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 +