X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;ds=sidebyside;f=ghc%2Fcompiler%2FsimplCore%2FSimplCore.lhs;h=d8092261310941faabccc6fa33026b17fc47fb22;hb=eb7cfcccba82aee33a8cd3a8b73351a055438cfa;hp=e21e0f0ae666ffea9d13f65c1fb2152cb4949499;hpb=996573cd62a9dab5b3a7f7ab85567507422601bb;p=ghc-hetmet.git diff --git a/ghc/compiler/simplCore/SimplCore.lhs b/ghc/compiler/simplCore/SimplCore.lhs index e21e0f0..d809226 100644 --- a/ghc/compiler/simplCore/SimplCore.lhs +++ b/ghc/compiler/simplCore/SimplCore.lhs @@ -33,9 +33,9 @@ import FiniteMap ( FiniteMap, emptyFM ) import FloatIn ( floatInwards ) import FloatOut ( floatOutwards ) import FoldrBuildWW ( mkFoldrBuildWW ) -import Id ( mkSysLocal, mkUserId, setIdVisibility, replaceIdInfo, - replacePragmaInfo, getIdDemandInfo, idType, - getIdInfo, getPragmaInfo, mkIdWithNewUniq, +import MkId ( mkSysLocal, mkUserId ) +import Id ( setIdVisibility, getIdSpecialisation, setIdSpecialisation, + getIdDemandInfo, idType, nullIdEnv, addOneToIdEnv, delOneFromIdEnv, lookupIdEnv, IdEnv, Id @@ -57,16 +57,14 @@ import TysWiredIn ( stringTy, isIntegerTy ) import LiberateCase ( liberateCase ) import MagicUFs ( MagicUnfoldingFun ) import PprCore -import PprType ( GenType{-instance Outputable-}, GenTyVar{-ditto-}, - nmbrType - ) +import PprType ( nmbrType ) import SAT ( doStaticArgs ) import SimplMonad ( zeroSimplCount, showSimplCount, SimplCount ) import SimplPgm ( simplifyPgm ) import Specialise -import SpecUtils ( pprSpecErrs ) +import SpecEnv ( substSpecEnv, isEmptySpecEnv ) import StrictAnal ( saWwTopBinds ) -import TyVar ( TyVar, nameTyVar ) +import TyVar ( TyVar, nameTyVar, emptyTyVarEnv ) import Unique ( Unique{-instance Eq-}, Uniquable(..), integerTyConKey, ratioTyConKey, mkUnique, incrUnique, @@ -75,7 +73,7 @@ import Unique ( Unique{-instance Eq-}, Uniquable(..), import UniqSupply ( UniqSupply, mkSplitUniqSupply, splitUniqSupply, getUnique ) -import UniqFM ( UniqFM, lookupUFM, addToUFM ) +import UniqFM ( UniqFM, lookupUFM, addToUFM, delFromUFM ) import Util ( mapAccumL ) import SrcLoc ( noSrcLoc ) import Constants ( tARGET_MIN_INT, tARGET_MAX_INT ) @@ -391,14 +389,15 @@ tidyCoreExpr (Let (Rec pairs) body) where (bndrs, rhss) = unzip pairs -tidyCoreExpr (SCC cc body) +tidyCoreExpr (Note (Coerce to_ty from_ty) body) = tidyCoreExprEta body `thenTM` \ body' -> - returnTM (SCC cc body') + tidyTy to_ty `thenTM` \ to_ty' -> + tidyTy from_ty `thenTM` \ from_ty' -> + returnTM (Note (Coerce to_ty' from_ty') body') -tidyCoreExpr (Coerce coercion ty body) +tidyCoreExpr (Note note body) = tidyCoreExprEta body `thenTM` \ body' -> - tidyTy ty `thenTM` \ ty' -> - returnTM (Coerce coercion ty' body') + returnTM (Note note body') -- Wierd case for par, seq, fork etc. See notes above. tidyCoreExpr (Case scrut@(Prim op args) (PrimAlts _ (BindDefault binder rhs))) @@ -610,23 +609,49 @@ mapTM f (x:xs) = f x `thenTM` \ r -> \begin{code} -- Need to extend the environment when we munge a binder, so that occurrences --- of the binder will print the correct way (i.e. as a global not a local) +-- of the binder will print the correct way (e.g. as a global not a local) mungeTopBinder :: Id -> (Id -> TopTidyM a) -> TopTidyM a mungeTopBinder id thing_inside mod env us - = case lookupIdEnv env id of - Just (ValBinder global) -> thing_inside global mod env us -- Already bound - - other -> -- Give it a new print-name unless it's an exported thing - -- setNameVisibility also does the local/global thing - let - (id', us') | isExported id = (id, us) - | otherwise - = (setIdVisibility (Just mod) us id, - incrUnique us) - - new_env = addToUFM env id (ValBinder id') - in - thing_inside id' mod new_env us' + = -- Give it a new print-name unless it's an exported thing + -- setNameVisibility also does the local/global thing + let + (id1, us') | isExported id = (id, us) + | otherwise + = (setIdVisibility (Just mod) us id, + incrUnique us) + + -- Tidy the Id's SpecEnv + spec_env = getIdSpecialisation id + id2 | isEmptySpecEnv spec_env = id1 + | otherwise = setIdSpecialisation id1 (tidySpecEnv env spec_env) + + new_env = addToUFM env id (ValBinder id2) + in + thing_inside id2 mod new_env us' + +tidySpecEnv env spec_env + = substSpecEnv + emptyTyVarEnv -- Top level only + (tidy_spec_rhs env) + spec_env + where + -- tidy_spec_rhs is another horrid little hacked-up function for + -- the RHS of specialisation templates. + -- It assumes there is no type substitution. + -- + -- See also SimplVar.substSpecEnvRhs Urgh + tidy_spec_rhs env (Var v) = case lookupUFM env v of + Just (ValBinder v') -> Var v' + Nothing -> Var v + tidy_spec_rhs env (App f (VarArg v)) = App (tidy_spec_rhs env f) (case lookupUFM env v of + Just (ValBinder v') -> VarArg v' + Nothing -> VarArg v) + tidy_spec_rhs env (App f arg) = App (tidy_spec_rhs env f) arg + tidy_spec_rhs env (Lam b e) = Lam b (tidy_spec_rhs env' e) + where + env' = case b of + ValBinder id -> delFromUFM env id + TyBinder _ -> env mungeTopBinders [] k = k [] mungeTopBinders (b:bs) k = mungeTopBinder b $ \ b' ->