var' <- vectTopBinder var
expr' <- vectTopRhs var expr
hs <- takeHoisted
- return . Rec $ (var, expr) : (var', expr') : hs
+ cexpr <- tryConvert var var' expr
+ return . Rec $ (var, cexpr) : (var', expr') : hs
`orElseV`
return b
vars' <- mapM vectTopBinder vars
exprs' <- zipWithM vectTopRhs vars exprs
hs <- takeHoisted
- return . Rec $ bs ++ zip vars' exprs' ++ hs
+ cexprs <- sequence $ zipWith3 tryConvert vars vars' exprs
+ return . Rec $ zip vars cexprs ++ zip vars' exprs' ++ hs
`orElseV`
return b
where
. inBind var
$ vectPolyExpr (freeVars expr)
+tryConvert :: Var -> Var -> CoreExpr -> VM CoreExpr
+tryConvert var vect_var rhs
+ = fromVect (idType var) (Var vect_var) `orElseV` return rhs
+
-- ----------------------------------------------------------------------------
-- Bindings
return (Lit lit, lexpr)
vectPolyExpr :: CoreExprWithFVs -> VM VExpr
+vectPolyExpr (_, AnnNote note expr)
+ = liftM (vNote note) $ vectPolyExpr expr
vectPolyExpr expr
= polyAbstract tvs $ \abstract ->
do
lc_var <- builtin liftingContext
localV $
do
- bnds <- mapM (packFreeVar (Var lc_var) (Var sel_var)) (varSetElems fvs)
+ bnds <- mapM (packFreeVar (Var lc_var) (Var sel_var))
+ . filter isLocalId
+ $ varSetElems fvs
(vexpr, lexpr) <- p
return (vexpr, Let (NonRec sel_var sel_expr)
+ . mkLets (concat bnds)
$ Case len lc_var res_ty [(DEFAULT, [], lexpr)])
packFreeVar :: CoreExpr -> CoreExpr -> Var -> VM [CoreBind]