X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2Fvectorise%2FVectBuiltIn.hs;h=2cfb28c76ad1f971b60e100e1b40f852baa43ff2;hb=709faa1b6cbc3704e23da7d99392475a7e4207cd;hp=995d16f01671c6f5f7bbf3e81e1b905eb89d4475;hpb=7c377a7aaee5fb2df00a3c612c364b606293b161;p=ghc-hetmet.git diff --git a/compiler/vectorise/VectBuiltIn.hs b/compiler/vectorise/VectBuiltIn.hs index 995d16f..2cfb28c 100644 --- a/compiler/vectorise/VectBuiltIn.hs +++ b/compiler/vectorise/VectBuiltIn.hs @@ -1,26 +1,18 @@ -{-# 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 VectBuiltIn ( - Builtins(..), sumTyCon, prodTyCon, combinePAVar, - initBuiltins, initBuiltinTyCons, initBuiltinDataCons, + Builtins(..), sumTyCon, prodTyCon, uarrTy, intPrimArrayTy, + combinePAVar, + initBuiltins, initBuiltinVars, initBuiltinTyCons, initBuiltinDataCons, initBuiltinPAs, initBuiltinPRs, initBuiltinBoxedTyCons, primMethod, primPArray ) where -#include "HsVersions.h" - import DsMonad import IfaceEnv ( lookupOrig ) -import Module ( Module ) -import DataCon ( DataCon, dataConName ) +import Module +import DataCon ( DataCon, dataConName, dataConWorkId ) import TyCon ( TyCon, tyConName, tyConDataCons ) import Var ( Var ) import Id ( mkSysLocal ) @@ -29,12 +21,15 @@ import NameEnv import OccName import TypeRep ( funTyCon ) -import Type ( Type ) +import Type ( Type, mkTyConApp ) import TysPrim -import TysWiredIn ( unitTyCon, tupleTyCon, - intTyCon, intTyConName, - boolTyCon, boolTyConName, trueDataCon, falseDataCon ) -import Module +import TysWiredIn ( unitTyCon, unitDataCon, + tupleTyCon, tupleCon, + intTyCon, intTyConName, intTy, + doubleTyCon, doubleTyConName, + boolTyCon, boolTyConName, trueDataCon, falseDataCon, + parrTyConName ) +import PrelNames ( gHC_PARR ) import BasicTypes ( Boxity(..) ) import FastString @@ -42,9 +37,10 @@ import Outputable import Data.Array import Control.Monad ( liftM, zipWithM ) +import Data.List ( unzip4 ) mAX_NDP_PROD :: Int -mAX_NDP_PROD = 3 +mAX_NDP_PROD = 5 mAX_NDP_SUM :: Int mAX_NDP_SUM = 3 @@ -55,11 +51,32 @@ mAX_NDP_COMBINE = 2 mkNDPModule :: FastString -> Module mkNDPModule m = mkModule ndpPackageId (mkModuleNameFS m) -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, + nDP_PARRAY, + nDP_REPR, + nDP_CLOSURE, + nDP_UNBOXED, + nDP_INSTANCES, + nDP_COMBINATORS, + nDP_PRELUDE_PARR, + nDP_PRELUDE_INT, + nDP_PRELUDE_DOUBLE, + nDP_PRELUDE_BOOL, + nDP_PRELUDE_TUPLE :: Module + +nDP_UARR = mkNDPModule (fsLit "Data.Array.Parallel.Unlifted.Flat.UArr") +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_UNBOXED = mkNDPModule (fsLit "Data.Array.Parallel.Lifted.Unboxed") +nDP_INSTANCES = mkNDPModule (fsLit "Data.Array.Parallel.Lifted.Instances") +nDP_COMBINATORS = mkNDPModule (fsLit "Data.Array.Parallel.Lifted.Combinators") + +nDP_PRELUDE_PARR = mkNDPModule (fsLit "Data.Array.Parallel.Prelude.Base.PArr") +nDP_PRELUDE_INT = mkNDPModule (fsLit "Data.Array.Parallel.Prelude.Base.Int") +nDP_PRELUDE_DOUBLE = mkNDPModule (fsLit "Data.Array.Parallel.Prelude.Base.Double") +nDP_PRELUDE_BOOL = mkNDPModule (fsLit "Data.Array.Parallel.Prelude.Base.Bool") +nDP_PRELUDE_TUPLE = mkNDPModule (fsLit "Data.Array.Parallel.Prelude.Base.Tuple") data Builtins = Builtins { parrayTyCon :: TyCon @@ -68,8 +85,7 @@ data Builtins = Builtins { , preprTyCon :: TyCon , prTyCon :: TyCon , prDataCon :: DataCon - , parrayIntPrimTyCon :: TyCon - , parrayBoolPrimTyCon :: TyCon + , uarrTyCon :: TyCon , voidTyCon :: TyCon , wrapTyCon :: TyCon , enumerationTyCon :: TyCon @@ -93,6 +109,12 @@ data Builtins = Builtins { , liftingContext :: Var } +uarrTy :: Type -> Builtins -> Type +uarrTy ty bi = mkTyConApp (uarrTyCon bi) [ty] + +intPrimArrayTy :: Builtins -> Type +intPrimArrayTy = uarrTy intTy + sumTyCon :: Int -> Builtins -> TyCon sumTyCon n bi | n >= 2 && n <= mAX_NDP_SUM = sumTyCons bi ! n @@ -112,45 +134,44 @@ combinePAVar n bi initBuiltins :: DsM Builtins initBuiltins = do - parrayTyCon <- externalTyCon nDP_PARRAY FSLIT("PArray") - paTyCon <- externalTyCon nDP_PARRAY FSLIT("PA") + parrayTyCon <- externalTyCon nDP_PARRAY (fsLit "PArray") + paTyCon <- externalTyCon nDP_PARRAY (fsLit "PA") let [paDataCon] = tyConDataCons paTyCon - preprTyCon <- externalTyCon nDP_PARRAY FSLIT("PRepr") - prTyCon <- externalTyCon nDP_PARRAY FSLIT("PR") + preprTyCon <- externalTyCon nDP_PARRAY (fsLit "PRepr") + prTyCon <- externalTyCon nDP_PARRAY (fsLit "PR") let [prDataCon] = tyConDataCons prTyCon - parrayIntPrimTyCon <- externalTyCon nDP_PRIM FSLIT("PArray_Int#") - parrayBoolPrimTyCon <- externalTyCon nDP_PRIM FSLIT("PArray_Bool#") - closureTyCon <- externalTyCon nDP_CLOSURE FSLIT(":->") + uarrTyCon <- externalTyCon nDP_UARR (fsLit "UArr") + closureTyCon <- externalTyCon nDP_CLOSURE (fsLit ":->") - voidTyCon <- externalTyCon nDP_REPR FSLIT("Void") - wrapTyCon <- externalTyCon nDP_REPR FSLIT("Wrap") - enumerationTyCon <- externalTyCon nDP_REPR FSLIT("Enumeration") + voidTyCon <- externalTyCon nDP_REPR (fsLit "Void") + wrapTyCon <- externalTyCon nDP_REPR (fsLit "Wrap") + enumerationTyCon <- externalTyCon nDP_REPR (fsLit "Enumeration") sum_tcs <- mapM (externalTyCon nDP_REPR) [mkFastString ("Sum" ++ show i) | i <- [2..mAX_NDP_SUM]] let sumTyCons = listArray (2, mAX_NDP_SUM) sum_tcs - voidVar <- externalVar nDP_REPR FSLIT("void") - mkPRVar <- externalVar nDP_PARRAY FSLIT("mkPR") - mkClosureVar <- externalVar nDP_CLOSURE FSLIT("mkClosure") - applyClosureVar <- externalVar nDP_CLOSURE FSLIT("$:") - mkClosurePVar <- externalVar nDP_CLOSURE FSLIT("mkClosureP") - applyClosurePVar <- externalVar nDP_CLOSURE FSLIT("$:^") - replicatePAIntPrimVar <- externalVar nDP_PRIM FSLIT("replicatePA_Int#") - upToPAIntPrimVar <- externalVar nDP_PRIM FSLIT("upToPA_Int#") - selectPAIntPrimVar <- externalVar nDP_PRIM FSLIT("selectPA_Int#") - truesPABoolPrimVar <- externalVar nDP_PRIM FSLIT("truesPA_Bool#") - lengthPAVar <- externalVar nDP_PARRAY FSLIT("lengthPA") - replicatePAVar <- externalVar nDP_PARRAY FSLIT("replicatePA") - emptyPAVar <- externalVar nDP_PARRAY FSLIT("emptyPA") - packPAVar <- externalVar nDP_PARRAY FSLIT("packPA") + voidVar <- externalVar nDP_REPR (fsLit "void") + mkPRVar <- externalVar nDP_PARRAY (fsLit "mkPR") + mkClosureVar <- externalVar nDP_CLOSURE (fsLit "mkClosure") + applyClosureVar <- externalVar nDP_CLOSURE (fsLit "$:") + mkClosurePVar <- externalVar nDP_CLOSURE (fsLit "mkClosureP") + applyClosurePVar <- externalVar nDP_CLOSURE (fsLit "$:^") + replicatePAIntPrimVar <- externalVar nDP_UNBOXED (fsLit "replicatePA_Int#") + upToPAIntPrimVar <- externalVar nDP_UNBOXED (fsLit "upToPA_Int#") + selectPAIntPrimVar <- externalVar nDP_UNBOXED (fsLit "selectPA_Int#") + truesPABoolPrimVar <- externalVar nDP_UNBOXED (fsLit "truesPA_Bool#") + lengthPAVar <- externalVar nDP_PARRAY (fsLit "lengthPA#") + replicatePAVar <- externalVar nDP_PARRAY (fsLit "replicatePA#") + emptyPAVar <- externalVar nDP_PARRAY (fsLit "emptyPA") + packPAVar <- externalVar nDP_PARRAY (fsLit "packPA#") combines <- mapM (externalVar nDP_PARRAY) - [mkFastString ("combine" ++ show i ++ "PA") + [mkFastString ("combine" ++ show i ++ "PA#") | i <- [2..mAX_NDP_COMBINE]] let combinePAVars = listArray (2, mAX_NDP_COMBINE) combines - liftingContext <- liftM (\u -> mkSysLocal FSLIT("lc") u intPrimTy) + liftingContext <- liftM (\u -> mkSysLocal (fsLit "lc") u intPrimTy) newUnique return $ Builtins { @@ -160,8 +181,7 @@ initBuiltins , preprTyCon = preprTyCon , prTyCon = prTyCon , prDataCon = prDataCon - , parrayIntPrimTyCon = parrayIntPrimTyCon - , parrayBoolPrimTyCon = parrayBoolPrimTyCon + , uarrTyCon = uarrTyCon , voidTyCon = voidTyCon , wrapTyCon = wrapTyCon , enumerationTyCon = enumerationTyCon @@ -185,18 +205,113 @@ initBuiltins , liftingContext = liftingContext } -initBuiltinTyCons :: Builtins -> [(Name, TyCon)] -initBuiltinTyCons bi = (tyConName funTyCon, closureTyCon bi) - : [(tyConName tc, tc) | tc <- defaultTyCons] +initBuiltinVars :: Builtins -> DsM [(Var, Var)] +initBuiltinVars _ + = do + uvars <- zipWithM externalVar umods ufs + vvars <- zipWithM externalVar vmods vfs + cvars <- zipWithM externalVar cmods cfs + return $ [(v,v) | v <- map dataConWorkId defaultDataConWorkers] + ++ zip (map dataConWorkId cons) cvars + ++ zip uvars vvars + where + (umods, ufs, vmods, vfs) = unzip4 preludeVars + + (cons, cmods, cfs) = unzip3 preludeDataCons + +defaultDataConWorkers :: [DataCon] +defaultDataConWorkers = [trueDataCon, falseDataCon, unitDataCon] + +preludeDataCons :: [(DataCon, Module, FastString)] +preludeDataCons + = [mk_tup n nDP_PRELUDE_TUPLE (mkFastString $ "tup" ++ show n) | n <- [2..3]] + where + mk_tup n mod name = (tupleCon Boxed n, mod, name) + +preludeVars :: [(Module, FastString, Module, FastString)] +preludeVars + = [ + mk gHC_PARR (fsLit "mapP") nDP_COMBINATORS (fsLit "mapPA") + , mk gHC_PARR (fsLit "zipWithP") nDP_COMBINATORS (fsLit "zipWithPA") + , mk gHC_PARR (fsLit "zipP") nDP_COMBINATORS (fsLit "zipPA") + , mk gHC_PARR (fsLit "unzipP") nDP_COMBINATORS (fsLit "unzipPA") + , mk gHC_PARR (fsLit "filterP") nDP_COMBINATORS (fsLit "filterPA") + , mk gHC_PARR (fsLit "lengthP") nDP_COMBINATORS (fsLit "lengthPA") + , mk gHC_PARR (fsLit "replicateP") nDP_COMBINATORS (fsLit "replicatePA") + , mk gHC_PARR (fsLit "!:") nDP_COMBINATORS (fsLit "indexPA") + , mk gHC_PARR (fsLit "crossMapP") nDP_COMBINATORS (fsLit "crossMapPA") + , mk gHC_PARR (fsLit "singletonP") nDP_COMBINATORS (fsLit "singletonPA") + , mk gHC_PARR (fsLit "concatP") nDP_COMBINATORS (fsLit "concatPA") + , mk gHC_PARR (fsLit "+:+") nDP_COMBINATORS (fsLit "appPA") + , mk gHC_PARR (fsLit "emptyP") nDP_PARRAY (fsLit "emptyPA") + + , mk nDP_PRELUDE_INT (fsLit "plus") nDP_PRELUDE_INT (fsLit "plusV") + , mk nDP_PRELUDE_INT (fsLit "minus") nDP_PRELUDE_INT (fsLit "minusV") + , mk nDP_PRELUDE_INT (fsLit "mult") nDP_PRELUDE_INT (fsLit "multV") + , mk nDP_PRELUDE_INT (fsLit "intDiv") nDP_PRELUDE_INT (fsLit "intDivV") + , mk nDP_PRELUDE_INT (fsLit "intMod") nDP_PRELUDE_INT (fsLit "intModV") + , mk nDP_PRELUDE_INT (fsLit "intSquareRoot") nDP_PRELUDE_INT (fsLit "intSquareRootV") + , mk nDP_PRELUDE_INT (fsLit "sumP") nDP_PRELUDE_INT (fsLit "sumPA") + , mk nDP_PRELUDE_INT (fsLit "enumFromToP") nDP_PRELUDE_INT (fsLit "enumFromToPA") + , mk nDP_PRELUDE_INT (fsLit "upToP") nDP_PRELUDE_INT (fsLit "upToPA") + + , mk nDP_PRELUDE_INT (fsLit "eq") nDP_PRELUDE_INT (fsLit "eqV") + , mk nDP_PRELUDE_INT (fsLit "neq") nDP_PRELUDE_INT (fsLit "neqV") + , mk nDP_PRELUDE_INT (fsLit "le") nDP_PRELUDE_INT (fsLit "leV") + , mk nDP_PRELUDE_INT (fsLit "lt") nDP_PRELUDE_INT (fsLit "ltV") + , mk nDP_PRELUDE_INT (fsLit "ge") nDP_PRELUDE_INT (fsLit "geV") + , mk nDP_PRELUDE_INT (fsLit "gt") nDP_PRELUDE_INT (fsLit "gtV") + + , mk nDP_PRELUDE_DOUBLE (fsLit "plus") nDP_PRELUDE_DOUBLE (fsLit "plusV") + , mk nDP_PRELUDE_DOUBLE (fsLit "minus") nDP_PRELUDE_DOUBLE (fsLit "minusV") + , mk nDP_PRELUDE_DOUBLE (fsLit "mult") nDP_PRELUDE_DOUBLE (fsLit "multV") + , mk nDP_PRELUDE_DOUBLE (fsLit "divide") nDP_PRELUDE_DOUBLE (fsLit "divideV") + , mk nDP_PRELUDE_DOUBLE (fsLit "squareRoot") nDP_PRELUDE_DOUBLE (fsLit "squareRootV") + , mk nDP_PRELUDE_DOUBLE (fsLit "sumP") nDP_PRELUDE_DOUBLE (fsLit "sumPA") + , mk nDP_PRELUDE_DOUBLE (fsLit "minIndexP") + nDP_PRELUDE_DOUBLE (fsLit "minIndexPA") + , mk nDP_PRELUDE_DOUBLE (fsLit "maxIndexP") + nDP_PRELUDE_DOUBLE (fsLit "maxIndexPA") + + , mk nDP_PRELUDE_DOUBLE (fsLit "eq") nDP_PRELUDE_DOUBLE (fsLit "eqV") + , mk nDP_PRELUDE_DOUBLE (fsLit "neq") nDP_PRELUDE_DOUBLE (fsLit "neqV") + , mk nDP_PRELUDE_DOUBLE (fsLit "le") nDP_PRELUDE_DOUBLE (fsLit "leV") + , mk nDP_PRELUDE_DOUBLE (fsLit "lt") nDP_PRELUDE_DOUBLE (fsLit "ltV") + , mk nDP_PRELUDE_DOUBLE (fsLit "ge") nDP_PRELUDE_DOUBLE (fsLit "geV") + , mk nDP_PRELUDE_DOUBLE (fsLit "gt") nDP_PRELUDE_DOUBLE (fsLit "gtV") + + , mk nDP_PRELUDE_BOOL (fsLit "andP") nDP_PRELUDE_BOOL (fsLit "andPA") + , mk nDP_PRELUDE_BOOL (fsLit "orP") nDP_PRELUDE_BOOL (fsLit "orPA") + + -- FIXME: temporary + , mk nDP_PRELUDE_PARR (fsLit "fromPArrayP") nDP_PRELUDE_PARR (fsLit "fromPArrayPA") + , mk nDP_PRELUDE_PARR (fsLit "toPArrayP") nDP_PRELUDE_PARR (fsLit "toPArrayPA") + , mk nDP_PRELUDE_PARR (fsLit "fromNestedPArrayP") nDP_PRELUDE_PARR (fsLit "fromNestedPArrayPA") + , mk nDP_PRELUDE_PARR (fsLit "combineP") nDP_COMBINATORS (fsLit "combine2PA") + ] + where + mk = (,,,) + +initBuiltinTyCons :: Builtins -> DsM [(Name, TyCon)] +initBuiltinTyCons bi + = do + -- parr <- externalTyCon nDP_PRELUDE_PARR (fsLit "PArr") + return $ (tyConName funTyCon, closureTyCon bi) + : (parrTyConName, parrayTyCon bi) + + -- FIXME: temporary + : (tyConName $ parrayTyCon bi, parrayTyCon bi) + + : [(tyConName tc, tc) | tc <- defaultTyCons] defaultTyCons :: [TyCon] -defaultTyCons = [intTyCon, boolTyCon] +defaultTyCons = [intTyCon, boolTyCon, doubleTyCon] initBuiltinDataCons :: Builtins -> [(Name, DataCon)] -initBuiltinDataCons bi = [(dataConName dc, dc)| dc <- defaultDataCons] +initBuiltinDataCons _ = [(dataConName dc, dc)| dc <- defaultDataCons] defaultDataCons :: [DataCon] -defaultDataCons = [trueDataCon, falseDataCon] +defaultDataCons = [trueDataCon, falseDataCon, unitDataCon] initBuiltinDicts :: [(Name, Module, FastString)] -> DsM [(Name, Var)] initBuiltinDicts ps @@ -206,40 +321,45 @@ initBuiltinDicts ps where (tcs, mods, fss) = unzip3 ps +initBuiltinPAs :: Builtins -> DsM [(Name, Var)] initBuiltinPAs = initBuiltinDicts . builtinPAs builtinPAs :: Builtins -> [(Name, Module, FastString)] builtinPAs bi = [ - mk (tyConName $ closureTyCon bi) nDP_CLOSURE FSLIT("dPA_Clo") - , mk (tyConName $ voidTyCon bi) nDP_REPR FSLIT("dPA_Void") - , mk unitTyConName nDP_INSTANCES FSLIT("dPA_Unit") - - , mk intTyConName nDP_INSTANCES FSLIT("dPA_Int") - , mk boolTyConName nDP_INSTANCES FSLIT("dPA_Bool") + mk (tyConName $ closureTyCon bi) nDP_CLOSURE (fsLit "dPA_Clo") + , mk (tyConName $ voidTyCon bi) nDP_REPR (fsLit "dPA_Void") + , mk (tyConName $ parrayTyCon bi) nDP_INSTANCES (fsLit "dPA_PArray") + , mk unitTyConName nDP_INSTANCES (fsLit "dPA_Unit") + + , mk intTyConName nDP_INSTANCES (fsLit "dPA_Int") + , mk doubleTyConName nDP_INSTANCES (fsLit "dPA_Double") + , mk boolTyConName nDP_INSTANCES (fsLit "dPA_Bool") ] ++ tups where mk name mod fs = (name, mod, fs) - tups = map mk_tup [2..3] + tups = map mk_tup [2..mAX_NDP_PROD] mk_tup n = mk (tyConName $ tupleTyCon Boxed n) nDP_INSTANCES (mkFastString $ "dPA_" ++ show n) +initBuiltinPRs :: Builtins -> DsM [(Name, Var)] initBuiltinPRs = initBuiltinDicts . builtinPRs builtinPRs :: Builtins -> [(Name, Module, FastString)] builtinPRs bi = [ - mk (tyConName unitTyCon) nDP_REPR FSLIT("dPR_Unit") - , mk (tyConName $ voidTyCon bi) nDP_REPR FSLIT("dPR_Void") - , mk (tyConName $ wrapTyCon bi) nDP_REPR FSLIT("dPR_Wrap") - , mk (tyConName $ enumerationTyCon bi) nDP_REPR FSLIT("dPR_Enumeration") - , mk (tyConName $ closureTyCon bi) nDP_CLOSURE FSLIT("dPR_Clo") + mk (tyConName unitTyCon) nDP_REPR (fsLit "dPR_Unit") + , mk (tyConName $ voidTyCon bi) nDP_REPR (fsLit "dPR_Void") + , mk (tyConName $ wrapTyCon bi) nDP_REPR (fsLit "dPR_Wrap") + , mk (tyConName $ enumerationTyCon bi) nDP_REPR (fsLit "dPR_Enumeration") + , mk (tyConName $ closureTyCon bi) nDP_CLOSURE (fsLit "dPR_Clo") -- temporary - , mk intTyConName nDP_INSTANCES FSLIT("dPR_Int") + , mk intTyConName nDP_INSTANCES (fsLit "dPR_Int") + , mk doubleTyConName nDP_INSTANCES (fsLit "dPR_Double") ] ++ map mk_sum [2..mAX_NDP_SUM] @@ -257,7 +377,7 @@ initBuiltinBoxedTyCons :: Builtins -> DsM [(Name, TyCon)] initBuiltinBoxedTyCons = return . builtinBoxedTyCons builtinBoxedTyCons :: Builtins -> [(Name, TyCon)] -builtinBoxedTyCons bi = +builtinBoxedTyCons _ = [(tyConName intPrimTyCon, intTyCon)] externalVar :: Module -> FastString -> DsM Var @@ -268,6 +388,7 @@ externalTyCon :: Module -> FastString -> DsM TyCon externalTyCon mod fs = dsLookupTyCon =<< lookupOrig mod (mkOccNameFS tcName fs) +unitTyConName :: Name unitTyConName = tyConName unitTyCon @@ -275,7 +396,7 @@ 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) + $ dsLookupGlobalId =<< lookupOrig nDP_UNBOXED (mkVarOcc $ method ++ suffix) | otherwise = return Nothing @@ -283,10 +404,12 @@ primPArray :: TyCon -> DsM (Maybe TyCon) primPArray tycon | Just suffix <- lookupNameEnv prim_ty_cons (tyConName tycon) = liftM Just - $ dsLookupTyCon =<< lookupOrig nDP_PRIM (mkOccName tcName $ "PArray" ++ suffix) + $ dsLookupTyCon =<< lookupOrig nDP_UNBOXED (mkOccName tcName $ "PArray" ++ suffix) | otherwise = return Nothing +prim_ty_cons :: NameEnv String prim_ty_cons = mkNameEnv [mk_prim intPrimTyCon] where mk_prim tycon = (tyConName tycon, '_' : getOccString tycon) +