+vectAlgCase tycon _ty_args scrut bndr ty alts
+ = do
+ vect_tc <- maybeV (lookupTyCon tycon)
+ (vty, lty) <- vectAndLiftType ty
+ repr <- mkRepr vect_tc
+ shape_bndrs <- arrShapeVars repr
+ (len, sel, indices) <- arrSelector repr (map Var shape_bndrs)
+
+ (vbndr, valts) <- vect_scrut_bndr $ mapM (proc_alt sel vty lty) alts'
+ let (vect_dcs, vect_bndrss, lift_bndrss, vbodies) = unzip4 valts
+
+ vexpr <- vectExpr scrut
+ (vscrut, arr_tc, _arg_tys) <- mkVScrut (vVar vbndr)
+ let [arr_dc] = tyConDataCons arr_tc
+
+ let (vect_scrut, lift_scrut) = vscrut
+ (vect_bodies, lift_bodies) = unzip vbodies
+
+ vdummy <- newDummyVar (exprType vect_scrut)
+ ldummy <- newDummyVar (exprType lift_scrut)
+ let vect_case = Case vect_scrut vdummy vty
+ (zipWith3 mk_vect_alt vect_dcs vect_bndrss vect_bodies)
+
+ lbody <- combinePA vty len sel indices lift_bodies
+ let lift_case = Case lift_scrut ldummy lty
+ [(DataAlt arr_dc, shape_bndrs ++ concat lift_bndrss,
+ lbody)]
+
+ return . vLet (vNonRec vbndr vexpr)
+ $ (vect_case, lift_case)
+ where
+ vect_scrut_bndr | isDeadBinder bndr = vectBndrNewIn bndr (fsLit "scrut")
+ | otherwise = vectBndrIn bndr