X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2Fvectorise%2FVectorise.hs;h=06fc5422127ba890967692f2898b6996064a0eef;hb=8e71d5082f618e97db1c82dede313367c386891b;hp=e3f80081761e8dbb767561137ecd9ed1972ccaf9;hpb=8bae351221fbd5eabe562641499c14d379816875;p=ghc-hetmet.git diff --git a/compiler/vectorise/Vectorise.hs b/compiler/vectorise/Vectorise.hs index e3f8008..06fc542 100644 --- a/compiler/vectorise/Vectorise.hs +++ b/compiler/vectorise/Vectorise.hs @@ -25,11 +25,13 @@ import InstEnv ( extendInstEnvList ) import Var import VarEnv import VarSet -import Name ( mkSysTvName, getName ) +import Name ( Name, mkSysTvName, getName ) import NameEnv import Id import MkId ( unwrapFamInstScrut ) import OccName +import RdrName ( RdrName, mkRdrQual ) +import Module ( mkModuleNameFS ) import DsMonad hiding (mapAndUnzipM) import DsUtils ( mkCoreTup, mkCoreTupTy ) @@ -44,6 +46,24 @@ import Outputable import FastString import Control.Monad ( liftM, liftM2, zipWithM, mapAndUnzipM ) +mkNDPVar :: String -> RdrName +mkNDPVar s = mkRdrQual nDP_BUILTIN (mkVarOcc s) + +mkNDPVarFS :: FastString -> RdrName +mkNDPVarFS fs = mkRdrQual nDP_BUILTIN (mkVarOccFS fs) + +builtin_PAs :: [(Name, RdrName)] +builtin_PAs = [ + mk closureTyConName FSLIT("dPA_Clo") + , mk intTyConName FSLIT("dPA_Int") + ] + ++ tups + where + mk name fs = (name, mkNDPVarFS fs) + + tups = mk_tup 0 : map mk_tup [2..3] + mk_tup n = (getName $ tupleTyCon Boxed n, mkNDPVar $ "dPA_" ++ show n) + vectorise :: HscEnv -> UniqSupply -> RuleBase -> ModGuts -> IO (SimplCount, ModGuts) vectorise hsc_env _ _ guts @@ -60,20 +80,18 @@ vectorise hsc_env _ _ guts vectModule :: ModGuts -> VM ModGuts vectModule guts = do - (types', fam_insts, pa_insts) <- vectTypeEnv (mg_types guts) + defTyConRdrPAs builtin_PAs + (types', fam_insts, tc_binds) <- vectTypeEnv (mg_types guts) - let insts = map painstInstance pa_insts - fam_inst_env' = extendFamInstEnvList (mg_fam_inst_env guts) fam_insts - inst_env' = extendInstEnvList (mg_inst_env guts) insts - updGEnv (setInstEnvs inst_env' fam_inst_env') + let fam_inst_env' = extendFamInstEnvList (mg_fam_inst_env guts) fam_insts + updGEnv (setFamInstEnv fam_inst_env') - dicts <- mapM buildPADict pa_insts - binds' <- mapM vectTopBind (mg_binds guts) + -- dicts <- mapM buildPADict pa_insts + -- workers <- mapM vectDataConWorkers pa_insts + binds' <- mapM vectTopBind (mg_binds guts) return $ guts { mg_types = types' - , mg_binds = Rec (concat dicts) : binds' - , mg_inst_env = inst_env' + , mg_binds = Rec tc_binds : binds' , mg_fam_inst_env = fam_inst_env' - , mg_insts = mg_insts guts ++ insts , mg_fam_insts = mg_fam_insts guts ++ fam_insts } @@ -101,10 +119,8 @@ vectTopBind b@(Rec bs) vectTopBinder :: Var -> VM Var vectTopBinder var = do - vty <- vectType (idType var) - name <- cloneName mkVectOcc (getName var) - let var' | isExportedId var = Id.mkExportedLocalId name vty - | otherwise = Id.mkLocalId name vty + vty <- vectType (idType var) + var' <- cloneId mkVectOcc var vty defGlobalVar var var' return var'