1 module Vectorise( vectorise )
4 #include "HsVersions.h"
9 import CoreLint ( showPass, endPass )
21 vectorise :: HscEnv -> ModGuts -> IO ModGuts
22 vectorise hsc_env guts
23 | not (Opt_Vectorise `dopt` dflags) = return guts
26 showPass dflags "Vectorisation"
28 let info = hptVectInfo hsc_env `plusVectInfo` eps_vect_info eps
29 Just guts' <- initDs hsc_env (mg_module guts)
32 (vectoriseModule info guts)
33 endPass dflags "Vectorisation" Opt_D_dump_vect (mg_binds guts')
36 dflags = hsc_dflags hsc_env
38 -- ----------------------------------------------------------------------------
39 -- Vectorisation monad
41 data Builtins = Builtins {
44 , closureTyCon :: TyCon
46 , applyClosureVar :: Var
47 , mkClosurePVar :: Var
48 , applyClosurePVar :: Var
51 , replicatePAVar :: Var
54 initBuiltins :: DsM Builtins
57 parrayTyCon <- dsLookupTyCon parrayTyConName
58 paTyCon <- dsLookupTyCon paTyConName
59 closureTyCon <- dsLookupTyCon closureTyConName
61 mkClosureVar <- dsLookupGlobalId mkClosureName
62 applyClosureVar <- dsLookupGlobalId applyClosureName
63 mkClosurePVar <- dsLookupGlobalId mkClosurePName
64 applyClosurePVar <- dsLookupGlobalId applyClosurePName
65 closurePAVar <- dsLookupGlobalId closurePAName
66 lengthPAVar <- dsLookupGlobalId lengthPAName
67 replicatePAVar <- dsLookupGlobalId replicatePAName
70 parrayTyCon = parrayTyCon
72 , closureTyCon = closureTyCon
73 , mkClosureVar = mkClosureVar
74 , applyClosureVar = applyClosureVar
75 , mkClosurePVar = mkClosurePVar
76 , applyClosurePVar = applyClosurePVar
77 , closurePAVar = closurePAVar
78 , lengthPAVar = lengthPAVar
79 , replicatePAVar = replicatePAVar
83 -- Mapping from variables to their vectorised versions
85 vect_vars :: VarEnv Var
87 -- Exported variables which have a vectorised version
89 , vect_exported_vars :: VarEnv (Var, Var)
91 -- Mapping from TyCons to their vectorised versions.
92 -- TyCons which do not have to be vectorised are mapped to
94 , vect_tycons :: NameEnv TyCon
97 initVEnv :: VectInfo -> DsM VEnv
100 vect_vars = mapVarEnv snd $ vectInfoCCVar info
101 , vect_exported_vars = emptyVarEnv
102 , vect_tycons = mapNameEnv snd $ vectInfoCCTyCon info
106 updVectInfo :: VEnv -> ModGuts -> ModGuts
107 updVectInfo env guts = guts { mg_vect_info = info' }
110 vectInfoCCVar = vect_exported_vars env
111 , vectInfoCCTyCon = tc_env
114 info = mg_vect_info guts
115 tyenv = mg_types guts
117 tc_env = mkNameEnv [(tc_name, (tc,tc')) | tc <- typeEnvTyCons tyenv
118 , let tc_name = tyConName tc
119 , Just tc' <- [lookupNameEnv (vect_tycons env) tc_name]]
121 newtype VM a = VM { runVM :: Builtins -> VEnv -> DsM (VEnv, a) }
123 instance Monad VM where
124 return x = VM $ \bi env -> return (env, x)
125 VM p >>= f = VM $ \bi env -> do
126 (env', x) <- p bi env
129 builtin :: (Builtins -> a) -> VM a
130 builtin f = VM $ \bi env -> return (env, f bi)
132 readEnv :: (VEnv -> a) -> VM a
133 readEnv f = VM $ \bi env -> return (env, f env)
135 setEnv :: VEnv -> VM ()
136 setEnv env = VM $ \_ _ -> return (env, ())
138 updEnv :: (VEnv -> VEnv) -> VM ()
139 updEnv f = VM $ \_ env -> return (f env, ())
142 lookupTyCon :: TyCon -> VM (Maybe TyCon)
143 lookupTyCon tc = readEnv $ \env -> lookupNameEnv (vect_tycons env) (tyConName tc)
145 -- ----------------------------------------------------------------------------
148 vectoriseModule :: VectInfo -> ModGuts -> DsM ModGuts
149 vectoriseModule info guts
151 builtins <- initBuiltins
153 (env', guts') <- runVM (vectModule guts) builtins env
154 return $ updVectInfo env' guts'
156 vectModule :: ModGuts -> VM ModGuts
157 vectModule guts = return guts