Fix vectorisation of nullary data constructors
[ghc-hetmet.git] / compiler / vectorise / VectBuiltIn.hs
1 module VectBuiltIn (
2   Builtins(..), sumTyCon, prodTyCon,
3   initBuiltins, initBuiltinTyCons, initBuiltinPAs, initBuiltinPRs,
4
5   primMethod, primPArray
6 ) where
7
8 #include "HsVersions.h"
9
10 import DsMonad
11 import IfaceEnv        ( lookupOrig )
12
13 import Module          ( Module )
14 import DataCon         ( DataCon )
15 import TyCon           ( TyCon, tyConName, tyConDataCons )
16 import Var             ( Var )
17 import Id              ( mkSysLocal )
18 import Name            ( Name, getOccString )
19 import NameEnv
20 import OccName
21
22 import TypeRep         ( funTyCon )
23 import Type            ( Type )
24 import TysPrim
25 import TysWiredIn      ( unitTyCon, tupleTyCon, intTyConName )
26 import PrelNames
27 import BasicTypes      ( Boxity(..) )
28
29 import FastString
30 import Outputable
31
32 import Data.Array
33 import Control.Monad   ( liftM, zipWithM )
34
35 mAX_NDP_PROD :: Int
36 mAX_NDP_PROD = 3
37
38 mAX_NDP_SUM :: Int
39 mAX_NDP_SUM = 3
40
41 data Builtins = Builtins {
42                   parrayTyCon      :: TyCon
43                 , paTyCon          :: TyCon
44                 , paDataCon        :: DataCon
45                 , preprTyCon       :: TyCon
46                 , prTyCon          :: TyCon
47                 , prDataCon        :: DataCon
48                 , parrayIntPrimTyCon :: TyCon
49                 , voidTyCon        :: TyCon
50                 , wrapTyCon        :: TyCon
51                 , sumTyCons        :: Array Int TyCon
52                 , closureTyCon     :: TyCon
53                 , voidVar          :: Var
54                 , mkPRVar          :: Var
55                 , mkClosureVar     :: Var
56                 , applyClosureVar  :: Var
57                 , mkClosurePVar    :: Var
58                 , applyClosurePVar :: Var
59                 , replicatePAIntPrimVar :: Var
60                 , upToPAIntPrimVar :: Var
61                 , lengthPAVar      :: Var
62                 , replicatePAVar   :: Var
63                 , emptyPAVar       :: Var
64                 -- , packPAVar        :: Var
65                 -- , combinePAVar     :: Var
66                 , liftingContext   :: Var
67                 }
68
69 sumTyCon :: Int -> Builtins -> TyCon
70 sumTyCon n bi
71   | n >= 2 && n <= mAX_NDP_SUM = sumTyCons bi ! n
72   | otherwise = pprPanic "sumTyCon" (ppr n)
73
74 prodTyCon :: Int -> Builtins -> TyCon
75 prodTyCon n bi
76   | n == 0                      = voidTyCon bi
77   | n == 1                      = wrapTyCon bi
78   | n >= 2 && n <= mAX_NDP_PROD = tupleTyCon Boxed n
79   | otherwise = pprPanic "prodTyCon" (ppr n)
80
81 initBuiltins :: DsM Builtins
82 initBuiltins
83   = do
84       parrayTyCon  <- dsLookupTyCon parrayTyConName
85       paTyCon      <- dsLookupTyCon paTyConName
86       let [paDataCon] = tyConDataCons paTyCon
87       preprTyCon   <- dsLookupTyCon preprTyConName
88       prTyCon      <- dsLookupTyCon prTyConName
89       let [prDataCon] = tyConDataCons prTyCon
90       parrayIntPrimTyCon <- dsLookupTyCon parrayIntPrimTyConName
91       closureTyCon <- dsLookupTyCon closureTyConName
92
93       voidTyCon    <- lookupExternalTyCon nDP_REPR FSLIT("Void")
94       wrapTyCon    <- lookupExternalTyCon nDP_REPR FSLIT("Wrap")
95       sum_tcs <- mapM (lookupExternalTyCon nDP_REPR)
96                       [mkFastString ("Sum" ++ show i) | i <- [2..mAX_NDP_SUM]]
97
98       let sumTyCons = listArray (2, mAX_NDP_SUM) sum_tcs
99
100       voidVar          <- lookupExternalVar nDP_REPR FSLIT("void")
101       mkPRVar          <- dsLookupGlobalId mkPRName
102       mkClosureVar     <- dsLookupGlobalId mkClosureName
103       applyClosureVar  <- dsLookupGlobalId applyClosureName
104       mkClosurePVar    <- dsLookupGlobalId mkClosurePName
105       applyClosurePVar <- dsLookupGlobalId applyClosurePName
106       replicatePAIntPrimVar <- dsLookupGlobalId replicatePAIntPrimName
107       upToPAIntPrimVar <- dsLookupGlobalId upToPAIntPrimName
108       lengthPAVar      <- dsLookupGlobalId lengthPAName
109       replicatePAVar   <- dsLookupGlobalId replicatePAName
110       emptyPAVar       <- dsLookupGlobalId emptyPAName
111       -- packPAVar        <- dsLookupGlobalId packPAName
112       -- combinePAVar     <- dsLookupGlobalId combinePAName
113
114       liftingContext <- liftM (\u -> mkSysLocal FSLIT("lc") u intPrimTy)
115                               newUnique
116
117       return $ Builtins {
118                  parrayTyCon      = parrayTyCon
119                , paTyCon          = paTyCon
120                , paDataCon        = paDataCon
121                , preprTyCon       = preprTyCon
122                , prTyCon          = prTyCon
123                , prDataCon        = prDataCon
124                , parrayIntPrimTyCon = parrayIntPrimTyCon
125                , voidTyCon        = voidTyCon
126                , wrapTyCon        = wrapTyCon
127                , sumTyCons        = sumTyCons
128                , closureTyCon     = closureTyCon
129                , voidVar          = voidVar
130                , mkPRVar          = mkPRVar
131                , mkClosureVar     = mkClosureVar
132                , applyClosureVar  = applyClosureVar
133                , mkClosurePVar    = mkClosurePVar
134                , applyClosurePVar = applyClosurePVar
135                , replicatePAIntPrimVar = replicatePAIntPrimVar
136                , upToPAIntPrimVar = upToPAIntPrimVar
137                , lengthPAVar      = lengthPAVar
138                , replicatePAVar   = replicatePAVar
139                , emptyPAVar       = emptyPAVar
140                -- , packPAVar        = packPAVar
141                -- , combinePAVar     = combinePAVar
142                , liftingContext   = liftingContext
143                }
144
145 initBuiltinTyCons :: DsM [(Name, TyCon)]
146 initBuiltinTyCons
147   = do
148       vects <- sequence vs
149       return (zip origs vects)
150   where
151     (origs, vs) = unzip builtinTyCons
152
153 builtinTyCons :: [(Name, DsM TyCon)]
154 builtinTyCons = [(tyConName funTyCon, dsLookupTyCon closureTyConName)]
155
156 initBuiltinDicts :: [(Name, Module, FastString)] -> DsM [(Name, Var)]
157 initBuiltinDicts ps
158   = do
159       dicts <- zipWithM lookupExternalVar mods fss
160       return $ zip tcs dicts
161   where
162     (tcs, mods, fss) = unzip3 ps
163
164 initBuiltinPAs = initBuiltinDicts . builtinPAs
165
166 builtinPAs :: Builtins -> [(Name, Module, FastString)]
167 builtinPAs bi
168   = [
169       mk closureTyConName  nDP_CLOSURE       FSLIT("dPA_Clo")
170     , mk (tyConName $ voidTyCon bi) nDP_REPR FSLIT("dPA_Void")
171     , mk unitTyConName     nDP_INSTANCES     FSLIT("dPA_Unit")
172
173     , mk intTyConName      nDP_INSTANCES FSLIT("dPA_Int")
174     ]
175     ++ tups
176   where
177     mk name mod fs = (name, mod, fs)
178
179     tups = map mk_tup [2..3]
180     mk_tup n = mk (tyConName $ tupleTyCon Boxed n)
181                   nDP_INSTANCES
182                   (mkFastString $ "dPA_" ++ show n)
183
184 initBuiltinPRs = initBuiltinDicts . builtinPRs
185
186 builtinPRs :: Builtins -> [(Name, Module, FastString)]
187 builtinPRs bi =
188   [
189     mk (tyConName unitTyCon) nDP_REPR      FSLIT("dPR_Unit")
190   , mk (tyConName $ voidTyCon bi) nDP_REPR FSLIT("dPR_Void")
191   , mk (tyConName $ wrapTyCon bi) nDP_REPR FSLIT("dPR_Wrap")
192   , mk closureTyConName      nDP_CLOSURE   FSLIT("dPR_Clo")
193
194     -- temporary
195   , mk intTyConName          nDP_INSTANCES FSLIT("dPR_Int")
196   ]
197
198   ++ map mk_sum  [2..mAX_NDP_SUM]
199   ++ map mk_prod [2..mAX_NDP_PROD]
200   where
201     mk name mod fs = (name, mod, fs)
202
203     mk_sum n = (tyConName $ sumTyCon n bi, nDP_REPR,
204                 mkFastString ("dPR_Sum" ++ show n))
205
206     mk_prod n = (tyConName $ prodTyCon n bi, nDP_REPR,
207                  mkFastString ("dPR_" ++ show n))
208
209 lookupExternalVar :: Module -> FastString -> DsM Var
210 lookupExternalVar mod fs
211   = dsLookupGlobalId =<< lookupOrig mod (mkVarOccFS fs)
212
213 lookupExternalTyCon :: Module -> FastString -> DsM TyCon
214 lookupExternalTyCon mod fs
215   = dsLookupTyCon =<< lookupOrig mod (mkOccNameFS tcName fs)
216
217 unitTyConName = tyConName unitTyCon
218
219
220 primMethod :: TyCon -> String -> DsM (Maybe Var)
221 primMethod tycon method
222   | Just suffix <- lookupNameEnv prim_ty_cons (tyConName tycon)
223   = liftM Just
224   $ dsLookupGlobalId =<< lookupOrig nDP_PRIM (mkVarOcc $ method ++ suffix)
225
226   | otherwise = return Nothing
227
228 primPArray :: TyCon -> DsM (Maybe TyCon)
229 primPArray tycon
230   | Just suffix <- lookupNameEnv prim_ty_cons (tyConName tycon)
231   = liftM Just
232   $ dsLookupTyCon =<< lookupOrig nDP_PRIM (mkOccName tcName $ "PArray" ++ suffix)
233
234   | otherwise = return Nothing
235
236 prim_ty_cons = mkNameEnv [mk_prim intPrimTyCon]
237   where
238     mk_prim tycon = (tyConName tycon, '_' : getOccString tycon)