X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=blobdiff_plain;f=compiler%2FcoreSyn%2FCorePrep.lhs;h=88fa8b7612901a6f98229e9732955afc91e0c51b;hp=c8f35ea32289b4a7824d7e6da393f6fbbf476f29;hb=8100cd4395e46ae747be4298c181a4730d6206bc;hpb=f94350a049d2a1c2b2f1aa25c62dfe20a541c049 diff --git a/compiler/coreSyn/CorePrep.lhs b/compiler/coreSyn/CorePrep.lhs index c8f35ea..88fa8b7 100644 --- a/compiler/coreSyn/CorePrep.lhs +++ b/compiler/coreSyn/CorePrep.lhs @@ -1,7 +1,8 @@ % -% (c) The University of Glasgow, 1994-2000 +% (c) The University of Glasgow, 1994-2006 % -\section{Core pass to saturate constructors and PrimOps} + +Core pass to saturate constructors and PrimOps \begin{code} module CorePrep ( @@ -10,34 +11,32 @@ module CorePrep ( #include "HsVersions.h" -import CoreUtils( exprType, exprIsHNF, etaExpand, exprArity, exprOkForSpeculation ) -import CoreFVs ( exprFreeVars ) -import CoreLint ( endPass ) +import CoreUtils hiding (exprIsTrivial) +import CoreFVs +import CoreLint import CoreSyn -import Type ( Type, applyTy, - splitFunTy_maybe, isUnLiftedType, isUnboxedTupleType, seqType ) -import Coercion ( coercionKind ) -import TyCon ( TyCon, tyConDataCons ) -import NewDemand ( Demand, isStrictDmd, lazyDmd, StrictSig(..), DmdType(..) ) -import Var ( Var, Id, setVarUnique ) +import Type +import Coercion +import TyCon +import NewDemand +import Var import VarSet import VarEnv -import Id ( mkSysLocal, idType, idNewDemandInfo, idArity, setIdUnfolding, - isFCallId, isGlobalId, isLocalId, hasNoBinding, idNewStrictness, - isPrimOpId_maybe - ) -import DataCon ( dataConWorkId ) -import PrimOp ( PrimOp( DataToTagOp ) ) -import BasicTypes ( TopLevelFlag(..), isTopLevel, isNotTopLevel, - RecFlag(..), isNonRec - ) +import Id +import IdInfo +import DataCon +import PrimOp +import BasicTypes import UniqSupply import Maybes import OrdList import ErrUtils import DynFlags -import Util ( listLengthCmp ) +import Util import Outputable +import TysWiredIn +import MkId +import TysPrim \end{code} -- --------------------------------------------------------------------------- @@ -385,6 +384,36 @@ corePrepExprFloat env (Note n@(SCC _) expr) deLamFloat expr1 `thenUs` \ (floats, expr2) -> returnUs (floats, Note n expr2) +corePrepExprFloat env (Case (Var id) bndr ty [(DEFAULT,[],expr)]) + | Just (TickBox {}) <- isTickBoxOp_maybe id + = corePrepAnExpr env expr `thenUs` \ expr1 -> + deLamFloat expr1 `thenUs` \ (floats, expr2) -> + return (floats, Case (Var id) bndr ty [(DEFAULT,[],expr2)]) + +-- Translate Binary tickBox into standard tickBox +corePrepExprFloat env (App (Var id) expr) + | Just (BinaryTickBox m t e) <- isTickBoxOp_maybe id + = corePrepAnExpr env expr `thenUs` \ expr1 -> + deLamFloat expr1 `thenUs` \ (floats, expr2) -> + getUniqueUs `thenUs` \ u1 -> + getUniqueUs `thenUs` \ u2 -> + getUniqueUs `thenUs` \ u3 -> + getUniqueUs `thenUs` \ u4 -> + getUniqueUs `thenUs` \ u5 -> + let bndr1 = mkSysLocal FSLIT("t1") u1 boolTy in + let bndr2 = mkSysLocal FSLIT("t2") u2 realWorldStatePrimTy in + let bndr3 = mkSysLocal FSLIT("t3") u3 realWorldStatePrimTy in + let tick_e = mkTickBoxOpId u4 m e in + let tick_t = mkTickBoxOpId u5 m t in + return (floats, Case expr2 + bndr1 + boolTy + [ (DataAlt falseDataCon, [], + Case (Var tick_e) bndr2 boolTy [(DEFAULT,[],Var falseDataConId)]) + , (DataAlt trueDataCon, [], + Case (Var tick_t) bndr3 boolTy [(DEFAULT,[],Var trueDataConId)]) + ]) + corePrepExprFloat env (Note other_note expr) = corePrepExprFloat env expr `thenUs` \ (floats, expr') -> returnUs (floats, Note other_note expr') @@ -400,6 +429,38 @@ corePrepExprFloat env expr@(Lam _ _) where (bndrs,body) = collectBinders expr +-- This is an (important) optimization. +-- case e of { T -> e1 ; F -> e2 } +-- ==> case e of { T -> e1 ; F -> e2 } +-- This could move into the simplifier. + +corePrepExprFloat env (Case (App (Var id) expr) bndr ty alts) + | Just (BinaryTickBox m t e) <- isTickBoxOp_maybe id + = getUniqueUs `thenUs` \ u1 -> + getUniqueUs `thenUs` \ u2 -> + getUniqueUs `thenUs` \ u3 -> + getUniqueUs `thenUs` \ u4 -> + getUniqueUs `thenUs` \ u5 -> + let bndr1 = mkSysLocal FSLIT("t1") u1 boolTy in + let bndr2 = mkSysLocal FSLIT("t2") u2 realWorldStatePrimTy in + let bndr3 = mkSysLocal FSLIT("t3") u3 realWorldStatePrimTy in + let tick_e = mkTickBoxOpId u4 m e in + let tick_t = mkTickBoxOpId u5 m t in + ASSERT (exprType expr `coreEqType` boolTy) + corePrepExprFloat env $ + Case expr + bndr1 + ty + [ (DataAlt falseDataCon, [], + Case (Var tick_e) bndr2 ty [(DEFAULT,[],falseBranch)]) + , (DataAlt trueDataCon, [], + Case (Var tick_t) bndr3 ty [(DEFAULT,[],trueBranch)]) + ] + + where + (_,_,trueBranch) = findAlt (DataAlt trueDataCon) alts + (_,_,falseBranch) = findAlt (DataAlt falseDataCon) alts + corePrepExprFloat env (Case scrut bndr ty alts) = corePrepExprFloat env scrut `thenUs` \ (floats1, scrut1) -> deLamFloat scrut1 `thenUs` \ (floats2, scrut2) ->