diff options
author | keller@cse.unsw.edu.au <unknown> | 2010-11-15 05:12:25 +0000 |
---|---|---|
committer | keller@cse.unsw.edu.au <unknown> | 2010-11-15 05:12:25 +0000 |
commit | aa8096682b02fefcdc77e8f689b50b7288e273e7 (patch) | |
tree | 4cfa812ced7628854cfd16b7ac1062d316edafc2 /compiler | |
parent | bfba6cc2e97445a49718ee984c147576a9a5bc51 (diff) | |
download | haskell-aa8096682b02fefcdc77e8f689b50b7288e273e7.tar.gz |
Handling of lets, letrec and case when checking if a lambda expr needs to be vectorised
Diffstat (limited to 'compiler')
-rw-r--r-- | compiler/vectorise/Vectorise/Exp.hs | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/compiler/vectorise/Vectorise/Exp.hs b/compiler/vectorise/Vectorise/Exp.hs index 42efe37f96..d00b040726 100644 --- a/compiler/vectorise/Vectorise/Exp.hs +++ b/compiler/vectorise/Vectorise/Exp.hs @@ -197,13 +197,28 @@ vectScalarLam args body = tycon == intTyCon || tycon == floatTyCon || tycon == doubleTyCon + || tycon == boolTyCon | otherwise = False is_scalar vs (Var v) = v `elemVarSet` vs is_scalar _ e@(Lit _) = is_scalar_ty $ exprType e is_scalar vs (App e1 e2) = is_scalar vs e1 && is_scalar vs e2 - is_scalar _ _ = False + is_scalar vs (Let (NonRec b letExpr) body) + = is_scalar vs letExpr && is_scalar (extendVarSet vs b) body + is_scalar vs (Let (Rec bnds) body) + = let vs' = extendVarSetList vs (map fst bnds) + in all (is_scalar vs') (map snd bnds) && is_scalar vs' body + is_scalar vs (Case e eId ty alts) + = let vs' = extendVarSet vs eId + in is_scalar_ty ty && + is_scalar vs' e && + (all (is_scalar_alt vs') alts) + + is_scalar _ e = False + + is_scalar_alt vs (_, bs, e) + = is_scalar (extendVarSetList vs bs) e -- A scalar function has to actually compute something. Without the check, -- we would treat (\(x :: Int) -> x) as a scalar function and lift it to @@ -211,8 +226,14 @@ vectScalarLam args body -- (\n# x -> x) which is what we want. uses funs (Var v) = v `elemVarSet` funs uses funs (App e1 e2) = uses funs e1 || uses funs e2 + uses funs (Let (NonRec b letExpr) body) + = uses funs letExpr || uses funs body + uses funs (Case e eId ty alts) + = uses funs e || any (uses_alt funs) alts uses _ _ = False + uses_alt funs (_, bs, e) + = uses funs e -- | Vectorise a lambda abstraction. vectLam |