Make sure some TyCons always vectorise to themselves
[ghc-hetmet.git] / compiler / vectorise / VectBuiltIn.hs
index cea139d..19df7cc 100644 (file)
@@ -6,7 +6,7 @@
 -- for details
 
 module VectBuiltIn (
-  Builtins(..), sumTyCon, prodTyCon,
+  Builtins(..), sumTyCon, prodTyCon, combinePAVar,
   initBuiltins, initBuiltinTyCons, initBuiltinPAs, initBuiltinPRs,
 
   primMethod, primPArray
@@ -45,6 +45,9 @@ mAX_NDP_PROD = 3
 mAX_NDP_SUM :: Int
 mAX_NDP_SUM = 3
 
+mAX_NDP_COMBINE :: Int
+mAX_NDP_COMBINE = 2
+
 mkNDPModule :: FastString -> Module
 mkNDPModule m = mkModule ndpPackageId (mkModuleNameFS m)
 
@@ -62,6 +65,7 @@ data Builtins = Builtins {
                 , prTyCon          :: TyCon
                 , prDataCon        :: DataCon
                 , parrayIntPrimTyCon :: TyCon
+                , parrayBoolPrimTyCon :: TyCon
                 , voidTyCon        :: TyCon
                 , wrapTyCon        :: TyCon
                 , sumTyCons        :: Array Int TyCon
@@ -74,11 +78,13 @@ data Builtins = Builtins {
                 , applyClosurePVar :: Var
                 , replicatePAIntPrimVar :: Var
                 , upToPAIntPrimVar :: Var
+                , selectPAIntPrimVar :: Var
+                , truesPABoolPrimVar :: Var
                 , lengthPAVar      :: Var
                 , replicatePAVar   :: Var
                 , emptyPAVar       :: Var
-                -- , packPAVar        :: Var
-                -- , combinePAVar     :: Var
+                , packPAVar        :: Var
+                , combinePAVars    :: Array Int Var
                 , liftingContext   :: Var
                 }
 
@@ -93,6 +99,11 @@ prodTyCon n bi
   | n >= 0 && n <= mAX_NDP_PROD = tupleTyCon Boxed n
   | otherwise = pprPanic "prodTyCon" (ppr n)
 
+combinePAVar :: Int -> Builtins -> Var
+combinePAVar n bi
+  | n >= 2 && n <= mAX_NDP_COMBINE = combinePAVars bi ! n
+  | otherwise = pprPanic "combinePAVar" (ppr n)
+
 initBuiltins :: DsM Builtins
 initBuiltins
   = do
@@ -103,6 +114,7 @@ initBuiltins
       prTyCon      <- externalTyCon nDP_PARRAY FSLIT("PR")
       let [prDataCon] = tyConDataCons prTyCon
       parrayIntPrimTyCon <- externalTyCon nDP_PRIM FSLIT("PArray_Int#")
+      parrayBoolPrimTyCon <- externalTyCon nDP_PRIM FSLIT("PArray_Bool#")
       closureTyCon <- externalTyCon nDP_CLOSURE FSLIT(":->")
 
       voidTyCon    <- externalTyCon nDP_REPR FSLIT("Void")
@@ -120,11 +132,17 @@ initBuiltins
       applyClosurePVar <- externalVar nDP_CLOSURE FSLIT("$:^")
       replicatePAIntPrimVar <- externalVar nDP_PRIM FSLIT("replicatePA_Int#")
       upToPAIntPrimVar <- externalVar nDP_PRIM FSLIT("upToPA_Int#")
+      selectPAIntPrimVar <- externalVar nDP_PRIM FSLIT("selectPA_Int#")
+      truesPABoolPrimVar <- externalVar nDP_PRIM FSLIT("truesPA_Bool#")
       lengthPAVar      <- externalVar nDP_PARRAY FSLIT("lengthPA")
       replicatePAVar   <- externalVar nDP_PARRAY FSLIT("replicatePA")
       emptyPAVar       <- externalVar nDP_PARRAY FSLIT("emptyPA")
-      -- packPAVar        <- dsLookupGlobalId packPAName
-      -- combinePAVar     <- dsLookupGlobalId combinePAName
+      packPAVar        <- externalVar nDP_PARRAY FSLIT("packPA")
+
+      combines <- mapM (externalVar nDP_PARRAY)
+                       [mkFastString ("combine" ++ show i ++ "PA")
+                          | i <- [2..mAX_NDP_COMBINE]]
+      let combinePAVars = listArray (2, mAX_NDP_COMBINE) combines
 
       liftingContext <- liftM (\u -> mkSysLocal FSLIT("lc") u intPrimTy)
                               newUnique
@@ -137,6 +155,7 @@ initBuiltins
                , prTyCon          = prTyCon
                , prDataCon        = prDataCon
                , parrayIntPrimTyCon = parrayIntPrimTyCon
+               , parrayBoolPrimTyCon = parrayBoolPrimTyCon
                , voidTyCon        = voidTyCon
                , wrapTyCon        = wrapTyCon
                , sumTyCons        = sumTyCons
@@ -149,16 +168,22 @@ initBuiltins
                , applyClosurePVar = applyClosurePVar
                , replicatePAIntPrimVar = replicatePAIntPrimVar
                , upToPAIntPrimVar = upToPAIntPrimVar
+               , selectPAIntPrimVar = selectPAIntPrimVar
+               , truesPABoolPrimVar = truesPABoolPrimVar
                , lengthPAVar      = lengthPAVar
                , replicatePAVar   = replicatePAVar
                , emptyPAVar       = emptyPAVar
-               -- , packPAVar        = packPAVar
-               -- , combinePAVar     = combinePAVar
+               , packPAVar        = packPAVar
+               , combinePAVars    = combinePAVars
                , liftingContext   = liftingContext
                }
 
 initBuiltinTyCons :: Builtins -> [(Name, TyCon)]
-initBuiltinTyCons bi = [(tyConName funTyCon, closureTyCon bi)]
+initBuiltinTyCons bi = (tyConName funTyCon, closureTyCon bi)
+                     : [(tyConName tc, tc) | tc <- defaultTyCons]
+
+defaultTyCons :: [TyCon]
+defaultTyCons = [intTyCon]
 
 initBuiltinDicts :: [(Name, Module, FastString)] -> DsM [(Name, Var)]
 initBuiltinDicts ps