#include "HsVersions.h"
import {-# SOURCE #-} TcIface( tcIfaceDecl, tcIfaceRules, tcIfaceInst,
- tcIfaceFamInst )
+ tcIfaceFamInst, tcIfaceVectInfo )
import DynFlags
import IfaceSyn
; new_eps_insts <- mapM tcIfaceInst (mi_insts iface)
; new_eps_fam_insts <- mapM tcIfaceFamInst (mi_fam_insts iface)
; new_eps_rules <- tcIfaceRules ignore_prags (mi_rules iface)
+ ; new_eps_vect_info <- tcIfaceVectInfo mod (mkNameEnv new_eps_decls)
+ (mi_vect_info iface)
; let { final_iface = iface {
mi_decls = panic "No mi_decls in PIT",
mi_fam_insts = panic "No mi_fam_insts in PIT",
mi_rules = panic "No mi_rules in PIT"
}
- ; new_eps_vect_info =
- VectInfo {
- vectInfoCCVar = mkNameSet
- (ifaceVectInfoCCVar . mi_vect_info $ iface)
- }
}
; updateEps_ $ \ eps ->
, vcat (map ppr (mi_insts iface))
, vcat (map ppr (mi_fam_insts iface))
, vcat (map ppr (mi_rules iface))
+ , pprVectInfo (mi_vect_info iface)
, pprDeprecs (mi_deprecs iface)
]
where
where
pprFix (occ,fix) = ppr fix <+> ppr occ
+pprVectInfo :: IfaceVectInfo -> SDoc
+pprVectInfo (IfaceVectInfo names) =
+ ptext SLIT("Closured converted:") <+> hsep (map ppr names)
+
pprDeprecs NoDeprecs = empty
pprDeprecs (DeprecAll txt) = ptext SLIT("Deprecate all") <+> doubleQuotes (ftext txt)
pprDeprecs (DeprecSome prs) = ptext SLIT("Deprecate") <+> vcat (map pprDeprec prs)
import HscTypes
import DynFlags
+import VarEnv
+import Var
import Name
import NameEnv
import NameSet
deliberatelyOmitted x = panic ("Deliberately omitted: " ++ x)
ifFamInstTcName = ifaceTyConName . ifFamInstTyCon
- flattenVectInfo (VectInfo ccVar) = IfaceVectInfo (nameSetToList ccVar)
+ flattenVectInfo (VectInfo ccVar) =
+ IfaceVectInfo [Var.varName v | (v, _) <- varEnvElts ccVar]
-----------------------------
writeIfaceFile :: DynFlags -> ModLocation -> ModIface -> IO ()
tcIfaceDecl :: GHC.Base.Bool -> IfaceSyn.IfaceDecl -> TcRnTypes.IfL TypeRep.TyThing
tcIfaceInst :: IfaceSyn.IfaceInst -> TcRnTypes.IfL InstEnv.Instance
tcIfaceRules :: GHC.Base.Bool -> [IfaceSyn.IfaceRule] -> TcRnTypes.IfL [CoreSyn.CoreRule]
+tcIfaceVectInfo :: Module.Module -> HscTypes.TypeEnv -> HscTypes.IfaceVectInfo -> TcRnTypes.IfL VectInfo
tcIfaceFamInst :: IfaceSyn.IfaceFamInst -> TcRnTypes.IfL FamInstEnv.FamInst
\begin{code}
module TcIface (
tcImportDecl, checkWiredInTyCon, tcHiBootIface, typecheckIface,
- tcIfaceDecl, tcIfaceInst, tcIfaceFamInst, tcIfaceRules, tcIfaceGlobal,
- tcExtCoreBindings
+ tcIfaceDecl, tcIfaceInst, tcIfaceFamInst, tcIfaceRules,
+ tcIfaceVectInfo, tcIfaceGlobal, tcExtCoreBindings
) where
#include "HsVersions.h"
import TysWiredIn
import Var ( TyVar )
import qualified Var
+import VarEnv
import Name
import NameEnv
-import NameSet
import OccName
import Module
import UniqFM
; rules <- tcIfaceRules ignore_prags (mi_rules iface)
-- Vectorisation information
- ; let vect_info = VectInfo
- (mkNameSet (ifaceVectInfoCCVar (mi_vect_info iface)))
+ ; vect_info <- tcIfaceVectInfo (mi_module iface) type_env
+ (mi_vect_info iface)
-- Exports
; exports <- ifaceExportNames (mi_exports iface)
%************************************************************************
%* *
+ Vectorisation information
+%* *
+%************************************************************************
+
+\begin{code}
+tcIfaceVectInfo :: Module -> TypeEnv -> IfaceVectInfo -> IfL VectInfo
+tcIfaceVectInfo mod typeEnv (IfaceVectInfo names)
+ = do { ccVars <- mapM ccMapping names
+ ; return $ VectInfo (mkVarEnv ccVars)
+ }
+ where
+ ccMapping name
+ = do { ccName <- lookupOrig mod (mkCloOcc (nameOccName name))
+ ; let { var = lookup name
+ ; ccVar = lookup ccName
+ }
+ ; return (var, (var, ccVar))
+ }
+ lookup name = case lookupTypeEnv typeEnv name of
+ Just (AnId var) -> var
+ Just _ ->
+ panic "TcIface.tcIfaceVectInfo: wrong TyThing"
+ Nothing ->
+ panic "TcIface.tcIfaceVectInfo: unknown name"
+\end{code}
+
+%************************************************************************
+%* *
Types
%* *
%************************************************************************
import InstEnv ( Instance )
import FamInstEnv ( FamInst )
import CoreSyn ( CoreRule )
+import HscTypes ( TypeEnv, VectInfo, IfaceVectInfo )
+import Module ( Module )
tcIfaceDecl :: Bool -> IfaceDecl -> IfL TyThing
tcIfaceRules :: Bool -> [IfaceRule] -> IfL [CoreRule]
+tcIfaceVectInfo:: Module -> TypeEnv -> IfaceVectInfo -> IfL VectInfo
tcIfaceInst :: IfaceInst -> IfL Instance
tcIfaceFamInst :: IfaceFamInst -> IfL FamInst
\end{code}
import FamInstEnv ( FamInstEnv, FamInst )
import Rules ( RuleBase )
import CoreSyn ( CoreBind )
+import VarEnv
import VarSet
+import Var
import Id
import Type ( TyThing(..) )
subsystem. It communicates the vectorisation status of declarations from one
module to another.
+Why do we need both f and f_CC in the ModGuts/ModDetails/EPS version VectInfo
+below? We need to know `f' when converting to IfaceVectInfo. However, during
+closure conversion, we need to know `f_CC', whose `Var' we cannot lookup based
+on just the OccName easily in a Core pass.
+
\begin{code}
--- ModGuts version
-data VectInfo = VectInfo {
- vectInfoCCVar :: NameSet
- }
+-- ModGuts/ModDetails/EPS version
+data VectInfo
+ = VectInfo {
+ vectInfoCCVar :: VarEnv (Var, Var) -- (f, f_CC) keyed on f
+ -- always tidy, even in ModGuts
+ }
-- ModIface version
-data IfaceVectInfo = IfaceVectInfo {
- ifaceVectInfoCCVar :: [Name]
- }
+data IfaceVectInfo
+ = IfaceVectInfo {
+ ifaceVectInfoCCVar :: [Name] -- all variables in here have
+ -- a closure-converted variant
+ -- the name of the CC'ed variant
+ -- is determined by `mkCloOcc'
+ }
noVectInfo :: VectInfo
-noVectInfo = VectInfo emptyNameSet
+noVectInfo = VectInfo emptyVarEnv
plusVectInfo :: VectInfo -> VectInfo -> VectInfo
plusVectInfo vi1 vi2 =
- VectInfo (vectInfoCCVar vi1 `unionNameSets` vectInfoCCVar vi2)
+ VectInfo (vectInfoCCVar vi1 `plusVarEnv` vectInfoCCVar vi2)
noIfaceVectInfo :: IfaceVectInfo
noIfaceVectInfo = IfaceVectInfo []
localiseName, isExternalName, nameSrcLoc,
isWiredInName, getName
)
-import NameSet ( NameSet, elemNameSet, filterNameSet )
+import NameSet ( NameSet, elemNameSet )
import IfaceEnv ( allocateGlobalBinder )
import NameEnv ( filterNameEnv, mapNameEnv )
import OccName ( TidyOccEnv, initTidyOccEnv, tidyOccName )
; implicit_binds = getImplicitBinds type_env
; all_tidy_binds = implicit_binds ++ tidy_binds
; alg_tycons = filter isAlgTyCon (typeEnvTyCons type_env)
-
- ; tidy_vect_info = VectInfo
- (filterNameSet (isElemId type_env)
- (vectInfoCCVar vect_info))
- -- filter against `type_env', not `tidy_type_env', as we must
- -- keep all implicit names
}
; endPass dflags "Tidy Core" Opt_D_dump_simpl all_tidy_binds
md_fam_insts = fam_insts,
md_exports = exports,
md_modBreaks = modBreaks,
- md_vect_info = tidy_vect_info
+ md_vect_info = vect_info -- is already tidy
})
}
Just (AnId dfun_id') -> dfun_id'
other -> pprPanic "lookup_dfun" (ppr dfun_id)
-isElemId type_env name
- = case lookupTypeEnv type_env name of
- Just (AnId _) -> True
- _ -> False
-
tidyTypeEnv :: Bool -> NameSet -> TypeEnv -> [CoreBind] -> TypeEnv
-- The competed type environment is gotten from