-vectExpr (_, AnnVar v) = vectVar v
-
-vectExpr (_, AnnLit lit) = vectLiteral lit
-
-vectExpr (_, AnnNote note expr)
- = liftM (vNote note) (vectExpr expr)
-
-vectExpr e@(_, AnnApp _ arg)
- | isAnnTypeArg arg
- = vectTyAppExpr fn tys
- where
- (fn, tys) = collectAnnTypeArgs e
-
-vectExpr (_, AnnApp (_, AnnVar v) (_, AnnLit lit))
- | Just con <- isDataConId_maybe v
- , is_special_con con
- = do
- let vexpr = App (Var v) (Lit lit)
- lexpr <- liftPA vexpr
- return (vexpr, lexpr)
- where
- is_special_con con = con `elem` [intDataCon, floatDataCon, doubleDataCon]
-
-
-vectExpr (_, AnnApp fn arg)
- = do
- arg_ty' <- vectType arg_ty
- res_ty' <- vectType res_ty
- fn' <- vectExpr fn
- arg' <- vectExpr arg
- mkClosureApp arg_ty' res_ty' fn' arg'
- where
- (arg_ty, res_ty) = splitFunTy . exprType $ deAnnotate fn
-
-vectExpr (_, AnnCase scrut bndr ty alts)
- | Just (tycon, ty_args) <- splitTyConApp_maybe scrut_ty
- , isAlgTyCon tycon
- = vectAlgCase tycon ty_args scrut bndr ty alts
- where
- scrut_ty = exprType (deAnnotate scrut)
-
-vectExpr (_, AnnCase expr bndr ty alts)
- = panic "vectExpr: case"
-
-vectExpr (_, AnnLet (AnnNonRec bndr rhs) body)
- = do
- vrhs <- localV . inBind bndr $ vectPolyExpr rhs
- (vbndr, vbody) <- vectBndrIn bndr (vectExpr body)
- return $ vLet (vNonRec vbndr vrhs) vbody
-
-vectExpr (_, AnnLet (AnnRec bs) body)
- = do
- (vbndrs, (vrhss, vbody)) <- vectBndrsIn bndrs
- $ liftM2 (,)
- (zipWithM vect_rhs bndrs rhss)
- (vectPolyExpr body)
- return $ vLet (vRec vbndrs vrhss) vbody
- where
- (bndrs, rhss) = unzip bs
-
- vect_rhs bndr rhs = localV
- . inBind bndr
- $ vectExpr rhs
-
-vectExpr e@(fvs, AnnLam bndr _)
- | not (isId bndr) = pprPanic "vectExpr" (ppr $ deAnnotate e)
- | otherwise = vectLam fvs bs body
- where
- (bs,body) = collectAnnValBinders e
-
-vectExpr e = pprPanic "vectExpr" (ppr $ deAnnotate e)
-
-vectLam :: VarSet -> [Var] -> CoreExprWithFVs -> VM VExpr
-vectLam fvs bs body
- = do
- tyvars <- localTyVars
- (vs, vvs) <- readLEnv $ \env ->
- unzip [(var, vv) | var <- varSetElems fvs
- , Just vv <- [lookupVarEnv (local_vars env) var]]
-
- arg_tys <- mapM (vectType . idType) bs
- res_ty <- vectType (exprType $ deAnnotate body)
-
- buildClosures tyvars vvs arg_tys res_ty
- . hoistPolyVExpr tyvars
- $ do
- lc <- builtin liftingContext
- (vbndrs, vbody) <- vectBndrsIn (vs ++ bs)
- (vectExpr body)
- return $ vLams lc vbndrs vbody
-
-vectTyAppExpr :: CoreExprWithFVs -> [Type] -> VM VExpr
-vectTyAppExpr (_, AnnVar v) tys = vectPolyVar v tys
-vectTyAppExpr e tys = pprPanic "vectTyAppExpr" (ppr $ deAnnotate e)
-
-type CoreAltWithFVs = AnnAlt Id VarSet
-
--- We convert
---
--- case e :: t of v { ... }
---
--- to
---
--- V: let v' = e in case v' of _ { ... }
--- L: let v' = e in case v' `cast` ... of _ { ... }