summaryrefslogtreecommitdiff
path: root/compiler
diff options
context:
space:
mode:
authorkeller@cse.unsw.edu.au <unknown>2010-11-15 05:12:25 +0000
committerkeller@cse.unsw.edu.au <unknown>2010-11-15 05:12:25 +0000
commitaa8096682b02fefcdc77e8f689b50b7288e273e7 (patch)
tree4cfa812ced7628854cfd16b7ac1062d316edafc2 /compiler
parentbfba6cc2e97445a49718ee984c147576a9a5bc51 (diff)
downloadhaskell-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.hs23
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