X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2Fvectorise%2FVectMonad.hs;h=c244f0a3a97c34fb6bf133797bf52a488bd9a15b;hb=e1364f66b4e743237e942e0826ed096f5e06de76;hp=eed5a81e5dccb7357a325ad4abb7ff7e5f46a677;hpb=84ca819a2640cfb688acbf53a9e71e5329b4b8ee;p=ghc-hetmet.git diff --git a/compiler/vectorise/VectMonad.hs b/compiler/vectorise/VectMonad.hs index eed5a81..c244f0a 100644 --- a/compiler/vectorise/VectMonad.hs +++ b/compiler/vectorise/VectMonad.hs @@ -3,17 +3,20 @@ module VectMonad ( VM, noV, tryV, maybeV, orElseV, fixV, localV, closedV, initV, - cloneName, newLocalVar, newTyVar, + cloneName, newExportedVar, newLocalVar, newDummyVar, newTyVar, - Builtins(..), paDictTyCon, + Builtins(..), paDictTyCon, paDictDataCon, builtin, GlobalEnv(..), + setInstEnvs, readGEnv, setGEnv, updGEnv, LocalEnv(..), readLEnv, setLEnv, updLEnv, + getBindName, inBind, + lookupVar, defGlobalVar, lookupTyCon, defTyCon, lookupDataCon, defDataCon, @@ -46,6 +49,7 @@ import FamInstEnv import Panic import Outputable import FastString +import SrcLoc ( noSrcSpan ) import Control.Monad ( liftM ) @@ -64,11 +68,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 +90,7 @@ initBuiltins applyClosurePVar <- dsLookupGlobalId applyClosurePName lengthPAVar <- dsLookupGlobalId lengthPAName replicatePAVar <- dsLookupGlobalId replicatePAName + emptyPAVar <- dsLookupGlobalId emptyPAName return $ Builtins { parrayTyCon = parrayTyCon @@ -93,12 +102,13 @@ initBuiltins , applyClosurePVar = applyClosurePVar , lengthPAVar = lengthPAVar , replicatePAVar = replicatePAVar + , emptyPAVar = emptyPAVar } data GlobalEnv = GlobalEnv { -- Mapping from global variables to their vectorised versions. -- - global_vars :: VarEnv CoreExpr + global_vars :: VarEnv Var -- Exported variables which have a vectorised version -- @@ -132,7 +142,7 @@ data LocalEnv = LocalEnv { -- Mapping from local variables to their vectorised and -- lifted versions -- - local_vars :: VarEnv (CoreExpr, CoreExpr) + local_vars :: VarEnv (Var, Var) -- In-scope type variables -- @@ -140,13 +150,16 @@ data LocalEnv = LocalEnv { -- Mapping from tyvars to their PA dictionaries , local_tyvar_pa :: VarEnv CoreExpr + + -- Local binding name + , local_bind_name :: FastString } initGlobalEnv :: VectInfo -> (InstEnv, InstEnv) -> FamInstEnvs -> Builtins -> GlobalEnv initGlobalEnv info instEnvs famInstEnvs bi = GlobalEnv { - global_vars = mapVarEnv (Var . snd) $ vectInfoVar info + global_vars = mapVarEnv snd $ vectInfoVar info , global_exported_vars = emptyVarEnv , global_tycons = extendNameEnv (mapNameEnv snd (vectInfoTyCon info)) (tyConName funTyCon) (closureTyCon bi) @@ -157,10 +170,18 @@ initGlobalEnv info instEnvs famInstEnvs bi , 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 = [] , local_tyvar_pa = emptyVarEnv + , local_bind_name = FSLIT("fn") } -- FIXME @@ -192,6 +213,9 @@ instance Monad VM where noV :: VM a noV = VM $ \_ _ _ -> return No +traceNoV :: String -> SDoc -> VM a +traceNoV s d = pprTrace s d noV + tryV :: VM a -> VM (Maybe a) tryV (VM p) = VM $ \bi genv lenv -> do @@ -203,6 +227,9 @@ tryV (VM p) = VM $ \bi genv lenv -> maybeV :: VM (Maybe a) -> VM a maybeV p = maybe noV return =<< p +traceMaybeV :: String -> SDoc -> VM (Maybe a) -> VM a +traceMaybeV s d p = maybe (traceNoV s d) return =<< p + orElseV :: VM a -> VM a -> VM a orElseV p q = maybe q return =<< tryV p @@ -221,7 +248,7 @@ localV p = do closedV :: VM a -> VM a closedV p = do env <- readLEnv id - setLEnv emptyLocalEnv + setLEnv (emptyLocalEnv { local_bind_name = local_bind_name env }) x <- p setLEnv env return x @@ -256,6 +283,14 @@ getInstEnv = readGEnv global_inst_env getFamInstEnv :: VM FamInstEnvs getFamInstEnv = readGEnv global_fam_inst_env +getBindName :: VM FastString +getBindName = readLEnv local_bind_name + +inBind :: Id -> VM a -> VM a +inBind id p + = do updLEnv $ \env -> env { local_bind_name = occNameFS (getOccName id) } + p + cloneName :: (OccName -> OccName) -> Name -> VM Name cloneName mk_occ name = liftM make (liftDs newUnique) where @@ -266,12 +301,25 @@ 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 u <- liftDs newUnique return $ mkSysLocal fs u ty +newDummyVar :: Type -> VM Var +newDummyVar = newLocalVar FSLIT("ds") + newTyVar :: FastString -> Kind -> VM Var newTyVar fs k = do @@ -280,21 +328,22 @@ newTyVar fs k defGlobalVar :: Var -> Var -> VM () defGlobalVar v v' = updGEnv $ \env -> - env { global_vars = extendVarEnv (global_vars env) v (Var v') + env { global_vars = extendVarEnv (global_vars env) v v' , global_exported_vars = upd (global_exported_vars env) } where upd env | isExportedId v = extendVarEnv env v (v, v') | otherwise = env -lookupVar :: Var -> VM (Scope CoreExpr (CoreExpr, CoreExpr)) +lookupVar :: Var -> VM (Scope Var (Var, Var)) lookupVar v = do r <- readLEnv $ \env -> lookupVarEnv (local_vars env) v case r of Just e -> return (Local e) Nothing -> liftM Global - $ maybeV (readGEnv $ \env -> lookupVarEnv (global_vars env) v) + $ traceMaybeV "lookupVar" (ppr v) + (readGEnv $ \env -> lookupVarEnv (global_vars env) v) lookupTyCon :: TyCon -> VM (Maybe TyCon) lookupTyCon tc @@ -351,7 +400,7 @@ lookupInst cls tys where inst_tys' = [ty | Right ty <- inst_tys] noFlexiVar = all isRight inst_tys - _other -> noV + _other -> traceNoV "lookupInst" (ppr cls <+> ppr tys) } where isRight (Left _) = False