Fix bug in vectorised DataCon worker generation
[ghc-hetmet.git] / compiler / vectorise / VectType.hs
index b2e1518..96745c5 100644 (file)
@@ -308,23 +308,25 @@ buildTyConBindings :: TyCon -> TyCon -> TyCon -> Var -> VM [(Var, CoreExpr)]
 buildTyConBindings orig_tc vect_tc arr_tc dfun
   = do
       shape <- tyConShape vect_tc
-      sequence_ (zipWith3 (vectDataConWorker shape vect_tc arr_tc arr_dc)
-                          num_dcs
+      sequence_ (zipWith4 (vectDataConWorker shape vect_tc arr_tc arr_dc)
+                          orig_dcs
+                          vect_dcs
                           (inits repr_tys)
                           (tails repr_tys))
-      takeHoisted
+      dict <- buildPADict shape vect_tc arr_tc dfun
+      binds <- takeHoisted
+      return $ (dfun, dict) : binds
   where
     orig_dcs = tyConDataCons orig_tc
     vect_dcs = tyConDataCons vect_tc
     [arr_dc] = tyConDataCons arr_tc
 
-    num_dcs  = zip3 orig_dcs vect_dcs [0..]
     repr_tys = map dataConRepArgTys vect_dcs
 
 vectDataConWorker :: Shape -> TyCon -> TyCon -> DataCon
-                  -> (DataCon, DataCon, Int) -> [[Type]] -> [[Type]]
+                  -> DataCon -> DataCon -> [[Type]] -> [[Type]]
                   -> VM ()
-vectDataConWorker shape vect_tc arr_tc arr_dc (orig_dc, vect_dc, dc_num) pre (dc_tys : post)
+vectDataConWorker shape vect_tc arr_tc arr_dc orig_dc vect_dc pre (dc_tys : post)
   = do
       clo <- closedV
            . inBind orig_worker
@@ -348,7 +350,9 @@ vectDataConWorker shape vect_tc arr_tc arr_dc (orig_dc, vect_dc, dc_num) pre (dc
                 len     <- newLocalVar FSLIT("n") intPrimTy
                 arr_tys <- mapM mkPArrayType dc_tys
                 args    <- mapM (newLocalVar FSLIT("xs")) arr_tys
-                shapes  <- shapeReplicate shape (Var len) (mkIntLitInt dc_num)
+                shapes  <- shapeReplicate shape
+                                          (Var len)
+                                          (mkDataConTag vect_dc)
                 
                 empty_pre  <- mapM emptyPA (concat pre)
                 empty_post <- mapM emptyPA (concat post)
@@ -361,21 +365,17 @@ vectDataConWorker shape vect_tc arr_tc arr_dc (orig_dc, vect_dc, dc_num) pre (dc
                                           ++ map Var args
                                           ++ empty_post
 
-buildPADict :: PAInstance -> VM [(Var, CoreExpr)]
-buildPADict (PAInstance {
-               painstDFun      = dfun
-             , painstVectTyCon = vect_tc
-             , painstArrTyCon  = arr_tc })
-  = polyAbstract (tyConTyVars arr_tc) $ \abstract ->
+buildPADict :: Shape -> TyCon -> TyCon -> Var -> VM CoreExpr
+buildPADict shape vect_tc arr_tc dfun
+  = polyAbstract tvs $ \abstract ->
     do
-      shape <- tyConShape vect_tc
       meth_binds <- mapM (mk_method shape) paMethods
       let meth_exprs = map (Var . fst) meth_binds
 
       pa_dc <- builtin paDataCon
       let dict = mkConApp pa_dc (Type (mkTyConApp vect_tc arg_tys) : meth_exprs)
           body = Let (Rec meth_binds) dict
-      return [(dfun, mkInlineMe $ abstract body)]
+      return . mkInlineMe $ abstract body
   where
     tvs = tyConTyVars arr_tc
     arg_tys = mkTyVarTys tvs