Simplify handling of variables during vectorisation
authorRoman Leshchinskiy <rl@cse.unsw.edu.au>
Tue, 31 Jul 2007 06:09:17 +0000 (06:09 +0000)
committerRoman Leshchinskiy <rl@cse.unsw.edu.au>
Tue, 31 Jul 2007 06:09:17 +0000 (06:09 +0000)
compiler/vectorise/VectMonad.hs
compiler/vectorise/Vectorise.hs

index 0329af8..d3512d1 100644 (file)
@@ -106,7 +106,7 @@ initBuiltins
 data GlobalEnv = GlobalEnv {
                   -- Mapping from global variables to their vectorised versions.
                   -- 
 data GlobalEnv = GlobalEnv {
                   -- Mapping from global variables to their vectorised versions.
                   -- 
-                  global_vars :: VarEnv CoreExpr
+                  global_vars :: VarEnv Var
 
                   -- Exported variables which have a vectorised version
                   --
 
                   -- Exported variables which have a vectorised version
                   --
@@ -140,7 +140,7 @@ data LocalEnv = LocalEnv {
                  -- Mapping from local variables to their vectorised and
                  -- lifted versions
                  --
                  -- Mapping from local variables to their vectorised and
                  -- lifted versions
                  --
-                 local_vars :: VarEnv (CoreExpr, CoreExpr)
+                 local_vars :: VarEnv (Var, Var)
 
                  -- In-scope type variables
                  --
 
                  -- In-scope type variables
                  --
@@ -154,7 +154,7 @@ data LocalEnv = LocalEnv {
 initGlobalEnv :: VectInfo -> (InstEnv, InstEnv) -> FamInstEnvs -> Builtins -> GlobalEnv
 initGlobalEnv info instEnvs famInstEnvs bi
   = GlobalEnv {
 initGlobalEnv :: VectInfo -> (InstEnv, InstEnv) -> FamInstEnvs -> Builtins -> GlobalEnv
 initGlobalEnv info instEnvs famInstEnvs bi
   = GlobalEnv {
-      global_vars          = mapVarEnv  (Var . snd) $ vectInfoVar   info
+      global_vars          = mapVarEnv snd $ vectInfoVar info
     , global_exported_vars = emptyVarEnv
     , global_tycons        = extendNameEnv (mapNameEnv snd (vectInfoTyCon info))
                                            (tyConName funTyCon) (closureTyCon bi)
     , global_exported_vars = emptyVarEnv
     , global_tycons        = extendNameEnv (mapNameEnv snd (vectInfoTyCon info))
                                            (tyConName funTyCon) (closureTyCon bi)
@@ -308,14 +308,14 @@ newTyVar fs k
 
 defGlobalVar :: Var -> Var -> VM ()
 defGlobalVar v v' = updGEnv $ \env ->
 
 defGlobalVar :: Var -> Var -> VM ()
 defGlobalVar v v' = updGEnv $ \env ->
-  env { global_vars = extendVarEnv (global_vars env) v (Var v')
+  env { global_vars = extendVarEnv (global_vars env) v v'
       , global_exported_vars = upd (global_exported_vars env)
       }
   where
     upd env | isExportedId v = extendVarEnv env v (v, v')
             | otherwise      = env
 
       , global_exported_vars = upd (global_exported_vars env)
       }
   where
     upd env | isExportedId v = extendVarEnv env v (v, v')
             | otherwise      = env
 
-lookupVar :: Var -> VM (Scope CoreExpr (CoreExpr, CoreExpr))
+lookupVar :: Var -> VM (Scope Var (Var, Var))
 lookupVar v
   = do
       r <- readLEnv $ \env -> lookupVarEnv (local_vars env) v
 lookupVar v
   = do
       r <- readLEnv $ \env -> lookupVarEnv (local_vars env) v
index c73564c..83f0480 100644 (file)
@@ -122,7 +122,7 @@ vectBndr v
       updLEnv (mapTo vv lv)
       return (vv, lv)
   where
       updLEnv (mapTo vv lv)
       return (vv, lv)
   where
-    mapTo vv lv env = env { local_vars = extendVarEnv (local_vars env) v (Var vv, Var lv) }
+    mapTo vv lv env = env { local_vars = extendVarEnv (local_vars env) v (vv, lv) }
 
 vectBndrIn :: Var -> VM a -> VM (Var, Var, a)
 vectBndrIn v p
 
 vectBndrIn :: Var -> VM a -> VM (Var, Var, a)
 vectBndrIn v p
@@ -159,23 +159,24 @@ vectVar lc v
   = do
       r <- lookupVar v
       case r of
   = do
       r <- lookupVar v
       case r of
-        Local es     -> return es
-        Global vexpr -> do
-                          lexpr <- replicatePA vexpr lc
-                          return (vexpr, lexpr)
+        Local (vv,lv) -> return (Var vv, Var lv)
+        Global vv     -> do
+                           let vexpr = Var vv
+                           lexpr <- replicatePA vexpr lc
+                           return (vexpr, lexpr)
 
 vectPolyVar :: CoreExpr -> Var -> [Type] -> VM (CoreExpr, CoreExpr)
 vectPolyVar lc v tys
   = do
 
 vectPolyVar :: CoreExpr -> Var -> [Type] -> VM (CoreExpr, CoreExpr)
 vectPolyVar lc v tys
   = do
+      vtys <- mapM vectType tys
       r <- lookupVar v
       case r of
       r <- lookupVar v
       case r of
-        Local (vexpr, lexpr) -> liftM2 (,) (mk_app vexpr) (mk_app lexpr)
-        Global poly          -> do
-                                  vexpr <- mk_app poly
-                                  lexpr <- replicatePA vexpr lc
-                                  return (vexpr, lexpr)
-  where
-    mk_app e = polyApply e =<< mapM vectType tys
+        Local (vv, lv) -> liftM2 (,) (polyApply (Var vv) vtys)
+                                     (polyApply (Var lv) vtys)
+        Global poly    -> do
+                            vexpr <- polyApply (Var poly) vtys
+                            lexpr <- replicatePA vexpr lc
+                            return (vexpr, lexpr)
 
 vectPolyExpr :: CoreExpr -> CoreExprWithFVs -> VM (CoreExpr, CoreExpr)
 vectPolyExpr lc expr
 
 vectPolyExpr :: CoreExpr -> CoreExprWithFVs -> VM (CoreExpr, CoreExpr)
 vectPolyExpr lc expr
@@ -276,7 +277,6 @@ vectExpr lc (fvs, AnnLam bndr body)
                              `mkApps`   [pa_dict, mono_vfn, mono_lfn, lenv]
 
       return (vclo, lclo)
                              `mkApps`   [pa_dict, mono_vfn, mono_lfn, lenv]
 
       return (vclo, lclo)
-       
 
 data CEnvInfo = CEnvInfo {
                cenv_vars         :: [Var]
 
 data CEnvInfo = CEnvInfo {
                cenv_vars         :: [Var]
@@ -294,8 +294,8 @@ mkCEnvInfo fvs arg body
       locals <- readLEnv local_vars
       let
           (vars, vals) = unzip
       locals <- readLEnv local_vars
       let
           (vars, vals) = unzip
-                 [(var, val) | var      <- varSetElems fvs
-                             , Just val <- [lookupVarEnv locals var]]
+                 [(var, (Var v, Var v')) | var      <- varSetElems fvs
+                                         , Just (v,v') <- [lookupVarEnv locals var]]
       vtys <- mapM (vectType . varType) vars
 
       (vty, repr_tycon, repr_tyargs, repr_datacon) <- mk_env_ty vtys
       vtys <- mapM (vectType . varType) vars
 
       (vty, repr_tycon, repr_tyargs, repr_datacon) <- mk_env_ty vtys