X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2Fvectorise%2FVectMonad.hs;h=b31d798c3e8517aba127f8eb0660ffe63be0627b;hb=c099327dd5765dfefccb01302ef8ea8369728cbf;hp=86b1cb7e82e52d24013badfeb58351d4e72b9e44;hpb=ce39c447ab47ac1616cea079210c7651f486f425;p=ghc-hetmet.git diff --git a/compiler/vectorise/VectMonad.hs b/compiler/vectorise/VectMonad.hs index 86b1cb7..b31d798 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, @@ -39,6 +40,7 @@ import Id import OccName import Name import NameEnv +import TysPrim ( intPrimTy ) import DsMonad import PrelNames @@ -69,6 +71,7 @@ data Builtins = Builtins { , lengthPAVar :: Var , replicatePAVar :: Var , emptyPAVar :: Var + , liftingContext :: Var } paDictTyCon :: Builtins -> TyCon @@ -92,6 +95,9 @@ initBuiltins replicatePAVar <- dsLookupGlobalId replicatePAName emptyPAVar <- dsLookupGlobalId emptyPAName + liftingContext <- liftM (\u -> mkSysLocal FSLIT("lc") u intPrimTy) + newUnique + return $ Builtins { parrayTyCon = parrayTyCon , paClass = paClass @@ -103,6 +109,7 @@ initBuiltins , lengthPAVar = lengthPAVar , replicatePAVar = replicatePAVar , emptyPAVar = emptyPAVar + , liftingContext = liftingContext } data GlobalEnv = GlobalEnv { @@ -124,6 +131,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 -- @@ -165,6 +176,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 = [] @@ -191,6 +203,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)) @@ -213,6 +226,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 @@ -224,6 +240,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 @@ -295,6 +314,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 @@ -336,7 +363,8 @@ lookupVar 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 @@ -393,7 +421,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