X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2Fvectorise%2FVectorise.hs;h=c612a0a99d96c33f65b25d6b747881c90d3e67b9;hb=3f6a74eafcabc1f8d496937a33ec92e7b416f989;hp=024ae45a20bbb1ad7055ebba5001c1a5f203304e;hpb=0e0e3d99dae75cc21e5d5202cdfb57d05a81ee37;p=ghc-hetmet.git diff --git a/compiler/vectorise/Vectorise.hs b/compiler/vectorise/Vectorise.hs index 024ae45..c612a0a 100644 --- a/compiler/vectorise/Vectorise.hs +++ b/compiler/vectorise/Vectorise.hs @@ -1,9 +1,3 @@ -{-# 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 @@ -14,8 +8,9 @@ import VectType import VectCore import DynFlags -import HscTypes +import HscTypes hiding ( MonadThings(..) ) +import Module ( dphSeqPackageId, dphParPackageId ) import CoreLint ( showPass, endPass ) import CoreSyn import CoreUtils @@ -26,44 +21,39 @@ 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, mkMachInt ) -import PrelNames 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 +vectorise :: DPHBackend -> HscEnv -> UniqSupply -> RuleBase -> ModGuts -> IO (SimplCount, ModGuts) -vectorise hsc_env _ _ guts +vectorise 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) + Just (info', guts') <- initV (backendPackage backend) 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 + backendPackage DPHSeq = dphSeqPackageId + backendPackage DPHPar = dphParPackageId + vectModule :: ModGuts -> VM ModGuts vectModule guts = do @@ -163,14 +153,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 @@ -268,9 +250,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 @@ -292,12 +271,11 @@ 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 = pprPanic "vectExpr" (ppr $ deAnnotate e) +vectExpr e = cantVectorise "Can't vectorise expression" (ppr $ deAnnotate e) vectLam :: VarSet -> [Var] -> CoreExprWithFVs -> VM VExpr vectLam fvs bs body @@ -320,9 +298,8 @@ vectLam fvs bs body 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 -- @@ -339,21 +316,24 @@ type CoreAltWithFVs = AnnAlt Id VarSet -- -- 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, 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, [], body)] +vectAlgCase _tycon _ty_args scrut bndr ty [(DataAlt _, [], body)] = do 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 dc, bndrs, body)] = do vect_tc <- maybeV (lookupTyCon tycon) (vty, lty) <- vectAndLiftType ty @@ -362,7 +342,7 @@ vectAlgCase tycon ty_args scrut bndr ty [(DataAlt dc, bndrs, body)] . 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 @@ -373,7 +353,7 @@ vectAlgCase tycon ty_args scrut bndr ty [(DataAlt dc, bndrs, body)] 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, lty) <- vectAndLiftType ty @@ -385,17 +365,19 @@ vectAlgCase tycon ty_args scrut bndr ty 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)] @@ -411,6 +393,7 @@ 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 vty lty (DataAlt dc, bndrs, body) = do @@ -423,6 +406,7 @@ vectAlgCase tycon ty_args scrut bndr ty alts $ vectExpr body return (vect_dc, vect_bndrs, lift_bndrs, vbody) + proc_alt _ _ _ _ = panic "vectAlgCase/proc_alt" vect_alt_bndrs [] p = do