X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2Fvectorise%2FVectorise.hs;h=777c195a2a37d8b322524943e763739157fc711b;hb=90ce88a0a9b5611416e592a6ff96781ba884975f;hp=68b796f82eead1de42988666db1700704dddd775;hpb=ea145221cf910e20e30c0a9c47fed87be98f9621;p=ghc-hetmet.git diff --git a/compiler/vectorise/Vectorise.hs b/compiler/vectorise/Vectorise.hs index 68b796f..777c195 100644 --- a/compiler/vectorise/Vectorise.hs +++ b/compiler/vectorise/Vectorise.hs @@ -193,7 +193,7 @@ vectPolyExpr (_, AnnNote note expr) vectPolyExpr expr = polyAbstract tvs $ \abstract -> do - mono' <- vectExpr mono + mono' <- vectFnExpr False mono return $ mapVect abstract mono' where (tvs, mono) = collectAnnTypeBinders expr @@ -263,14 +263,26 @@ vectExpr (_, AnnLet (AnnRec bs) body) . inBind bndr $ vectExpr rhs -vectExpr e@(fvs, AnnLam bndr _) - | isId bndr = onlyIfV (isEmptyVarSet fvs) (vectScalarLam bs $ deAnnotate body) - `orElseV` vectLam fvs bs body +vectExpr e@(_, AnnLam bndr _) + | isId bndr = vectFnExpr True e +{- +onlyIfV (isEmptyVarSet fvs) (vectScalarLam bs $ deAnnotate body) + `orElseV` vectLam True fvs bs body where (bs,body) = collectAnnValBinders e +-} vectExpr e = cantVectorise "Can't vectorise expression" (ppr $ deAnnotate e) +vectFnExpr :: Bool -> CoreExprWithFVs -> VM VExpr +vectFnExpr inline e@(fvs, AnnLam bndr _) + | isId bndr = onlyIfV (isEmptyVarSet fvs) (vectScalarLam bs $ deAnnotate body) + `orElseV` vectLam inline fvs bs body + where + (bs,body) = collectAnnValBinders e +vectFnExpr _ e = vectExpr e + + vectScalarLam :: [Var] -> CoreExpr -> VM VExpr vectScalarLam args body = do @@ -302,8 +314,8 @@ vectScalarLam args body is_scalar vs (App e1 e2) = is_scalar vs e1 && is_scalar vs e2 is_scalar _ _ = False -vectLam :: VarSet -> [Var] -> CoreExprWithFVs -> VM VExpr -vectLam fvs bs body +vectLam :: Bool -> VarSet -> [Var] -> CoreExprWithFVs -> VM VExpr +vectLam inline fvs bs body = do tyvars <- localTyVars (vs, vvs) <- readLEnv $ \env -> @@ -319,7 +331,9 @@ vectLam fvs bs body lc <- builtin liftingContext (vbndrs, vbody) <- vectBndrsIn (vs ++ bs) (vectExpr body) - return $ vLams lc vbndrs vbody + return . maybe_inline $ vLams lc vbndrs vbody + where + maybe_inline = if inline then vInlineMe else id vectTyAppExpr :: CoreExprWithFVs -> [Type] -> VM VExpr vectTyAppExpr (_, AnnVar v) tys = vectPolyVar v tys