+ 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