+ -- 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
+ -- (map (\x -> x)) which is very bad. Normal lifting transforms it to
+ -- (\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 _ _ = False
+
+
+vectLam
+ :: Bool -- ^ When the RHS of a binding, whether that binding should be inlined.
+ -> Bool -- ^ Whether the binding is a loop breaker.
+ -> VarSet -- ^ The free variables in the body.
+ -> [Var] --
+ -> CoreExprWithFVs
+ -> VM VExpr
+
+vectLam inline loop_breaker fvs bs body
+ = dtrace (vcat [ text "vectLam "
+ , text "free vars = " <> ppr fvs
+ , text "binding vars = " <> ppr bs
+ , text "body = " <> ppr (deAnnotate body)])
+
+ $ do tyvars <- localTyVars