import Id ( mkWildId )
import Name ( Name, getOccName )
import NameEnv
-import TysWiredIn ( unitTy, intTy, intDataCon )
+import TysWiredIn ( unitTy, unitTyCon, intTy, intDataCon, unitDataConId )
import TysPrim ( intPrimTy )
import Unique
import Outputable
-import Control.Monad ( liftM, liftM2, zipWithM, zipWithM_ )
+import Control.Monad ( liftM, liftM2, zipWithM, zipWithM_, mapAndUnzipM )
import Data.List ( inits, tails, zipWith4, zipWith5 )
-- ----------------------------------------------------------------------------
where
tyvars = tyConTyVars vect_tc
+
+data Repr = ProdRepr {
+ prod_components :: [Type]
+ , prod_tycon :: TyCon
+ , prod_data_con :: DataCon
+ , prod_arr_tycon :: TyCon
+ , prod_arr_data_con :: DataCon
+ }
+
+ | SumRepr {
+ sum_components :: [Repr]
+ , sum_tycon :: TyCon
+ , sum_arr_tycon :: TyCon
+ , sum_arr_data_con :: DataCon
+ }
+
+mkProduct :: [Type] -> VM Repr
+mkProduct tys
+ = do
+ tycon <- builtin (prodTyCon arity)
+ let [data_con] = tyConDataCons tycon
+
+ (arr_tycon, _) <- parrayReprTyCon $ mkTyConApp tycon tys
+ let [arr_data_con] = tyConDataCons arr_tycon
+
+ return $ ProdRepr {
+ prod_components = tys
+ , prod_tycon = tycon
+ , prod_data_con = data_con
+ , prod_arr_tycon = arr_tycon
+ , prod_arr_data_con = arr_data_con
+ }
+ where
+ arity = length tys
+
+mkSum :: [Repr] -> VM Repr
+mkSum [repr] = return repr
+mkSum reprs
+ = do
+ tycon <- builtin (sumTyCon arity)
+ (arr_tycon, _) <- parrayReprTyCon
+ . mkTyConApp tycon
+ $ map reprType reprs
+
+ let [arr_data_con] = tyConDataCons arr_tycon
+
+ return $ SumRepr {
+ sum_components = reprs
+ , sum_tycon = tycon
+ , sum_arr_tycon = arr_tycon
+ , sum_arr_data_con = arr_data_con
+ }
+ where
+ arity = length reprs
+
+reprProducts :: Repr -> [Repr]
+reprProducts (SumRepr { sum_components = rs }) = rs
+reprProducts repr = [repr]
+
+reprType :: Repr -> Type
+reprType (ProdRepr { prod_tycon = tycon, prod_components = tys })
+ = mkTyConApp tycon tys
+reprType (SumRepr { sum_tycon = tycon, sum_components = reprs })
+ = mkTyConApp tycon (map reprType reprs)
+
+arrReprType :: Repr -> VM Type
+arrReprType = mkPArrayType . reprType
+
+reprTys :: Repr -> [[Type]]
+reprTys (SumRepr { sum_components = prods }) = map prodTys prods
+reprTys prod = [prodTys prod]
+
+prodTys (ProdRepr { prod_components = tys }) = tys
+
+reprVars :: Repr -> VM [[Var]]
+reprVars = mapM (mapM (newLocalVar FSLIT("r"))) . reprTys
+
+arrShapeTys :: Repr -> VM [Type]
+arrShapeTys (SumRepr {})
+ = do
+ uarr <- builtin uarrTyCon
+ return [intPrimTy, mkTyConApp uarr [intTy]]
+arrShapeTys repr = return [intPrimTy]
+
+arrShapeVars :: Repr -> VM [Var]
+arrShapeVars repr = mapM (newLocalVar FSLIT("sh")) =<< arrShapeTys repr
+
+arrReprTys :: Repr -> VM [[Type]]
+arrReprTys (SumRepr { sum_components = prods })
+ = mapM arrProdTys prods
+arrReprTys prod
+ = do
+ tys <- arrProdTys prod
+ return [tys]
+
+arrProdTys (ProdRepr { prod_components = tys })
+ = mapM mkPArrayType (mk_types tys)
+ where
+ mk_types [] = [unitTy]
+ mk_types tys = tys
+
+arrReprVars :: Repr -> VM [[Var]]
+arrReprVars repr
+ = mapM (mapM (newLocalVar FSLIT("rs"))) =<< arrReprTys repr
+
+mkRepr :: TyCon -> VM Repr
+mkRepr vect_tc
+ = mkSum
+ =<< mapM mkProduct (map dataConRepArgTys $ tyConDataCons vect_tc)
+
buildPReprType :: TyCon -> VM Type
-buildPReprType = mkPRepr . map dataConRepArgTys . tyConDataCons
+buildPReprType = liftM reprType . mkRepr
-buildToPRepr :: Shape -> TyCon -> TyCon -> TyCon -> VM CoreExpr
-buildToPRepr _ vect_tc prepr_tc _
+buildToPRepr :: Repr -> TyCon -> TyCon -> TyCon -> VM CoreExpr
+buildToPRepr repr vect_tc prepr_tc _
= do
- arg <- newLocalVar FSLIT("x") arg_ty
- bndrss <- mapM (mapM (newLocalVar FSLIT("x"))) rep_tys
- (alt_bodies, res_ty) <- mkToPRepr $ map (map Var) bndrss
+ arg <- newLocalVar FSLIT("x") arg_ty
+ result <- to_repr repr (Var arg)
return . Lam arg
. wrapFamInstBody prepr_tc var_tys
- . Case (Var arg) (mkWildId arg_ty) res_ty
- $ zipWith3 mk_alt data_cons bndrss alt_bodies
+ $ result
+ where
+ var_tys = mkTyVarTys $ tyConTyVars vect_tc
+ arg_ty = mkTyConApp vect_tc var_tys
+ res_ty = reprType repr
+
+ cons = tyConDataCons vect_tc
+ [con] = cons
+
+ to_repr (SumRepr { sum_components = prods
+ , sum_tycon = tycon })
+ expr
+ = do
+ (vars, bodies) <- mapAndUnzipM prod_alt prods
+ return . Case expr (mkWildId (exprType expr)) res_ty
+ $ zipWith4 mk_alt cons vars (tyConDataCons tycon) bodies
+ where
+ mk_alt con vars sum_con body
+ = (DataAlt con, vars, mkConApp sum_con (ty_args ++ [body]))
+
+ ty_args = map (Type . reprType) prods
+
+ to_repr prod expr
+ = do
+ (vars, body) <- prod_alt prod
+ return $ Case expr (mkWildId (exprType expr)) res_ty
+ [(DataAlt con, vars, body)]
+
+ prod_alt (ProdRepr { prod_components = tys
+ , prod_data_con = data_con })
+ = do
+ vars <- mapM (newLocalVar FSLIT("r")) tys
+ return (vars, mkConApp data_con (map Type tys ++ map Var vars))
+
+buildFromPRepr :: Repr -> TyCon -> TyCon -> TyCon -> VM CoreExpr
+buildFromPRepr repr vect_tc prepr_tc _
+ = do
+ arg_ty <- mkPReprType res_ty
+ arg <- newLocalVar FSLIT("x") arg_ty
+
+ liftM (Lam arg)
+ . from_repr repr
+ $ unwrapFamInstScrut prepr_tc var_tys (Var arg)
where
- var_tys = mkTyVarTys $ tyConTyVars vect_tc
- arg_ty = mkTyConApp vect_tc var_tys
- data_cons = tyConDataCons vect_tc
- rep_tys = map dataConRepArgTys data_cons
+ var_tys = mkTyVarTys $ tyConTyVars vect_tc
+ res_ty = mkTyConApp vect_tc var_tys
- mk_alt data_con bndrs body = (DataAlt data_con, bndrs, body)
+ cons = map (`mkConApp` map Type var_tys) (tyConDataCons vect_tc)
+ [con] = cons
-buildToArrPRepr :: Shape -> TyCon -> TyCon -> TyCon -> VM CoreExpr
-buildToArrPRepr _ vect_tc prepr_tc arr_tc
+ from_repr repr@(SumRepr { sum_components = prods
+ , sum_tycon = tycon })
+ expr
+ = do
+ vars <- mapM (newLocalVar FSLIT("x")) (map reprType prods)
+ bodies <- sequence . zipWith3 from_prod prods cons
+ $ map Var vars
+ return . Case expr (mkWildId (reprType repr)) res_ty
+ $ zipWith3 sum_alt (tyConDataCons tycon) vars bodies
+ where
+ sum_alt data_con var body = (DataAlt data_con, [var], body)
+
+ from_repr repr expr = from_prod repr con expr
+
+ from_prod prod@(ProdRepr { prod_components = tys
+ , prod_data_con = data_con })
+ con
+ expr
+ = do
+ vars <- mapM (newLocalVar FSLIT("y")) tys
+ return $ Case expr (mkWildId (reprType prod)) res_ty
+ [(DataAlt data_con, vars, con `mkVarApps` vars)]
+
+buildToArrPRepr :: Repr -> TyCon -> TyCon -> TyCon -> VM CoreExpr
+buildToArrPRepr repr vect_tc prepr_tc arr_tc
= do
- arg_ty <- mkPArrayType el_ty
- rep_tys <- mapM (mapM mkPArrayType) rep_el_tys
+ arg_ty <- mkPArrayType el_ty
+ arg <- newLocalVar FSLIT("xs") arg_ty
- arg <- newLocalVar FSLIT("xs") arg_ty
- bndrss <- mapM (mapM (newLocalVar FSLIT("ys"))) rep_tys
- len <- newLocalVar FSLIT("len") intPrimTy
- sel <- newLocalVar FSLIT("sel") =<< mkPArrayType intTy
+ res_ty <- mkPArrayType (reprType repr)
- let add_sel xs | has_selector = sel : xs
- | otherwise = xs
+ shape_vars <- arrShapeVars repr
+ repr_vars <- arrReprVars repr
- all_bndrs = len : add_sel (concat bndrss)
+ parray_co <- mkBuiltinCo parrayTyCon
- res <- parrayCoerce prepr_tc var_tys
- =<< mkToArrPRepr (Var len) (Var sel) (map (map Var) bndrss)
- res_ty <- mkPArrayType =<< mkPReprType el_ty
+ let Just repr_co = tyConFamilyCoercion_maybe prepr_tc
+ co = mkAppCoercion parray_co
+ . mkSymCoercion
+ $ mkTyConApp repr_co var_tys
+
+ scrut = unwrapFamInstScrut arr_tc var_tys (Var arg)
+
+ result <- to_repr shape_vars repr_vars repr
return . Lam arg
- $ Case (unwrapFamInstScrut arr_tc var_tys (Var arg))
- (mkWildId (mkTyConApp arr_tc var_tys))
- res_ty
- [(DataAlt arr_dc, all_bndrs, res)]
+ . mkCoerce co
+ $ Case scrut (mkWildId (mkTyConApp arr_tc var_tys)) res_ty
+ [(DataAlt arr_dc, shape_vars ++ concat repr_vars, result)]
where
- var_tys = mkTyVarTys $ tyConTyVars vect_tc
- el_ty = mkTyConApp vect_tc var_tys
- data_cons = tyConDataCons vect_tc
- rep_el_tys = map dataConRepArgTys data_cons
+ var_tys = mkTyVarTys $ tyConTyVars vect_tc
+ el_ty = mkTyConApp vect_tc var_tys
- [arr_dc] = tyConDataCons arr_tc
+ [arr_dc] = tyConDataCons arr_tc
+
+ to_repr shape_vars@(len_var : _)
+ repr_vars
+ (SumRepr { sum_components = prods
+ , sum_arr_tycon = tycon
+ , sum_arr_data_con = data_con })
+ = do
+ exprs <- zipWithM (to_prod len_var) repr_vars prods
- has_selector | [_] <- data_cons = False
- | otherwise = True
+ return . wrapFamInstBody tycon tys
+ . mkConApp data_con
+ $ map Type tys ++ map Var shape_vars ++ exprs
+ where
+ tys = map reprType prods
+ to_repr [len_var] [repr_vars] prod = to_prod len_var repr_vars prod
-buildFromPRepr :: Shape -> TyCon -> TyCon -> TyCon -> VM CoreExpr
-buildFromPRepr _ vect_tc prepr_tc _
+ to_prod len_var
+ repr_vars
+ (ProdRepr { prod_components = tys
+ , prod_arr_tycon = tycon
+ , prod_arr_data_con = data_con })
+ = return . wrapFamInstBody tycon tys
+ . mkConApp data_con
+ $ map Type tys ++ map Var (len_var : repr_vars)
+
+buildFromArrPRepr :: Repr -> TyCon -> TyCon -> TyCon -> VM CoreExpr
+buildFromArrPRepr repr vect_tc prepr_tc arr_tc
= do
- arg_ty <- mkPReprType res_ty
- arg <- newLocalVar FSLIT("x") arg_ty
- alts <- mapM mk_alt data_cons
- body <- mkFromPRepr (unwrapFamInstScrut prepr_tc var_tys (Var arg))
- res_ty alts
- return $ Lam arg body
+ arg_ty <- mkPArrayType =<< mkPReprType el_ty
+ arg <- newLocalVar FSLIT("xs") arg_ty
+
+ res_ty <- mkPArrayType el_ty
+
+ shape_vars <- arrShapeVars repr
+ repr_vars <- arrReprVars repr
+
+ parray_co <- mkBuiltinCo parrayTyCon
+
+ let Just repr_co = tyConFamilyCoercion_maybe prepr_tc
+ co = mkAppCoercion parray_co
+ $ mkTyConApp repr_co var_tys
+
+ scrut = mkCoerce co (Var arg)
+
+ result = wrapFamInstBody arr_tc var_tys
+ . mkConApp arr_dc
+ $ map Type var_tys ++ map Var (shape_vars ++ concat repr_vars)
+
+ liftM (Lam arg)
+ (from_repr repr scrut shape_vars repr_vars res_ty result)
where
- var_tys = mkTyVarTys $ tyConTyVars vect_tc
- res_ty = mkTyConApp vect_tc var_tys
- data_cons = tyConDataCons vect_tc
-
- mk_alt dc = do
- bndrs <- mapM (newLocalVar FSLIT("x")) $ dataConRepArgTys dc
- return (bndrs, mkConApp dc (map Type var_tys ++ map Var bndrs))
-
-buildFromArrPRepr :: Shape -> TyCon -> TyCon -> TyCon -> VM CoreExpr
-buildFromArrPRepr _ vect_tc prepr_tc arr_tc
- = mkFromArrPRepr undefined undefined undefined undefined undefined undefined
-
-buildPRDict :: Shape -> TyCon -> TyCon -> TyCon -> VM CoreExpr
-buildPRDict _ vect_tc prepr_tc _
- = prCoerce prepr_tc var_tys
- =<< prDictOfType (mkTyConApp prepr_tc var_tys)
+ var_tys = mkTyVarTys $ tyConTyVars vect_tc
+ el_ty = mkTyConApp vect_tc var_tys
+
+ [arr_dc] = tyConDataCons arr_tc
+
+ from_repr (SumRepr { sum_components = prods
+ , sum_arr_tycon = tycon
+ , sum_arr_data_con = data_con })
+ expr
+ shape_vars
+ repr_vars
+ res_ty
+ body
+ = do
+ vars <- mapM (newLocalVar FSLIT("xs")) =<< mapM arrReprType prods
+ result <- go prods repr_vars vars body
+
+ let scrut = unwrapFamInstScrut tycon ty_args expr
+ return . Case scrut (mkWildId scrut_ty) res_ty
+ $ [(DataAlt data_con, shape_vars ++ vars, result)]
+ where
+ ty_args = map reprType prods
+ scrut_ty = mkTyConApp tycon ty_args
+
+ go [] [] [] body = return body
+ go (prod : prods) (repr_vars : rss) (var : vars) body
+ = do
+ shape_vars <- mapM (newLocalVar FSLIT("s")) =<< arrShapeTys prod
+
+ from_prod prod (Var var) shape_vars repr_vars res_ty
+ =<< go prods rss vars body
+
+ from_repr repr expr shape_vars [repr_vars] res_ty body
+ = from_prod repr expr shape_vars repr_vars res_ty body
+
+ from_prod prod@(ProdRepr { prod_components = tys
+ , prod_arr_tycon = tycon
+ , prod_arr_data_con = data_con })
+ expr
+ shape_vars
+ repr_vars
+ res_ty
+ body
+ = do
+ let scrut = unwrapFamInstScrut tycon tys expr
+ scrut_ty = mkTyConApp tycon tys
+ ty <- arrReprType prod
+
+ return $ Case scrut (mkWildId scrut_ty) res_ty
+ [(DataAlt data_con, shape_vars ++ repr_vars, body)]
+
+buildPRDictRepr :: Repr -> VM CoreExpr
+buildPRDictRepr (ProdRepr {
+ prod_components = tys
+ , prod_tycon = tycon
+ })
+ = do
+ prs <- mapM mkPR tys
+ dfun <- prDFunOfTyCon tycon
+ return $ dfun `mkTyApps` tys `mkApps` prs
+
+buildPRDictRepr (SumRepr {
+ sum_components = prods
+ , sum_tycon = tycon })
+ = do
+ prs <- mapM buildPRDictRepr prods
+ dfun <- prDFunOfTyCon tycon
+ return $ dfun `mkTyApps` map reprType prods `mkApps` prs
+
+buildPRDict :: Repr -> TyCon -> TyCon -> TyCon -> VM CoreExpr
+buildPRDict repr vect_tc prepr_tc _
+ = do
+ dict <- buildPRDictRepr repr
+
+ pr_co <- mkBuiltinCo prTyCon
+ let co = mkAppCoercion pr_co
+ . mkSymCoercion
+ $ mkTyConApp arg_co var_tys
+
+ return $ mkCoerce co dict
where
var_tys = mkTyVarTys $ tyConTyVars vect_tc
+ Just arg_co = tyConFamilyCoercion_maybe prepr_tc
+
buildPArrayTyCon :: TyCon -> TyCon -> VM TyCon
buildPArrayTyCon orig_tc vect_tc = fixV $ \repr_tc ->
do
orig_name = tyConName orig_tc
tyvars = tyConTyVars vect_tc
rec_flag = boolToRecFlag (isRecursiveTyCon vect_tc)
-
+
buildPArrayTyConRhs :: Name -> TyCon -> TyCon -> VM AlgTyConRhs
buildPArrayTyConRhs orig_name vect_tc repr_tc
buildPArrayDataCon orig_name vect_tc repr_tc
= do
dc_name <- cloneName mkPArrayDataConOcc orig_name
- shape <- tyConShape vect_tc
- repr_tys <- mapM mkPArrayType types
+ repr <- mkRepr vect_tc
+
+ shape_tys <- arrShapeTys repr
+ repr_tys <- arrReprTys repr
+
+ let tys = shape_tys ++ concat repr_tys
liftDs $ buildDataCon dc_name
False -- not infix
- (shapeStrictness shape ++ map (const NotMarkedStrict) repr_tys)
+ (map (const NotMarkedStrict) tys)
[] -- no field labels
(tyConTyVars vect_tc)
[] -- no existentials
[] -- no eq spec
[] -- no context
- (shapeReprTys shape ++ repr_tys)
+ tys
repr_tc
- where
- types = [ty | dc <- tyConDataCons vect_tc
- , ty <- dataConRepArgTys dc]
mkPADFun :: TyCon -> VM Var
mkPADFun vect_tc
buildTyConBindings orig_tc vect_tc prepr_tc arr_tc dfun
= do
shape <- tyConShape vect_tc
+ repr <- mkRepr vect_tc
sequence_ (zipWith4 (vectDataConWorker shape vect_tc arr_tc arr_dc)
orig_dcs
vect_dcs
(inits repr_tys)
(tails repr_tys))
- dict <- buildPADict shape vect_tc prepr_tc arr_tc dfun
+ dict <- buildPADict repr vect_tc prepr_tc arr_tc dfun
binds <- takeHoisted
return $ (dfun, dict) : binds
where
shapes <- shapeReplicate shape
(Var len)
(mkDataConTag vect_dc)
-
+
empty_pre <- mapM emptyPA (concat pre)
empty_post <- mapM emptyPA (concat post)
++ map Var args
++ empty_post
-buildPADict :: Shape -> TyCon -> TyCon -> TyCon -> Var -> VM CoreExpr
-buildPADict shape vect_tc prepr_tc arr_tc dfun
+buildPADict :: Repr -> TyCon -> TyCon -> TyCon -> Var -> VM CoreExpr
+buildPADict repr vect_tc prepr_tc arr_tc dfun
= polyAbstract tvs $ \abstract ->
do
- meth_binds <- mapM (mk_method shape) paMethods
+ meth_binds <- mapM (mk_method repr) paMethods
let meth_exprs = map (Var . fst) meth_binds
pa_dc <- builtin paDataCon
tvs = tyConTyVars arr_tc
arg_tys = mkTyVarTys tvs
- mk_method shape (name, build)
+ mk_method repr (name, build)
= localV
$ do
- body <- build shape vect_tc prepr_tc arr_tc
+ body <- build repr vect_tc prepr_tc arr_tc
var <- newLocalVar name (exprType body)
return (var, mkInlineMe body)
-
+
paMethods = [(FSLIT("toPRepr"), buildToPRepr),
(FSLIT("fromPRepr"), buildFromPRepr),
(FSLIT("toArrPRepr"), buildToArrPRepr),
(FSLIT("fromArrPRepr"), buildFromArrPRepr),
(FSLIT("dictPRepr"), buildPRDict)]
-buildLengthPA :: Shape -> TyCon -> TyCon -> TyCon -> VM CoreExpr
-buildLengthPA shape vect_tc _ arr_tc
- = do
- parr_ty <- mkPArrayType (mkTyConApp vect_tc arg_tys)
- arg <- newLocalVar FSLIT("xs") parr_ty
- shapes <- mapM (newLocalVar FSLIT("sh")) shape_tys
- wilds <- mapM newDummyVar repr_tys
- let scrut = unwrapFamInstScrut arr_tc arg_tys (Var arg)
- scrut_ty = exprType scrut
-
- body <- shapeLength shape (map Var shapes)
-
- return . Lam arg
- $ Case scrut (mkWildId scrut_ty) intPrimTy
- [(DataAlt repr_dc, shapes ++ wilds, body)]
- where
- arg_tys = mkTyVarTys $ tyConTyVars arr_tc
- [repr_dc] = tyConDataCons arr_tc
-
- shape_tys = shapeReprTys shape
- repr_tys = drop (length shape_tys) (dataConRepArgTys repr_dc)
-
--- data T = C0 t1 ... tm
--- ...
--- Ck u1 ... un
---
--- data [:T:] = A ![:Int:] [:t1:] ... [:un:]
---
--- replicatePA :: Int# -> T -> [:T:]
--- replicatePA n# t
--- = let c = case t of
--- C0 _ ... _ -> 0
--- ...
--- Ck _ ... _ -> k
---
--- xs1 = case t of
--- C0 x1 _ ... _ -> replicatePA @t1 n# x1
--- _ -> emptyPA @t1
---
--- ...
---
--- ysn = case t of
--- Ck _ ... _ yn -> replicatePA @un n# yn
--- _ -> emptyPA @un
--- in
--- A (replicatePA @Int n# c) xs1 ... ysn
---
---
-
-buildReplicatePA :: Shape -> TyCon -> TyCon -> TyCon -> VM CoreExpr
-buildReplicatePA shape vect_tc _ arr_tc
- = do
- len_var <- newLocalVar FSLIT("n") intPrimTy
- val_var <- newLocalVar FSLIT("x") val_ty
-
- let len = Var len_var
- val = Var val_var
-
- shape_reprs <- shapeReplicate shape len (ctr_num val)
- reprs <- liftM concat $ mapM (mk_comp_arrs len val) vect_dcs
-
- return . mkLams [len_var, val_var]
- . wrapFamInstBody arr_tc arg_tys
- $ mkConApp arr_dc (map Type arg_tys ++ shape_reprs ++ reprs)
- where
- arg_tys = mkTyVarTys (tyConTyVars arr_tc)
- val_ty = mkTyConApp vect_tc arg_tys
- wild = mkWildId val_ty
- vect_dcs = tyConDataCons vect_tc
- [arr_dc] = tyConDataCons arr_tc
-
- ctr_num val = Case val wild intTy (zipWith ctr_num_alt vect_dcs [0..])
- ctr_num_alt dc i = (DataAlt dc, map mkWildId (dataConRepArgTys dc),
- mkConApp intDataCon [mkIntLitInt i])
-
-
- mk_comp_arrs len val dc = let tys = dataConRepArgTys dc
- wilds = map mkWildId tys
- in
- sequence (zipWith3 (mk_comp_arr len val dc)
- tys (inits wilds) (tails wilds))
-
- mk_comp_arr len val dc ty pre (_:post)
- = do
- var <- newLocalVar FSLIT("x") ty
- rep <- replicatePA len (Var var)
- empty <- emptyPA ty
- arr_ty <- mkPArrayType ty
-
- return $ Case val wild arr_ty
- [(DEFAULT, [], empty), (DataAlt dc, pre ++ (var : post), rep)]
-
-- | Split the given tycons into two sets depending on whether they have to be
-- converted (first list) or not (second list). The first argument contains
-- information about the conversion status of external tycons:
---
+--
-- * tycons which have converted versions are mapped to True
-- * tycons which are not changed by vectorisation are mapped to False
-- * tycons which can't be converted are not elements of the map
must_convert = foldUFM (||) False (intersectUFM_C const cs refs)
convertable tc = isDataTyCon tc && all isVanillaDataCon (tyConDataCons tc)
-
+
-- | Compute mutually recursive groups of tycons in topological order
--
tyConGroups :: [TyCon] -> [TyConGroup]
(tcs, dss) = unzip els
tyConsOfTyCon :: TyCon -> UniqSet TyCon
-tyConsOfTyCon
+tyConsOfTyCon
= tyConsOfTypes . concatMap dataConRepArgTys . tyConDataCons
tyConsOfType :: Type -> UniqSet TyCon