import OccName
import Name
import NameEnv
+import TysPrim ( intPrimTy )
import DsMonad
import PrelNames
, lengthPAVar :: Var
, replicatePAVar :: Var
, emptyPAVar :: Var
+ , liftingContext :: Var
}
paDictTyCon :: Builtins -> TyCon
replicatePAVar <- dsLookupGlobalId replicatePAName
emptyPAVar <- dsLookupGlobalId emptyPAName
+ liftingContext <- liftM (\u -> mkSysLocal FSLIT("lc") u intPrimTy)
+ newUnique
+
return $ Builtins {
parrayTyCon = parrayTyCon
, paClass = paClass
, lengthPAVar = lengthPAVar
, replicatePAVar = replicatePAVar
, emptyPAVar = emptyPAVar
+ , liftingContext = liftingContext
}
data GlobalEnv = GlobalEnv {
splitClosureTy,
mkPADictType, mkPArrayType,
paDictArgType, paDictOfType,
- paMethod, lengthPA, replicatePA, emptyPA,
+ paMethod, lengthPA, replicatePA, emptyPA, liftPA,
polyAbstract, polyApply, polyVApply,
lookupPArrayFamInst,
hoistExpr, hoistPolyVExpr, takeHoisted,
emptyPA :: Type -> VM CoreExpr
emptyPA = paMethod emptyPAVar
+liftPA :: CoreExpr -> VM CoreExpr
+liftPA x
+ = do
+ lc <- builtin liftingContext
+ replicatePA (Var lc) x
+
newLocalVVar :: FastString -> Type -> VM VVar
newLocalVVar fs vty
= do
where
(arg_ty, res_ty) = splitClosureTy (exprType vclo)
-buildClosures :: [TyVar] -> Var -> [VVar] -> [Type] -> Type -> VM VExpr -> VM VExpr
-buildClosures tvs lc vars [arg_ty] res_ty mk_body
- = buildClosure tvs lc vars arg_ty res_ty mk_body
-buildClosures tvs lc vars (arg_ty : arg_tys) res_ty mk_body
+buildClosures :: [TyVar] -> [VVar] -> [Type] -> Type -> VM VExpr -> VM VExpr
+buildClosures tvs vars [arg_ty] res_ty mk_body
+ = buildClosure tvs vars arg_ty res_ty mk_body
+buildClosures tvs vars (arg_ty : arg_tys) res_ty mk_body
= do
res_ty' <- mkClosureTypes arg_tys res_ty
arg <- newLocalVVar FSLIT("x") arg_ty
- buildClosure tvs lc vars arg_ty res_ty'
+ buildClosure tvs vars arg_ty res_ty'
. hoistPolyVExpr tvs
$ do
- clo <- buildClosures tvs lc (vars ++ [arg]) arg_tys res_ty mk_body
+ lc <- builtin liftingContext
+ clo <- buildClosures tvs (vars ++ [arg]) arg_tys res_ty mk_body
return $ vLams lc (vars ++ [arg]) clo
-- (clo <x1,...,xn> <f,f^>, aclo (Arr lc xs1 ... xsn) <f,f^>)
-- f = \env v -> case env of <x1,...,xn> -> e x1 ... xn v
-- f^ = \env v -> case env of Arr l xs1 ... xsn -> e^ l x1 ... xn v
--
-buildClosure :: [TyVar] -> Var -> [VVar] -> Type -> Type -> VM VExpr -> VM VExpr
-buildClosure tvs lv vars arg_ty res_ty mk_body
+buildClosure :: [TyVar] -> [VVar] -> Type -> Type -> VM VExpr -> VM VExpr
+buildClosure tvs vars arg_ty res_ty mk_body
= do
- (env_ty, env, bind) <- buildEnv lv vars
+ (env_ty, env, bind) <- buildEnv vars
env_bndr <- newLocalVVar FSLIT("env") env_ty
arg_bndr <- newLocalVVar FSLIT("arg") arg_ty
fn <- hoistPolyVExpr tvs
$ do
+ lc <- builtin liftingContext
body <- mk_body
body' <- bind (vVar env_bndr)
- (vVarApps lv body (vars ++ [arg_bndr]))
+ (vVarApps lc body (vars ++ [arg_bndr]))
return (vLamsWithoutLC [env_bndr, arg_bndr] body')
mkClosure arg_ty res_ty env_ty fn env
-buildEnv :: Var -> [VVar] -> VM (Type, VExpr, VExpr -> VExpr -> VM VExpr)
-buildEnv lv vvs
+buildEnv :: [VVar] -> VM (Type, VExpr, VExpr -> VExpr -> VM VExpr)
+buildEnv vvs
= do
+ lc <- builtin liftingContext
let (ty, venv, vbind) = mkVectEnv tys vs
- (lenv, lbind) <- mkLiftEnv lv tys ls
+ (lenv, lbind) <- mkLiftEnv lc tys ls
return (ty, (venv, lenv),
\(venv,lenv) (vbody,lbody) ->
do
ty = mkCoreTupTy tys
mkLiftEnv :: Var -> [Type] -> [Var] -> VM (CoreExpr, CoreExpr -> CoreExpr -> VM CoreExpr)
-mkLiftEnv lv [ty] [v]
+mkLiftEnv lc [ty] [v]
= return (Var v, \env body ->
do
len <- lengthPA (Var v)
return . Let (NonRec v env)
- $ Case len lv (exprType body) [(DEFAULT, [], body)])
+ $ Case len lc (exprType body) [(DEFAULT, [], body)])
-- NOTE: this transparently deals with empty environments
-mkLiftEnv lv tys vs
+mkLiftEnv lc tys vs
= do
(env_tc, env_tyargs) <- lookupPArrayFamInst vty
let [env_con] = tyConDataCons env_tc
env = Var (dataConWrapId env_con)
`mkTyApps` env_tyargs
- `mkVarApps` (lv : vs)
+ `mkVarApps` (lc : vs)
bind env body = let scrut = unwrapFamInstScrut env_tc env_tyargs env
in
return $ Case scrut (mkWildId (exprType scrut))
(exprType body)
- [(DataAlt env_con, lv : bndrs, body)]
+ [(DataAlt env_con, lc : bndrs, body)]
return (env, bind)
where
vty = mkCoreTupTy tys
vectTopRhs :: Var -> CoreExpr -> VM CoreExpr
vectTopRhs var expr
= do
- lc <- newLocalVar FSLIT("lc") intPrimTy
closedV . liftM vectorised
. inBind var
- $ vectPolyExpr lc (freeVars expr)
+ $ vectPolyExpr (freeVars expr)
-- ----------------------------------------------------------------------------
-- Bindings
-- ----------------------------------------------------------------------------
-- Expressions
-vectVar :: Var -> Var -> VM VExpr
-vectVar lc v
+vectVar :: Var -> VM VExpr
+vectVar v
= do
r <- lookupVar v
case r of
Local (vv,lv) -> return (Var vv, Var lv)
Global vv -> do
let vexpr = Var vv
- lexpr <- replicatePA (Var lc) vexpr
+ lexpr <- liftPA vexpr
return (vexpr, lexpr)
-vectPolyVar :: Var -> Var -> [Type] -> VM VExpr
-vectPolyVar lc v tys
+vectPolyVar :: Var -> [Type] -> VM VExpr
+vectPolyVar v tys
= do
vtys <- mapM vectType tys
r <- lookupVar v
(polyApply (Var lv) vtys)
Global poly -> do
vexpr <- polyApply (Var poly) vtys
- lexpr <- replicatePA (Var lc) vexpr
+ lexpr <- liftPA vexpr
return (vexpr, lexpr)
-vectLiteral :: Var -> Literal -> VM VExpr
-vectLiteral lc lit
+vectLiteral :: Literal -> VM VExpr
+vectLiteral lit
= do
- lexpr <- replicatePA (Var lc) (Lit lit)
+ lexpr <- liftPA (Lit lit)
return (Lit lit, lexpr)
-vectPolyExpr :: Var -> CoreExprWithFVs -> VM VExpr
-vectPolyExpr lc expr
+vectPolyExpr :: CoreExprWithFVs -> VM VExpr
+vectPolyExpr expr
= polyAbstract tvs $ \abstract ->
- -- FIXME: shadowing (tvs in lc)
do
- mono' <- vectExpr lc mono
+ mono' <- vectExpr mono
return $ mapVect abstract mono'
where
(tvs, mono) = collectAnnTypeBinders expr
-vectExpr :: Var -> CoreExprWithFVs -> VM VExpr
-vectExpr lc (_, AnnType ty)
+vectExpr :: CoreExprWithFVs -> VM VExpr
+vectExpr (_, AnnType ty)
= liftM vType (vectType ty)
-vectExpr lc (_, AnnVar v) = vectVar lc v
+vectExpr (_, AnnVar v) = vectVar v
-vectExpr lc (_, AnnLit lit) = vectLiteral lc lit
+vectExpr (_, AnnLit lit) = vectLiteral lit
-vectExpr lc (_, AnnNote note expr)
- = liftM (vNote note) (vectExpr lc expr)
+vectExpr (_, AnnNote note expr)
+ = liftM (vNote note) (vectExpr expr)
-vectExpr lc e@(_, AnnApp _ arg)
+vectExpr e@(_, AnnApp _ arg)
| isAnnTypeArg arg
- = vectTyAppExpr lc fn tys
+ = vectTyAppExpr fn tys
where
(fn, tys) = collectAnnTypeArgs e
-vectExpr lc (_, AnnApp fn arg)
+vectExpr (_, AnnApp fn arg)
= do
- fn' <- vectExpr lc fn
- arg' <- vectExpr lc arg
+ fn' <- vectExpr fn
+ arg' <- vectExpr arg
mkClosureApp fn' arg'
-vectExpr lc (_, AnnCase expr bndr ty alts)
+vectExpr (_, AnnCase expr bndr ty alts)
= panic "vectExpr: case"
-vectExpr lc (_, AnnLet (AnnNonRec bndr rhs) body)
+vectExpr (_, AnnLet (AnnNonRec bndr rhs) body)
= do
- vrhs <- localV . inBind bndr $ vectPolyExpr lc rhs
- (vbndr, vbody) <- vectBndrIn bndr (vectExpr lc body)
+ vrhs <- localV . inBind bndr $ vectPolyExpr rhs
+ (vbndr, vbody) <- vectBndrIn bndr (vectExpr body)
return $ vLet (vNonRec vbndr vrhs) vbody
-vectExpr lc (_, AnnLet (AnnRec bs) body)
+vectExpr (_, AnnLet (AnnRec bs) body)
= do
(vbndrs, (vrhss, vbody)) <- vectBndrsIn bndrs
$ liftM2 (,)
(zipWithM vect_rhs bndrs rhss)
- (vectPolyExpr lc body)
+ (vectPolyExpr body)
return $ vLet (vRec vbndrs vrhss) vbody
where
(bndrs, rhss) = unzip bs
vect_rhs bndr rhs = localV
. inBind bndr
- $ vectExpr lc rhs
+ $ vectExpr rhs
-vectExpr lc e@(fvs, AnnLam bndr _)
+vectExpr e@(fvs, AnnLam bndr _)
| not (isId bndr) = pprPanic "vectExpr" (ppr $ deAnnotate e)
- | otherwise = vectLam lc fvs bs body
+ | otherwise = vectLam fvs bs body
where
(bs,body) = collectAnnValBinders e
-vectLam :: Var -> VarSet -> [Var] -> CoreExprWithFVs -> VM VExpr
-vectLam lc fvs bs body
+vectLam :: VarSet -> [Var] -> CoreExprWithFVs -> VM VExpr
+vectLam fvs bs body
= do
tyvars <- localTyVars
(vs, vvs) <- readLEnv $ \env ->
arg_tys <- mapM (vectType . idType) bs
res_ty <- vectType (exprType $ deAnnotate body)
- buildClosures tyvars lc vvs arg_tys res_ty
+ buildClosures tyvars vvs arg_tys res_ty
. hoistPolyVExpr tyvars
$ do
+ lc <- builtin liftingContext
(vbndrs, vbody) <- vectBndrsIn (vs ++ bs)
- (vectExpr lc body)
+ (vectExpr body)
return $ vLams lc vbndrs vbody
-vectTyAppExpr :: Var -> CoreExprWithFVs -> [Type] -> VM VExpr
-vectTyAppExpr lc (_, AnnVar v) tys = vectPolyVar lc v tys
-vectTyAppExpr lc e tys = pprPanic "vectTyAppExpr" (ppr $ deAnnotate e)
+vectTyAppExpr :: CoreExprWithFVs -> [Type] -> VM VExpr
+vectTyAppExpr (_, AnnVar v) tys = vectPolyVar v tys
+vectTyAppExpr e tys = pprPanic "vectTyAppExpr" (ppr $ deAnnotate e)