Simplify handling of variables during vectorisation
[ghc-hetmet.git] / compiler / vectorise / VectMonad.hs
index 09e2d2f..d3512d1 100644 (file)
@@ -3,9 +3,9 @@ module VectMonad (
   VM,
 
   noV, tryV, maybeV, orElseV, fixV, localV, closedV, initV,
-  cloneName, newLocalVar, newTyVar,
+  cloneName, newExportedVar, newLocalVar, newDummyVar, newTyVar,
   
-  Builtins(..), paDictTyCon,
+  Builtins(..), paDictTyCon, paDictDataCon,
   builtin,
 
   GlobalEnv(..),
@@ -47,6 +47,7 @@ import FamInstEnv
 import Panic
 import Outputable
 import FastString
+import SrcLoc        ( noSrcSpan )
 
 import Control.Monad ( liftM )
 
@@ -65,11 +66,15 @@ data Builtins = Builtins {
                 , applyClosurePVar :: Var
                 , lengthPAVar      :: Var
                 , replicatePAVar   :: Var
+                , emptyPAVar       :: Var
                 }
 
 paDictTyCon :: Builtins -> TyCon
 paDictTyCon = classTyCon . paClass
 
+paDictDataCon :: Builtins -> DataCon
+paDictDataCon = classDataCon . paClass
+
 initBuiltins :: DsM Builtins
 initBuiltins
   = do
@@ -83,6 +88,7 @@ initBuiltins
       applyClosurePVar <- dsLookupGlobalId applyClosurePName
       lengthPAVar      <- dsLookupGlobalId lengthPAName
       replicatePAVar   <- dsLookupGlobalId replicatePAName
+      emptyPAVar       <- dsLookupGlobalId emptyPAName
 
       return $ Builtins {
                  parrayTyCon      = parrayTyCon
@@ -94,12 +100,13 @@ initBuiltins
                , applyClosurePVar = applyClosurePVar
                , lengthPAVar      = lengthPAVar
                , replicatePAVar   = replicatePAVar
+               , emptyPAVar       = emptyPAVar
                }
 
 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
                   --
@@ -133,7 +140,7 @@ data LocalEnv = LocalEnv {
                  -- Mapping from local variables to their vectorised and
                  -- lifted versions
                  --
-                 local_vars :: VarEnv (CoreExpr, CoreExpr)
+                 local_vars :: VarEnv (Var, Var)
 
                  -- In-scope type variables
                  --
@@ -147,7 +154,7 @@ data LocalEnv = LocalEnv {
 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)
@@ -274,12 +281,25 @@ cloneName mk_occ name = liftM make (liftDs newUnique)
                                                     (nameSrcSpan name)
            | otherwise           = mkSystemName u occ_name
 
+newExportedVar :: OccName -> Type -> VM Var
+newExportedVar occ_name ty 
+  = do
+      mod <- liftDs getModuleDs
+      u   <- liftDs newUnique
+
+      let name = mkExternalName u mod occ_name noSrcSpan
+      
+      return $ Id.mkExportedLocalId name ty
+
 newLocalVar :: FastString -> Type -> VM Var
 newLocalVar fs ty
   = do
       u <- liftDs newUnique
       return $ mkSysLocal fs u ty
 
+newDummyVar :: Type -> VM Var
+newDummyVar = newLocalVar FSLIT("ds")
+
 newTyVar :: FastString -> Kind -> VM Var
 newTyVar fs k
   = do
@@ -288,14 +308,14 @@ newTyVar fs k
 
 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
 
-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