X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2Fvectorise%2FVectUtils.hs;h=46766ea8d13062a2b1fa259cc2780904398eb45b;hb=f363bf9a76bcaddc1bfea61135f4f4d2fbcfd955;hp=27dd330036caafe6faff84e37ad6d616b137f562;hpb=fe5405d4b97a521e32899f6dc2153c556723ca62;p=ghc-hetmet.git diff --git a/compiler/vectorise/VectUtils.hs b/compiler/vectorise/VectUtils.hs index 27dd330..46766ea 100644 --- a/compiler/vectorise/VectUtils.hs +++ b/compiler/vectorise/VectUtils.hs @@ -1,12 +1,13 @@ module VectUtils ( collectAnnTypeBinders, collectAnnTypeArgs, isAnnTypeArg, collectAnnValBinders, + mkDataConTag, splitClosureTy, mkPADictType, mkPArrayType, + parrayReprTyCon, parrayReprDataCon, mkVScrut, paDictArgType, paDictOfType, paDFunType, paMethod, lengthPA, replicatePA, emptyPA, liftPA, polyAbstract, polyApply, polyVApply, - lookupPArrayFamInst, hoistBinding, hoistExpr, hoistPolyVExpr, takeHoisted, buildClosure, buildClosures, mkClosureApp @@ -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 @@ -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,7 +160,7 @@ paDictOfTyApp (TyVarTy tv) ty_args paDFunApply dfun ty_args paDictOfTyApp (TyConApp tc _) ty_args = do - dfun <- maybeV (lookupTyConPA tc) + dfun <- traceMaybeV "paDictOfTyApp" (ppr tc) (lookupTyConPA tc) paDFunApply (Var dfun) ty_args paDictOfTyApp ty ty_args = pprPanic "paDictOfTyApp" (ppr ty) @@ -222,9 +242,6 @@ 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 } @@ -350,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)