-module VectType ( vectTyCon, vectType )
+module VectType ( vectTyCon, vectType, vectTypeEnv )
where
#include "HsVersions.h"
import VectMonad
import VectUtils
+import HscTypes ( TypeEnv, extendTypeEnvList, typeEnvTyCons )
import DataCon
import TyCon
import Type
import OccName
import MkId
import BasicTypes ( StrictnessMark(..), boolToRecFlag )
+import NameEnv
+import Unique
import UniqFM
import UniqSet
import Digraph ( SCC(..), stronglyConnComp )
type TyConGroup = ([TyCon], UniqSet TyCon)
+vectTypeEnv :: TypeEnv -> VM TypeEnv
+vectTypeEnv env
+ = do
+ cs <- readGEnv $ mk_map . global_tycons
+ let (conv_tcs, keep_tcs) = classifyTyCons cs groups
+ keep_dcs = concatMap tyConDataCons keep_tcs
+ zipWithM_ defTyCon keep_tcs keep_tcs
+ zipWithM_ defDataCon keep_dcs keep_dcs
+ new_tcs <- vectTyConDecls conv_tcs
+ return $ extendTypeEnvList env
+ (map ATyCon new_tcs ++ [ADataCon dc | tc <- new_tcs
+ , dc <- tyConDataCons tc])
+ where
+ tycons = typeEnvTyCons env
+ groups = tyConGroups tycons
+
+ mk_map env = listToUFM_Directly [(u, getUnique n /= u) | (u,n) <- nameEnvUniqueElts env]
+
+ keep_tc tc = let dcs = tyConDataCons tc
+ in
+ defTyCon tc tc >> zipWithM_ defDataCon dcs dcs
+
+
vectTyConDecls :: [TyCon] -> VM [TyCon]
vectTyConDecls tcs = fixV $ \tcs' ->
do
tyConsOfType ty
| Just ty' <- coreView ty = tyConsOfType ty'
tyConsOfType (TyVarTy v) = emptyUniqSet
-tyConsOfType (TyConApp tc tys) = tyConsOfTypes tys `addOneToUniqSet` tc
+tyConsOfType (TyConApp tc tys) = extend (tyConsOfTypes tys)
+ where
+ extend | isUnLiftedTyCon tc
+ || isTupleTyCon tc = id
+
+ | otherwise = (`addOneToUniqSet` tc)
+
tyConsOfType (AppTy a b) = tyConsOfType a `unionUniqSets` tyConsOfType b
tyConsOfType (FunTy a b) = (tyConsOfType a `unionUniqSets` tyConsOfType b)
`addOneToUniqSet` funTyCon