X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2Fvectorise%2FVectMonad.hs;h=571350dc3ea5b3196e2b8995630ec15fc9635d5b;hb=17f2929d489cb59ce009377e7379ca230d3411b0;hp=a991b8c4f902567eb1aaa856905f51a7b0eee2ac;hpb=8bae351221fbd5eabe562641499c14d379816875;p=ghc-hetmet.git diff --git a/compiler/vectorise/VectMonad.hs b/compiler/vectorise/VectMonad.hs index a991b8c..571350d 100644 --- a/compiler/vectorise/VectMonad.hs +++ b/compiler/vectorise/VectMonad.hs @@ -3,7 +3,8 @@ module VectMonad ( VM, noV, tryV, maybeV, orElseV, fixV, localV, closedV, initV, - cloneName, newExportedVar, newLocalVar, newDummyVar, newTyVar, + cloneName, cloneId, + newExportedVar, newLocalVar, newDummyVar, newTyVar, Builtins(..), paDictTyCon, paDictDataCon, builtin, @@ -20,6 +21,7 @@ module VectMonad ( lookupVar, defGlobalVar, lookupTyCon, defTyCon, lookupDataCon, defDataCon, + lookupTyConPA, defTyConPA, lookupTyVarPA, defLocalTyVar, defLocalTyVarWithPA, localTyVars, lookupInst, lookupFamInst @@ -130,6 +132,10 @@ data GlobalEnv = GlobalEnv { -- , global_datacons :: NameEnv DataCon + -- Mapping from TyCons to their PA dfuns + -- + , global_pa_funs :: NameEnv Var + -- External package inst-env & home-package inst-env for class -- instances -- @@ -171,6 +177,7 @@ initGlobalEnv info instEnvs famInstEnvs bi (tyConName funTyCon) (closureTyCon bi) , global_datacons = mapNameEnv snd $ vectInfoDataCon info + , global_pa_funs = mapNameEnv snd $ vectInfoPADFun info , global_inst_env = instEnvs , global_fam_inst_env = famInstEnvs , global_bindings = [] @@ -197,6 +204,7 @@ updVectInfo env tyenv info vectInfoVar = global_exported_vars env , vectInfoTyCon = mk_env typeEnvTyCons global_tycons , vectInfoDataCon = mk_env typeEnvDataCons global_datacons + , vectInfoPADFun = mk_env typeEnvTyCons global_pa_funs } where mk_env from_tyenv from_env = mkNameEnv [(name, (from,to)) @@ -307,6 +315,14 @@ cloneName mk_occ name = liftM make (liftDs newUnique) (nameSrcSpan name) | otherwise = mkSystemName u occ_name +cloneId :: (OccName -> OccName) -> Id -> Type -> VM Id +cloneId mk_occ id ty + = do + name <- cloneName mk_occ (getName id) + let id' | isExportedId id = Id.mkExportedLocalId name ty + | otherwise = Id.mkLocalId name ty + return id' + newExportedVar :: OccName -> Type -> VM Var newExportedVar occ_name ty = do @@ -368,6 +384,13 @@ defDataCon :: DataCon -> DataCon -> VM () defDataCon dc dc' = updGEnv $ \env -> env { global_datacons = extendNameEnv (global_datacons env) (dataConName dc) dc' } +lookupTyConPA :: TyCon -> VM (Maybe Var) +lookupTyConPA tc = readGEnv $ \env -> lookupNameEnv (global_pa_funs env) (tyConName tc) + +defTyConPA :: TyCon -> Var -> VM () +defTyConPA tc pa = updGEnv $ \env -> + env { global_pa_funs = extendNameEnv (global_pa_funs env) (tyConName tc) pa } + lookupTyVarPA :: Var -> VM (Maybe CoreExpr) lookupTyVarPA tv = readLEnv $ \env -> lookupVarEnv (local_tyvar_pa env) tv