- parrayTyCon <- dsLookupTyCon parrayTyConName
- paTyCon <- dsLookupTyCon paTyConName
- closureTyCon <- dsLookupTyCon closureTyConName
-
- mkClosureVar <- dsLookupGlobalId mkClosureName
- applyClosureVar <- dsLookupGlobalId applyClosureName
- mkClosurePVar <- dsLookupGlobalId mkClosurePName
- applyClosurePVar <- dsLookupGlobalId applyClosurePName
- closurePAVar <- dsLookupGlobalId closurePAName
- lengthPAVar <- dsLookupGlobalId lengthPAName
- replicatePAVar <- dsLookupGlobalId replicatePAName
-
- return $ Builtins {
- parrayTyCon = parrayTyCon
- , paTyCon = paTyCon
- , closureTyCon = closureTyCon
- , mkClosureVar = mkClosureVar
- , applyClosureVar = applyClosureVar
- , mkClosurePVar = mkClosurePVar
- , applyClosurePVar = applyClosurePVar
- , closurePAVar = closurePAVar
- , lengthPAVar = lengthPAVar
- , replicatePAVar = replicatePAVar
- }
-
-data GlobalEnv = GlobalEnv {
- -- Mapping from global variables to their vectorised versions.
- --
- global_vars :: VarEnv CoreExpr
-
- -- Exported variables which have a vectorised version
- --
- , global_exported_vars :: VarEnv (Var, Var)
-
- -- Mapping from TyCons to their vectorised versions.
- -- TyCons which do not have to be vectorised are mapped to
- -- themselves.
- --
- , global_tycons :: NameEnv TyCon
-
- -- Mapping from TyCons to their PA dictionaries
- --
- , global_tycon_pa :: NameEnv CoreExpr
- }
-
-data LocalEnv = LocalEnv {
- -- Mapping from local variables to their vectorised and
- -- lifted versions
- --
- local_vars :: VarEnv (CoreExpr, CoreExpr)
-
- -- Mapping from tyvars to their PA dictionaries
- , local_tyvar_pa :: VarEnv CoreExpr
- }
-
-
-initGlobalEnv :: VectInfo -> GlobalEnv
-initGlobalEnv info
- = GlobalEnv {
- global_vars = mapVarEnv (Var . snd) $ vectInfoCCVar info
- , global_exported_vars = emptyVarEnv
- , global_tycons = mapNameEnv snd $ vectInfoCCTyCon info
- , global_tycon_pa = emptyNameEnv
- }
-
-emptyLocalEnv = LocalEnv {
- local_vars = emptyVarEnv
- , local_tyvar_pa = emptyVarEnv
- }
-
--- FIXME
-updVectInfo :: GlobalEnv -> ModGuts -> ModGuts
-updVectInfo env guts = guts { mg_vect_info = info' }
+ var' <- vectTopBinder var
+ expr' <- vectTopRhs var expr
+ hs <- takeHoisted
+ cexpr <- tryConvert var var' expr
+ return . Rec $ (var, cexpr) : (var', expr') : hs
+ `orElseV`
+ return b
+
+vectTopBind b@(Rec bs)
+ = do
+ vars' <- mapM vectTopBinder vars
+ exprs' <- zipWithM vectTopRhs vars exprs
+ hs <- takeHoisted
+ cexprs <- sequence $ zipWith3 tryConvert vars vars' exprs
+ return . Rec $ zip vars cexprs ++ zip vars' exprs' ++ hs
+ `orElseV`
+ return b