X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2Fvectorise%2FVectorise.hs;h=d074092c0f7e53b926f057189b97e5ad1a320089;hb=26dc0aa6d3a06ee6b948a2827426407c7c8cda97;hp=07293be7216fe01c607d595867995c3c4303b5cc;hpb=11ecc3de8d4aaea7bfb7ab41c862e77964bee557;p=ghc-hetmet.git diff --git a/compiler/vectorise/Vectorise.hs b/compiler/vectorise/Vectorise.hs index 07293be..d074092 100644 --- a/compiler/vectorise/Vectorise.hs +++ b/compiler/vectorise/Vectorise.hs @@ -30,8 +30,7 @@ import NameEnv import Id import MkId ( unwrapFamInstScrut ) import OccName -import RdrName ( RdrName, mkRdrQual ) -import Module ( mkModuleNameFS ) +import Module ( Module ) import DsMonad hiding (mapAndUnzipM) import DsUtils ( mkCoreTup, mkCoreTupTy ) @@ -46,22 +45,18 @@ import Outputable import FastString import Control.Monad ( liftM, liftM2, zipWithM, mapAndUnzipM ) -mkNDPVar :: String -> RdrName -mkNDPVar s = mkRdrQual nDP_BUILTIN (mkVarOcc s) - -mkNDPVarFS :: FastString -> RdrName -mkNDPVarFS fs = mkRdrQual nDP_BUILTIN (mkVarOccFS fs) - -builtin_PAs :: [(Name, RdrName)] +builtin_PAs :: [(Name, Module, FastString)] builtin_PAs = [ - mk intTyConName FSLIT("dPA_Int") + mk closureTyConName FSLIT("dPA_Clo") + , mk intTyConName FSLIT("dPA_Int") ] ++ tups where - mk name fs = (name, mkNDPVarFS fs) + mk name fs = (name, nDP_INSTANCES, fs) tups = mk_tup 0 : map mk_tup [2..3] - mk_tup n = (getName $ tupleTyCon Boxed n, mkNDPVar $ "dPA_" ++ show n) + mk_tup n = (getName $ tupleTyCon Boxed n, nDP_INSTANCES, + mkFastString $ "dPA_" ++ show n) vectorise :: HscEnv -> UniqSupply -> RuleBase -> ModGuts -> IO (SimplCount, ModGuts) @@ -79,7 +74,7 @@ vectorise hsc_env _ _ guts vectModule :: ModGuts -> VM ModGuts vectModule guts = do - defTyConRdrPAs builtin_PAs + defTyConBuiltinPAs builtin_PAs (types', fam_insts, tc_binds) <- vectTypeEnv (mg_types guts) let fam_inst_env' = extendFamInstEnvList (mg_fam_inst_env guts) fam_insts @@ -153,6 +148,14 @@ vectBndrIn v p x <- p return (vv, x) +vectBndrIn' :: Var -> (VVar -> VM a) -> VM (VVar, a) +vectBndrIn' v p + = localV + $ do + vv <- vectBndr v + x <- p vv + return (vv, x) + vectBndrsIn :: [Var] -> VM a -> VM ([VVar], a) vectBndrsIn vs p = localV @@ -226,6 +229,12 @@ vectExpr (_, AnnApp fn arg) arg' <- vectExpr arg mkClosureApp fn' arg' +vectExpr (_, AnnCase scrut bndr ty alts) + | isAlgType scrut_ty + = vectAlgCase scrut bndr ty alts + where + scrut_ty = exprType (deAnnotate scrut) + vectExpr (_, AnnCase expr bndr ty alts) = panic "vectExpr: case" @@ -278,3 +287,44 @@ vectTyAppExpr :: CoreExprWithFVs -> [Type] -> VM VExpr vectTyAppExpr (_, AnnVar v) tys = vectPolyVar v tys vectTyAppExpr e tys = pprPanic "vectTyAppExpr" (ppr $ deAnnotate e) +type CoreAltWithFVs = AnnAlt Id VarSet + +-- We convert +-- +-- case e :: t of v { ... } +-- +-- to +-- +-- V: let v = e in case v of _ { ... } +-- L: let v = e in case v `cast` ... of _ { ... } +-- +-- When lifting, we have to do it this way because v must have the type +-- [:V(T):] but the scrutinee must be cast to the representation type. +-- + +-- FIXME: this is too lazy +vectAlgCase scrut bndr ty [(DEFAULT, [], body)] + = do + vscrut <- vectExpr scrut + vty <- vectType ty + lty <- mkPArrayType vty + (vbndr, vbody) <- vectBndrIn bndr (vectExpr body) + return $ vCaseDEFAULT vscrut vbndr vty lty vbody + +vectAlgCase scrut bndr ty [(DataAlt dc, bndrs, body)] + = do + vty <- vectType ty + lty <- mkPArrayType vty + vexpr <- vectExpr scrut + (vbndr, (vbndrs, vbody)) <- vectBndrIn bndr + . vectBndrsIn bndrs + $ vectExpr body + + (vscrut, arr_tc, arg_tys) <- mkVScrut (vVar vbndr) + vect_dc <- maybeV (lookupDataCon dc) + let [arr_dc] = tyConDataCons arr_tc + let shape_tys = take (dataConRepArity arr_dc - length bndrs) + (dataConRepArgTys arr_dc) + shape_bndrs <- mapM (newLocalVar FSLIT("s")) shape_tys + return . vLet (vNonRec vbndr vexpr) + $ vCaseProd vscrut vty lty vect_dc arr_dc shape_bndrs vbndrs vbody