import HscTypes ( TypeEnv, extendTypeEnvList, typeEnvTyCons )
import CoreSyn
import CoreUtils
+import MkCore ( mkWildCase )
import BuildTyCl
import DataCon
import TyCon
import MkId
import BasicTypes ( StrictnessMark(..), boolToRecFlag )
import Var ( Var, TyVar )
-import Id ( mkWildId )
import Name ( Name, getOccName )
import NameEnv
import TysWiredIn
| isFunTyCon tc = builtin closureTyCon
| isBoxedTupleTyCon tc = return tc
| isUnLiftedTyCon tc = return tc
- | otherwise = do
- r <- lookupTyCon tc
- case r of
- Just tc' -> return tc'
-
- -- FIXME: just for now
- Nothing -> pprTrace "ccTyCon:" (ppr tc) $ return tc
+ | otherwise = maybeCantVectoriseM "Tycon not vectorised:" (ppr tc)
+ $ lookupTyCon tc
vectAndLiftType :: Type -> VM (Type, Type)
vectAndLiftType ty | Just ty' <- coreView ty = vectAndLiftType ty'
where
(tyvars, mono_ty) = splitForAllTys ty
-vectType ty = traceNoV "vectType: can't vectorise" (ppr ty)
+vectType ty = cantVectorise "Can't vectorise type" (ppr ty)
vectAndBoxType :: Type -> VM Type
vectAndBoxType ty = vectType ty >>= boxType
vectTyConDecl tc
= do
name' <- cloneName mkVectTyConOcc name
- rhs' <- vectAlgTyConRhs (algTyConRhs tc)
+ rhs' <- vectAlgTyConRhs tc (algTyConRhs tc)
liftDs $ buildAlgTyCon name'
tyvars
tyvars = tyConTyVars tc
rec_flag = boolToRecFlag (isRecursiveTyCon tc)
-vectAlgTyConRhs :: AlgTyConRhs -> VM AlgTyConRhs
-vectAlgTyConRhs (DataTyCon { data_cons = data_cons
- , is_enum = is_enum
- })
+vectAlgTyConRhs :: TyCon -> AlgTyConRhs -> VM AlgTyConRhs
+vectAlgTyConRhs _ (DataTyCon { data_cons = data_cons
+ , is_enum = is_enum
+ })
= do
data_cons' <- mapM vectDataCon data_cons
zipWithM_ defDataCon data_cons data_cons'
return $ DataTyCon { data_cons = data_cons'
, is_enum = is_enum
}
-vectAlgTyConRhs _ = panic "vectAlgTyConRhs"
+vectAlgTyConRhs tc _ = cantVectorise "Can't vectorise type definition:" (ppr tc)
vectDataCon :: DataCon -> VM DataCon
vectDataCon dc
- | not . null $ dataConExTyVars dc = pprPanic "vectDataCon: existentials" (ppr dc)
- | not . null $ dataConEqSpec dc = pprPanic "vectDataCon: eq spec" (ppr dc)
+ | not . null $ dataConExTyVars dc
+ = cantVectorise "Can't vectorise constructor (existentials):" (ppr dc)
+ | not . null $ dataConEqSpec dc
+ = cantVectorise "Can't vectorise constructor (eq spec):" (ppr dc)
| otherwise
= do
name' <- cloneName mkVectDataConOcc name
[] -- no existential tvs for now
[] -- no eq spec for now
[] -- no context
- arg_tys
+ arg_tys
+ (mkFamilyTyConApp tycon' (mkTyVarTys univ_tvs))
tycon'
where
name = dataConName dc
expr
= do
(vars, bodies) <- mapAndUnzipM to_unboxed prods
- return . Case expr (mkWildId (exprType expr)) res_ty
+ return . mkWildCase expr (exprType expr) res_ty
$ zipWith4 mk_alt cons vars (tyConDataCons tycon) bodies
where
mk_alt con vars sum_con body
ty_args = map (Type . reprType) prods
to_repr (EnumRepr { enum_data_con = data_con }) expr
- = return . Case expr (mkWildId (exprType expr)) res_ty
+ = return . mkWildCase expr (exprType expr) res_ty
$ map mk_alt cons
where
mk_alt con = (DataAlt con, [], mkConApp data_con [mkDataConTag con])
to_repr prod expr
= do
(vars, body) <- to_unboxed prod
- return $ Case expr (mkWildId (exprType expr)) res_ty
+ return $ mkWildCase expr (exprType expr) res_ty
[(DataAlt con, vars, body)]
to_unboxed (ProdRepr { prod_components = tys
vars <- mapM (newLocalVar (fsLit "x")) (map reprType prods)
bodies <- sequence . zipWith3 from_unboxed prods cons
$ map Var vars
- return . Case expr (mkWildId (reprType repr)) res_ty
+ return . mkWildCase expr (reprType repr) res_ty
$ zipWith3 sum_alt (tyConDataCons tycon) vars bodies
where
sum_alt data_con var body = (DataAlt data_con, [var], body)
= do
var <- newLocalVar (fsLit "n") intPrimTy
- let res = Case (Var var) (mkWildId intPrimTy) res_ty
+ let res = mkWildCase (Var var) intPrimTy res_ty
$ (DEFAULT, [], error_expr)
: zipWith mk_alt (tyConDataCons vect_tc) cons
- return $ Case expr (mkWildId (reprType repr)) res_ty
+ return $ mkWildCase expr (reprType repr) res_ty
[(DataAlt data_con, [var], res)]
where
mk_alt data_con con = (LitAlt (mkDataConTagLit data_con), [], con)
expr
= do
vars <- mapM (newLocalVar (fsLit "y")) tys
- return $ Case expr (mkWildId (reprType prod)) res_ty
+ return $ mkWildCase expr (reprType prod) res_ty
[(DataAlt data_con, vars, con `mkVarApps` vars)]
from_unboxed (IdRepr _) con expr
return . Lam arg
. mkCoerce co
- $ Case scrut (mkWildId (mkTyConApp arr_tc var_tys)) res_ty
+ $ mkWildCase scrut (mkTyConApp arr_tc var_tys) res_ty
[(DataAlt arr_dc, shape_vars ++ concat repr_vars, result)]
where
var_tys = mkTyVarTys $ tyConTyVars vect_tc
result <- go prods repr_vars vars body
let scrut = unwrapFamInstScrut tycon ty_args expr
- return . Case scrut (mkWildId scrut_ty) res_ty
+ return . mkWildCase scrut scrut_ty res_ty
$ [(DataAlt data_con, shape_vars ++ vars, result)]
where
ty_args = map reprType prods
let scrut = unwrapFamInstScrut tycon tys expr
scrut_ty = mkTyConApp tycon tys
- return $ Case scrut (mkWildId scrut_ty) res_ty
+ return $ mkWildCase scrut scrut_ty res_ty
[(DataAlt data_con, shape_vars ++ repr_vars, body)]
from_prod (EnumRepr { enum_arr_tycon = tycon
= let scrut = unwrapFamInstScrut tycon [] expr
scrut_ty = mkTyConApp tycon []
in
- return $ Case scrut (mkWildId scrut_ty) res_ty
+ return $ mkWildCase scrut scrut_ty res_ty
[(DataAlt data_con, shape_vars, body)]
from_prod (IdRepr _)
repr_tys <- arrReprTys repr
let tys = shape_tys ++ repr_tys
+ tvs = tyConTyVars vect_tc
liftDs $ buildDataCon dc_name
False -- not infix
(map (const NotMarkedStrict) tys)
[] -- no field labels
- (tyConTyVars vect_tc)
+ tvs
[] -- no existentials
[] -- no eq spec
[] -- no context
tys
+ (mkFamilyTyConApp repr_tc (mkTyVarTys tvs))
repr_tc
mkPADFun :: TyCon -> VM Var