X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2Fvectorise%2FVectMonad.hs;h=944f8c8b3cfa084f035d64686d57bebb425fd451;hb=4e105ef54da56080ce6ec27c8ca61c63171be009;hp=157bea31cf7d0203d0eb71acc98ca28c70c78cb7;hpb=4a396303e52917745b804673cac27128dca351d5;p=ghc-hetmet.git diff --git a/compiler/vectorise/VectMonad.hs b/compiler/vectorise/VectMonad.hs index 157bea3..944f8c8 100644 --- a/compiler/vectorise/VectMonad.hs +++ b/compiler/vectorise/VectMonad.hs @@ -3,12 +3,13 @@ module VectMonad ( VM, noV, tryV, maybeV, orElseV, fixV, localV, closedV, initV, - cloneName, newLocalVar, newTyVar, + cloneName, newExportedVar, newLocalVar, newTyVar, - Builtins(..), paDictTyCon, + Builtins(..), paDictTyCon, paDictDataCon, builtin, GlobalEnv(..), + setInstEnvs, readGEnv, setGEnv, updGEnv, LocalEnv(..), @@ -46,6 +47,7 @@ import FamInstEnv import Panic import Outputable import FastString +import SrcLoc ( noSrcSpan ) import Control.Monad ( liftM ) @@ -64,11 +66,15 @@ data Builtins = Builtins { , applyClosurePVar :: Var , lengthPAVar :: Var , replicatePAVar :: Var + , emptyPAVar :: Var } paDictTyCon :: Builtins -> TyCon paDictTyCon = classTyCon . paClass +paDictDataCon :: Builtins -> DataCon +paDictDataCon = classDataCon . paClass + initBuiltins :: DsM Builtins initBuiltins = do @@ -82,6 +88,7 @@ initBuiltins applyClosurePVar <- dsLookupGlobalId applyClosurePName lengthPAVar <- dsLookupGlobalId lengthPAName replicatePAVar <- dsLookupGlobalId replicatePAName + emptyPAVar <- dsLookupGlobalId emptyPAName return $ Builtins { parrayTyCon = parrayTyCon @@ -93,6 +100,7 @@ initBuiltins , applyClosurePVar = applyClosurePVar , lengthPAVar = lengthPAVar , replicatePAVar = replicatePAVar + , emptyPAVar = emptyPAVar } data GlobalEnv = GlobalEnv { @@ -143,18 +151,27 @@ data LocalEnv = LocalEnv { } -initGlobalEnv :: VectInfo -> (InstEnv, InstEnv) -> FamInstEnvs -> GlobalEnv -initGlobalEnv info instEnvs famInstEnvs +initGlobalEnv :: VectInfo -> (InstEnv, InstEnv) -> FamInstEnvs -> Builtins -> GlobalEnv +initGlobalEnv info instEnvs famInstEnvs bi = GlobalEnv { global_vars = mapVarEnv (Var . snd) $ vectInfoVar info , global_exported_vars = emptyVarEnv - , global_tycons = mapNameEnv snd $ vectInfoTyCon info + , global_tycons = extendNameEnv (mapNameEnv snd (vectInfoTyCon info)) + (tyConName funTyCon) (closureTyCon bi) + , global_datacons = mapNameEnv snd $ vectInfoDataCon info , global_inst_env = instEnvs , global_fam_inst_env = famInstEnvs , global_bindings = [] } +setInstEnvs :: InstEnv -> FamInstEnv -> GlobalEnv -> GlobalEnv +setInstEnvs l_inst l_fam_inst genv + | (g_inst, _) <- global_inst_env genv + , (g_fam_inst, _) <- global_fam_inst_env genv + = genv { global_inst_env = (g_inst, l_inst) + , global_fam_inst_env = (g_fam_inst, l_fam_inst) } + emptyLocalEnv = LocalEnv { local_vars = emptyVarEnv , local_tyvars = [] @@ -264,6 +281,16 @@ cloneName mk_occ name = liftM make (liftDs newUnique) (nameSrcSpan name) | otherwise = mkSystemName u occ_name +newExportedVar :: OccName -> Type -> VM Var +newExportedVar occ_name ty + = do + mod <- liftDs getModuleDs + u <- liftDs newUnique + + let name = mkExternalName u mod occ_name noSrcSpan + + return $ Id.mkExportedLocalId name ty + newLocalVar :: FastString -> Type -> VM Var newLocalVar fs ty = do @@ -295,7 +322,10 @@ lookupVar v $ maybeV (readGEnv $ \env -> lookupVarEnv (global_vars env) v) lookupTyCon :: TyCon -> VM (Maybe TyCon) -lookupTyCon tc = readGEnv $ \env -> lookupNameEnv (global_tycons env) (tyConName tc) +lookupTyCon tc + | isUnLiftedTyCon tc || isTupleTyCon tc = return (Just tc) + + | otherwise = readGEnv $ \env -> lookupNameEnv (global_tycons env) (tyConName tc) defTyCon :: TyCon -> TyCon -> VM () defTyCon tc tc' = updGEnv $ \env -> @@ -396,7 +426,7 @@ initV hsc_env guts info p go instEnvs famInstEnvs = do builtins <- initBuiltins - r <- runVM p builtins (initGlobalEnv info instEnvs famInstEnvs) + r <- runVM p builtins (initGlobalEnv info instEnvs famInstEnvs builtins) emptyLocalEnv case r of Yes genv _ x -> return $ Just (new_info genv, x)