From 9f695847ad2ace19c5fd0b937c34015af9735863 Mon Sep 17 00:00:00 2001 From: Roman Leshchinskiy Date: Thu, 30 Aug 2007 01:42:57 +0000 Subject: [PATCH] Add code for looking up PA methods of primitive TyCons --- compiler/prelude/PrelNames.lhs | 1 + compiler/vectorise/VectBuiltIn.hs | 23 +++++++++++++++++++---- compiler/vectorise/VectMonad.hs | 4 ++++ compiler/vectorise/VectUtils.hs | 30 ++++++++++++++++++++++++------ 4 files changed, 48 insertions(+), 10 deletions(-) diff --git a/compiler/prelude/PrelNames.lhs b/compiler/prelude/PrelNames.lhs index 366d254..db27cc7 100644 --- a/compiler/prelude/PrelNames.lhs +++ b/compiler/prelude/PrelNames.lhs @@ -279,6 +279,7 @@ gLA_EXTS = mkBaseModule FSLIT("GHC.Exts") nDP_PARRAY = mkNDPModule FSLIT("Data.Array.Parallel.Lifted.PArray") nDP_REPR = mkNDPModule FSLIT("Data.Array.Parallel.Lifted.Repr") nDP_CLOSURE = mkNDPModule FSLIT("Data.Array.Parallel.Lifted.Closure") +nDP_PRIM = mkNDPModule FSLIT("Data.Array.Parallel.Lifted.Prim") nDP_INSTANCES = mkNDPModule FSLIT("Data.Array.Parallel.Lifted.Instances") nDP_UARR = mkNDPModule FSLIT("Data.Array.Parallel.Unlifted.Flat.UArr") diff --git a/compiler/vectorise/VectBuiltIn.hs b/compiler/vectorise/VectBuiltIn.hs index 3eb3903..36159cf 100644 --- a/compiler/vectorise/VectBuiltIn.hs +++ b/compiler/vectorise/VectBuiltIn.hs @@ -1,6 +1,8 @@ module VectBuiltIn ( Builtins(..), sumTyCon, prodTyCon, - initBuiltins, initBuiltinTyCons, initBuiltinPAs, initBuiltinPRs + initBuiltins, initBuiltinTyCons, initBuiltinPAs, initBuiltinPRs, + + primMethod ) where #include "HsVersions.h" @@ -13,11 +15,12 @@ import DataCon ( DataCon ) import TyCon ( TyCon, tyConName, tyConDataCons ) import Var ( Var ) import Id ( mkSysLocal ) -import Name ( Name ) -import OccName ( mkVarOccFS, mkOccNameFS, tcName ) +import Name ( Name, getOccString ) +import NameEnv +import OccName import TypeRep ( funTyCon ) -import TysPrim ( intPrimTy ) +import TysPrim import TysWiredIn ( unitTyCon, tupleTyCon, intTyConName ) import PrelNames import BasicTypes ( Boxity(..) ) @@ -191,3 +194,15 @@ lookupExternalTyCon mod fs unitTyConName = tyConName unitTyCon + +primMethod :: TyCon -> String -> DsM (Maybe Var) +primMethod tycon method + | Just suffix <- lookupNameEnv prim_ty_cons (tyConName tycon) + = liftM Just + $ dsLookupGlobalId =<< lookupOrig nDP_PRIM (mkVarOcc $ method ++ suffix) + + | otherwise = return Nothing + +prim_ty_cons = mkNameEnv [mk_prim intPrimTyCon] + where + mk_prim tycon = (tyConName tycon, '_' : getOccString tycon) diff --git a/compiler/vectorise/VectMonad.hs b/compiler/vectorise/VectMonad.hs index 320d192..07638ac 100644 --- a/compiler/vectorise/VectMonad.hs +++ b/compiler/vectorise/VectMonad.hs @@ -24,6 +24,7 @@ module VectMonad ( lookupDataCon, defDataCon, lookupTyConPA, defTyConPA, defTyConPAs, lookupTyConPR, + lookupPrimMethod, lookupTyVarPA, defLocalTyVar, defLocalTyVarWithPA, localTyVars, {-lookupInst,-} lookupFamInst @@ -354,6 +355,9 @@ defDataCon :: DataCon -> DataCon -> VM () defDataCon dc dc' = updGEnv $ \env -> env { global_datacons = extendNameEnv (global_datacons env) (dataConName dc) dc' } +lookupPrimMethod :: TyCon -> String -> VM (Maybe Var) +lookupPrimMethod tycon method = liftDs $ primMethod tycon method + lookupTyConPA :: TyCon -> VM (Maybe Var) lookupTyConPA tc = readGEnv $ \env -> lookupNameEnv (global_pa_funs env) (tyConName tc) diff --git a/compiler/vectorise/VectUtils.hs b/compiler/vectorise/VectUtils.hs index 709a3c0..3c9d921 100644 --- a/compiler/vectorise/VectUtils.hs +++ b/compiler/vectorise/VectUtils.hs @@ -221,27 +221,45 @@ paDFunApply dfun tys dicts <- mapM paDictOfType tys return $ mkApps (mkTyApps dfun tys) dicts -paMethod :: (Builtins -> Var) -> Type -> VM CoreExpr -paMethod method ty +type PAMethod = (Builtins -> Var, String) + +pa_length = (lengthPAVar, "lengthPA") +pa_replicate = (replicatePAVar, "replicatePA") +pa_empty = (emptyPAVar, "emptyPA") + +paMethod :: PAMethod -> Type -> VM CoreExpr +paMethod (method, name) ty + | Just (tycon, []) <- splitTyConApp_maybe ty + , isPrimTyCon tycon + = do + fn <- traceMaybeV "paMethod" (ppr tycon <+> text name) + $ lookupPrimMethod tycon name + return (Var fn) + +paMethod (method, name) ty = do fn <- builtin method dict <- paDictOfType ty return $ mkApps (Var fn) [Type ty, dict] mkPR :: Type -> VM CoreExpr -mkPR = paMethod mkPRVar +mkPR ty + = do + fn <- builtin mkPRVar + dict <- paDictOfType ty + return $ mkApps (Var fn) [Type ty, dict] lengthPA :: CoreExpr -> VM CoreExpr -lengthPA x = liftM (`App` x) (paMethod lengthPAVar ty) +lengthPA x = liftM (`App` x) (paMethod pa_length ty) where ty = splitPArrayTy (exprType x) replicatePA :: CoreExpr -> CoreExpr -> VM CoreExpr replicatePA len x = liftM (`mkApps` [len,x]) - (paMethod replicatePAVar (exprType x)) + (paMethod pa_replicate (exprType x)) emptyPA :: Type -> VM CoreExpr -emptyPA = paMethod emptyPAVar +emptyPA = paMethod pa_empty liftPA :: CoreExpr -> VM CoreExpr liftPA x -- 1.7.10.4