- let tag = mkDataConTag vect_dc
- fvs = freeVarsOf body `delVarSetList` bndrs
- (vect_bndrs, lift_bndrs, vbody)
- <- vect_alt_bndrs bndrs
- $ \len -> packLiftingContext len sel tag fvs vty lty
- $ vectExpr body
-
+ let ntag = dataConTagZ vect_dc
+ tag = mkDataConTag vect_dc
+ fvs = freeVarsOf body `delVarSetList` bndrs
+
+ pick <- builtin (selPick arity)
+ let flags_expr = mkApps pick [sel, tag]
+ flags_var <- newLocalVar (fsLit "flags") (exprType flags_expr)
+ lc <- builtin liftingContext
+ elems <- builtin (selElements arity ntag)
+
+ (vbndrs, vbody)
+ <- vectBndrsIn bndrs
+ . localV
+ $ do
+ binds <- mapM (pack_var (Var lc) (Var flags_var))
+ . filter isLocalId
+ $ varSetElems fvs
+ (ve, le) <- vectExpr body
+ empty <- emptyPD vty
+ return (ve, Case (elems `App` sel) lc lty
+ [(DEFAULT, [], Let (NonRec flags_var flags_expr)
+ $ mkLets (concat binds) le),
+ (LitAlt (mkMachInt 0), [], empty)])
+ let (vect_bndrs, lift_bndrs) = unzip vbndrs