X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2Fvectorise%2FVectUtils.hs;h=46766ea8d13062a2b1fa259cc2780904398eb45b;hb=27802c599d26c3358cb9870b6861cd32209bbe58;hp=0727c947ce67527cd041f1d423c458d0b0145dc9;hpb=8bae351221fbd5eabe562641499c14d379816875;p=ghc-hetmet.git diff --git a/compiler/vectorise/VectUtils.hs b/compiler/vectorise/VectUtils.hs index 0727c94..46766ea 100644 --- a/compiler/vectorise/VectUtils.hs +++ b/compiler/vectorise/VectUtils.hs @@ -1,13 +1,14 @@ module VectUtils ( collectAnnTypeBinders, collectAnnTypeArgs, isAnnTypeArg, collectAnnValBinders, + mkDataConTag, splitClosureTy, mkPADictType, mkPArrayType, - paDictArgType, paDictOfType, + parrayReprTyCon, parrayReprDataCon, mkVScrut, + paDictArgType, paDictOfType, paDFunType, paMethod, lengthPA, replicatePA, emptyPA, liftPA, polyAbstract, polyApply, polyVApply, - lookupPArrayFamInst, - hoistExpr, hoistPolyVExpr, takeHoisted, + hoistBinding, hoistExpr, hoistPolyVExpr, takeHoisted, buildClosure, buildClosures, mkClosureApp ) where @@ -23,7 +24,7 @@ import CoreUtils import Type import TypeRep import TyCon -import DataCon ( dataConWrapId ) +import DataCon ( DataCon, dataConWrapId, dataConTag ) import Var import Id ( mkWildId ) import MkId ( unwrapFamInstScrut ) @@ -58,6 +59,9 @@ isAnnTypeArg :: AnnExpr b ann -> Bool isAnnTypeArg (_, AnnType t) = True isAnnTypeArg _ = False +mkDataConTag :: DataCon -> CoreExpr +mkDataConTag dc = mkConApp intDataCon [mkIntLitInt $ dataConTag dc] + isClosureTyCon :: TyCon -> Bool isClosureTyCon tc = tyConName tc == closureTyConName @@ -97,7 +101,7 @@ mkClosureTypes arg_tys res_ty mkPADictType :: Type -> VM Type mkPADictType ty = do - tc <- builtin paDictTyCon + tc <- builtin paTyCon return $ TyConApp tc [ty] mkPArrayType :: Type -> VM Type @@ -106,6 +110,22 @@ mkPArrayType ty tc <- builtin parrayTyCon return $ TyConApp tc [ty] +parrayReprTyCon :: Type -> VM (TyCon, [Type]) +parrayReprTyCon ty = builtin parrayTyCon >>= (`lookupFamInst` [ty]) + +parrayReprDataCon :: Type -> VM (DataCon, [Type]) +parrayReprDataCon ty + = do + (tc, arg_tys) <- parrayReprTyCon ty + let [dc] = tyConDataCons tc + return (dc, arg_tys) + +mkVScrut :: VExpr -> VM (VExpr, TyCon, [Type]) +mkVScrut (ve, le) + = do + (tc, arg_tys) <- parrayReprTyCon (exprType ve) + return ((ve, unwrapFamInstScrut tc arg_tys le), tc, arg_tys) + paDictArgType :: TyVar -> VM (Maybe Type) paDictArgType tv = go (TyVarTy tv) (tyVarKind tv) where @@ -140,11 +160,21 @@ paDictOfTyApp (TyVarTy tv) ty_args paDFunApply dfun ty_args paDictOfTyApp (TyConApp tc _) ty_args = do - pa_class <- builtin paClass - (dfun, ty_args') <- lookupInst pa_class [TyConApp tc ty_args] - paDFunApply (Var dfun) ty_args' + dfun <- traceMaybeV "paDictOfTyApp" (ppr tc) (lookupTyConPA tc) + paDFunApply (Var dfun) ty_args paDictOfTyApp ty ty_args = pprPanic "paDictOfTyApp" (ppr ty) +paDFunType :: TyCon -> VM Type +paDFunType tc + = do + margs <- mapM paDictArgType tvs + res <- mkPADictType (mkTyConApp tc arg_tys) + return . mkForAllTys tvs + $ mkFunTys [arg | Just arg <- margs] res + where + tvs = tyConTyVars tc + arg_tys = mkTyVarTys tvs + paDFunApply :: CoreExpr -> [Type] -> VM CoreExpr paDFunApply dfun tys = do @@ -212,15 +242,15 @@ polyVApply expr tys dicts <- mapM paDictOfType tys return $ mapVect (\e -> e `mkTyApps` tys `mkApps` dicts) expr -lookupPArrayFamInst :: Type -> VM (TyCon, [Type]) -lookupPArrayFamInst ty = builtin parrayTyCon >>= (`lookupFamInst` [ty]) +hoistBinding :: Var -> CoreExpr -> VM () +hoistBinding v e = updGEnv $ \env -> + env { global_bindings = (v,e) : global_bindings env } hoistExpr :: FastString -> CoreExpr -> VM Var hoistExpr fs expr = do var <- newLocalVar fs (exprType expr) - updGEnv $ \env -> - env { global_bindings = (var, expr) : global_bindings env } + hoistBinding var expr return var hoistVExpr :: VExpr -> VM VVar @@ -337,7 +367,7 @@ mkLiftEnv lc [ty] [v] -- NOTE: this transparently deals with empty environments mkLiftEnv lc tys vs = do - (env_tc, env_tyargs) <- lookupPArrayFamInst vty + (env_tc, env_tyargs) <- parrayReprTyCon vty let [env_con] = tyConDataCons env_tc env = Var (dataConWrapId env_con)