X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2Fvectorise%2FVectorise.hs;h=cd1f42945474f6b39a4352036519cea14f4532cc;hb=e79c9ce01d0ce4412bd4bcd99c8c728a6a2ec569;hp=63575b90f16f742c6379cc4150268bc351351ec0;hpb=8b3ebc412fc61eb1f2a6129190d85fcdd851235e;p=ghc-hetmet.git diff --git a/compiler/vectorise/Vectorise.hs b/compiler/vectorise/Vectorise.hs index 63575b9..cd1f429 100644 --- a/compiler/vectorise/Vectorise.hs +++ b/compiler/vectorise/Vectorise.hs @@ -1,79 +1,60 @@ -{-# 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 Vectorise( vectorise ) where -#include "HsVersions.h" - import VectMonad import VectUtils import VectType import VectCore -import DynFlags -import HscTypes +import HscTypes hiding ( MonadThings(..) ) -import CoreLint ( showPass, endPass ) +import Module ( PackageId ) import CoreSyn import CoreUtils import CoreFVs -import SimplMonad ( SimplCount, zeroSimplCount ) -import Rules ( RuleBase ) +import CoreMonad ( CoreM, getHscEnv, liftIO ) import DataCon import TyCon import Type import FamInstEnv ( extendFamInstEnvList ) -import InstEnv ( extendInstEnvList ) import Var import VarEnv import VarSet -import Name ( Name, mkSysTvName, getName ) -import NameEnv import Id -import MkId ( unwrapFamInstScrut ) import OccName -import Module ( Module ) -import DsMonad hiding (mapAndUnzipM) -import DsUtils ( mkCoreTup, mkCoreTupTy ) +import DsMonad -import Literal ( Literal ) -import PrelNames +import Literal ( Literal, mkMachInt ) import TysWiredIn -import TysPrim ( intPrimTy ) -import BasicTypes ( Boxity(..) ) import Outputable import FastString -import Control.Monad ( liftM, liftM2, zipWithM, mapAndUnzipM ) +import Control.Monad ( liftM, liftM2, zipWithM ) import Data.List ( sortBy, unzip4 ) -vectorise :: HscEnv -> UniqSupply -> RuleBase -> ModGuts - -> IO (SimplCount, ModGuts) -vectorise hsc_env _ _ guts +vectorise :: PackageId -> ModGuts -> CoreM ModGuts +vectorise backend guts = do + hsc_env <- getHscEnv + liftIO $ vectoriseIO backend hsc_env guts + +vectoriseIO :: PackageId -> HscEnv -> ModGuts -> IO ModGuts +vectoriseIO backend hsc_env guts = do - showPass dflags "Vectorisation" eps <- hscEPS hsc_env let info = hptVectInfo hsc_env `plusVectInfo` eps_vect_info eps - Just (info', guts') <- initV hsc_env guts info (vectModule guts) - endPass dflags "Vectorisation" Opt_D_dump_vect (mg_binds guts') - return (zeroSimplCount dflags, guts' { mg_vect_info = info' }) - where - dflags = hsc_dflags hsc_env + Just (info', guts') <- initV backend hsc_env guts info (vectModule guts) + return (guts' { mg_vect_info = info' }) vectModule :: ModGuts -> VM ModGuts vectModule guts = do (types', fam_insts, tc_binds) <- vectTypeEnv (mg_types guts) - + let fam_inst_env' = extendFamInstEnvList (mg_fam_inst_env guts) fam_insts updGEnv (setFamInstEnv fam_inst_env') - + -- dicts <- mapM buildPADict pa_insts -- workers <- mapM vectDataConWorkers pa_insts binds' <- mapM vectTopBind (mg_binds guts) @@ -113,7 +94,7 @@ vectTopBinder var var' <- cloneId mkVectOcc var vty defGlobalVar var var' return var' - + vectTopRhs :: Var -> CoreExpr -> VM CoreExpr vectTopRhs var expr = do @@ -131,8 +112,7 @@ tryConvert var vect_var rhs vectBndr :: Var -> VM VVar vectBndr v = do - vty <- vectType (idType v) - lty <- mkPArrayType vty + (vty, lty) <- vectAndLiftType (idType v) let vv = v `Id.setIdType` vty lv = v `Id.setIdType` lty updLEnv (mapTo vv lv) @@ -166,14 +146,6 @@ vectBndrNewIn v fs 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 @@ -216,14 +188,16 @@ vectLiteral lit return (Lit lit, lexpr) vectPolyExpr :: CoreExprWithFVs -> VM VExpr +vectPolyExpr (_, AnnNote note expr) + = liftM (vNote note) $ vectPolyExpr expr vectPolyExpr expr = polyAbstract tvs $ \abstract -> do mono' <- vectExpr mono return $ mapVect abstract mono' where - (tvs, mono) = collectAnnTypeBinders expr - + (tvs, mono) = collectAnnTypeBinders expr + vectExpr :: CoreExprWithFVs -> VM VExpr vectExpr (_, AnnType ty) = liftM vType (vectType ty) @@ -241,6 +215,17 @@ vectExpr e@(_, AnnApp _ arg) where (fn, tys) = collectAnnTypeArgs e +vectExpr (_, AnnApp (_, AnnVar v) (_, AnnLit lit)) + | Just con <- isDataConId_maybe v + , is_special_con con + = do + let vexpr = App (Var v) (Lit lit) + lexpr <- liftPA vexpr + return (vexpr, lexpr) + where + is_special_con con = con `elem` [intDataCon, floatDataCon, doubleDataCon] + + vectExpr (_, AnnApp fn arg) = do arg_ty' <- vectType arg_ty @@ -258,9 +243,6 @@ vectExpr (_, AnnCase scrut bndr ty alts) where scrut_ty = exprType (deAnnotate scrut) -vectExpr (_, AnnCase expr bndr ty alts) - = panic "vectExpr: case" - vectExpr (_, AnnLet (AnnNonRec bndr rhs) body) = do vrhs <- localV . inBind bndr $ vectPolyExpr rhs @@ -282,11 +264,12 @@ vectExpr (_, AnnLet (AnnRec bs) body) $ vectExpr rhs vectExpr e@(fvs, AnnLam bndr _) - | not (isId bndr) = pprPanic "vectExpr" (ppr $ deAnnotate e) - | otherwise = vectLam fvs bs body + | isId bndr = vectLam fvs bs body where (bs,body) = collectAnnValBinders e +vectExpr e = cantVectorise "Can't vectorise expression" (ppr $ deAnnotate e) + vectLam :: VarSet -> [Var] -> CoreExprWithFVs -> VM VExpr vectLam fvs bs body = do @@ -305,12 +288,11 @@ vectLam fvs bs body (vbndrs, vbody) <- vectBndrsIn (vs ++ bs) (vectExpr body) return $ vLams lc vbndrs vbody - + 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 +vectTyAppExpr e tys = cantVectorise "Can't vectorise expression" + (ppr $ deAnnotate e `mkTyApps` tys) -- We convert -- @@ -324,28 +306,36 @@ type CoreAltWithFVs = AnnAlt Id VarSet -- 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. We also -- have to handle the case where v is a wild var correctly. --- +-- -- FIXME: this is too lazy -vectAlgCase tycon ty_args scrut bndr ty [(DEFAULT, [], body)] +vectAlgCase :: TyCon -> [Type] -> CoreExprWithFVs -> Var -> Type + -> [(AltCon, [Var], CoreExprWithFVs)] + -> VM VExpr +vectAlgCase _tycon _ty_args scrut bndr ty [(DEFAULT, [], body)] = do - vscrut <- vectExpr scrut - vty <- vectType ty - lty <- mkPArrayType vty + vscrut <- vectExpr scrut + (vty, lty) <- vectAndLiftType ty (vbndr, vbody) <- vectBndrIn bndr (vectExpr body) return $ vCaseDEFAULT vscrut vbndr vty lty vbody -vectAlgCase tycon ty_args scrut bndr ty [(DataAlt dc, bndrs, body)] +vectAlgCase _tycon _ty_args scrut bndr ty [(DataAlt _, [], body)] = do - vect_tc <- maybeV (lookupTyCon tycon) - vty <- vectType ty - lty <- mkPArrayType vty - vexpr <- vectExpr scrut + vscrut <- vectExpr scrut + (vty, lty) <- vectAndLiftType ty + (vbndr, vbody) <- vectBndrIn bndr (vectExpr body) + return $ vCaseDEFAULT vscrut vbndr vty lty vbody + +vectAlgCase tycon _ty_args scrut bndr ty [(DataAlt dc, bndrs, body)] + = do + vect_tc <- maybeV (lookupTyCon tycon) + (vty, lty) <- vectAndLiftType ty + vexpr <- vectExpr scrut (vbndr, (vbndrs, vbody)) <- vect_scrut_bndr . vectBndrsIn bndrs $ vectExpr body - (vscrut, arr_tc, arg_tys) <- mkVScrut (vVar vbndr) + (vscrut, arr_tc, _arg_tys) <- mkVScrut (vVar vbndr) vect_dc <- maybeV (lookupDataCon dc) let [arr_dc] = tyConDataCons arr_tc repr <- mkRepr vect_tc @@ -353,41 +343,41 @@ vectAlgCase tycon ty_args scrut bndr ty [(DataAlt dc, bndrs, body)] return . vLet (vNonRec vbndr vexpr) $ vCaseProd vscrut vty lty vect_dc arr_dc shape_bndrs vbndrs vbody where - vect_scrut_bndr | isDeadBinder bndr = vectBndrNewIn bndr FSLIT("scrut") + vect_scrut_bndr | isDeadBinder bndr = vectBndrNewIn bndr (fsLit "scrut") | otherwise = vectBndrIn bndr -vectAlgCase tycon ty_args scrut bndr ty alts +vectAlgCase tycon _ty_args scrut bndr ty alts = do - vect_tc <- maybeV (lookupTyCon tycon) - vty <- vectType ty - lty <- mkPArrayType vty - + vect_tc <- maybeV (lookupTyCon tycon) + (vty, lty) <- vectAndLiftType ty repr <- mkRepr vect_tc shape_bndrs <- arrShapeVars repr (len, sel, indices) <- arrSelector repr (map Var shape_bndrs) - (vbndr, valts) <- vect_scrut_bndr $ mapM (proc_alt sel lty) alts' + (vbndr, valts) <- vect_scrut_bndr $ mapM (proc_alt sel vty lty) alts' let (vect_dcs, vect_bndrss, lift_bndrss, vbodies) = unzip4 valts vexpr <- vectExpr scrut - (vscrut, arr_tc, arg_tys) <- mkVScrut (vVar vbndr) + (vscrut, arr_tc, _arg_tys) <- mkVScrut (vVar vbndr) let [arr_dc] = tyConDataCons arr_tc let (vect_scrut, lift_scrut) = vscrut (vect_bodies, lift_bodies) = unzip vbodies - let vect_case = Case vect_scrut (mkWildId (exprType vect_scrut)) vty + vdummy <- newDummyVar (exprType vect_scrut) + ldummy <- newDummyVar (exprType lift_scrut) + let vect_case = Case vect_scrut vdummy vty (zipWith3 mk_vect_alt vect_dcs vect_bndrss vect_bodies) lbody <- combinePA vty len sel indices lift_bodies - let lift_case = Case lift_scrut (mkWildId (exprType lift_scrut)) lty + let lift_case = Case lift_scrut ldummy lty [(DataAlt arr_dc, shape_bndrs ++ concat lift_bndrss, lbody)] return . vLet (vNonRec vbndr vexpr) $ (vect_case, lift_case) where - vect_scrut_bndr | isDeadBinder bndr = vectBndrNewIn bndr FSLIT("scrut") + vect_scrut_bndr | isDeadBinder bndr = vectBndrNewIn bndr (fsLit "scrut") | otherwise = vectBndrIn bndr alts' = sortBy (\(alt1, _, _) (alt2, _, _) -> cmp alt1 alt2) alts @@ -396,25 +386,27 @@ vectAlgCase tycon ty_args scrut bndr ty alts cmp DEFAULT DEFAULT = EQ cmp DEFAULT _ = LT cmp _ DEFAULT = GT + cmp _ _ = panic "vectAlgCase/cmp" - proc_alt sel lty (DataAlt dc, bndrs, body) + proc_alt sel vty lty (DataAlt dc, bndrs, body) = do vect_dc <- maybeV (lookupDataCon dc) let tag = mkDataConTag vect_dc fvs = freeVarsOf body `delVarSetList` bndrs (vect_bndrs, lift_bndrs, vbody) <- vect_alt_bndrs bndrs - $ \len -> packLiftingContext len sel tag fvs lty + $ \len -> packLiftingContext len sel tag fvs vty lty $ vectExpr body return (vect_dc, vect_bndrs, lift_bndrs, vbody) + proc_alt _ _ _ _ = panic "vectAlgCase/proc_alt" vect_alt_bndrs [] p = do void_tc <- builtin voidTyCon let void_ty = mkTyConApp void_tc [] arr_ty <- mkPArrayType void_ty - bndr <- newLocalVar FSLIT("voids") arr_ty + bndr <- newLocalVar (fsLit "voids") arr_ty len <- lengthPA void_ty (Var bndr) e <- p len return ([], [bndr], e) @@ -432,12 +424,13 @@ vectAlgCase tycon ty_args scrut bndr ty alts mk_vect_alt vect_dc bndrs body = (DataAlt vect_dc, bndrs, body) -packLiftingContext :: CoreExpr -> CoreExpr -> CoreExpr -> VarSet -> Type -> VM VExpr -> VM VExpr -packLiftingContext len shape tag fvs res_ty p +packLiftingContext :: CoreExpr -> CoreExpr -> CoreExpr -> VarSet + -> Type -> Type -> VM VExpr -> VM VExpr +packLiftingContext len shape tag fvs vty lty p = do select <- builtin selectPAIntPrimVar let sel_expr = mkApps (Var select) [shape, tag] - sel_var <- newLocalVar FSLIT("sel#") (exprType sel_expr) + sel_var <- newLocalVar (fsLit "sel#") (exprType sel_expr) lc_var <- builtin liftingContext localV $ do @@ -445,8 +438,11 @@ packLiftingContext len shape tag fvs res_ty p . filter isLocalId $ varSetElems fvs (vexpr, lexpr) <- p + empty <- emptyPA vty return (vexpr, Let (NonRec sel_var sel_expr) - $ Case len lc_var res_ty [(DEFAULT, [], lexpr)]) + $ Case len lc_var lty + [(DEFAULT, [], mkLets (concat bnds) lexpr), + (LitAlt (mkMachInt 0), [], empty)]) packFreeVar :: CoreExpr -> CoreExpr -> Var -> VM [CoreBind] packFreeVar len sel v