Repository : ssh://darcs.haskell.org//srv/darcs/ghc On branch :
http://hackage.haskell.org/trac/ghc/changeset/028bb610d33b935e60c6846d031705578f08225b >--------------------------------------------------------------- commit 028bb610d33b935e60c6846d031705578f08225b Author: Max Bolingbroke <batterseapo...@hotmail.com> Date: Wed Aug 3 13:35:10 2011 +0100 Add coercionKindNonRepr to work around coercionKind bug >--------------------------------------------------------------- compiler/supercompile/Supercompile/Core/Syntax.hs | 31 ++++++++++++++++++- .../Supercompile/Evaluator/Evaluate.hs | 6 ++-- .../supercompile/Supercompile/Evaluator/Syntax.hs | 8 ++-- 3 files changed, 36 insertions(+), 9 deletions(-) diff --git a/compiler/supercompile/Supercompile/Core/Syntax.hs b/compiler/supercompile/Supercompile/Core/Syntax.hs index d8a1730..ad08f74 100644 --- a/compiler/supercompile/Supercompile/Core/Syntax.hs +++ b/compiler/supercompile/Supercompile/Core/Syntax.hs @@ -13,10 +13,12 @@ import Name (Name, nameOccName) import OccName (occNameString) import Id (Id) import Literal (Literal) -import Type (Type, mkTyVarTy) -import Coercion (CoVar, Coercion) +import Type (Type, mkTyVarTy, splitTyConApp_maybe, mkPredTy, mkEqPred) +import TysPrim (eqPredPrimTyCon) +import Coercion (CoVar, Coercion, coercionKind) import PrimOp (PrimOp) import PprCore () +import Pair -- NB: don't use GHC's pprBndr because its way too noisy, printing unfoldings etc @@ -289,3 +291,28 @@ freshFloatVars ids s es = reassociate $ mapAccumL (\ids -> associate . freshFloa where reassociate (ids, floats_xs) = let (mb_floats, xs) = unzip floats_xs in (ids, catMaybes mb_floats, xs) associate (ids, mb_float, x) = (ids, (mb_float, x)) -} + +-- OK, this is a bit bizarre. +-- +-- The coercion handling stuff in GHC sometimes rewrites an equality PredTy +-- into its representation using eqPredPrimTyCon. We might observe such a type +-- in one of the return types of the coercionKind. +-- +-- We CANNOT let this "representation" type reach the top level, e.g. be set +-- as the type of a variable. Reason: a variable with a type of ((~) ty1 ty2) +-- is NOT a CoVar is the sense of isCoVar +-- +-- Our (slightly hacky) solution is to try to undo this representation type +-- rubbish right here. TODO: perhaps I should do it for other PredTy as well? +--- +-- Simon says that the fact that things with ((~) ty1 ty2) types are not detected +-- as CoVars is actually a bug, and he will fix it. We need to keep this workaround +-- if we want to work on earlier GHCs (e.g. the GHC 7.2 RC). +coercionKindNonRepr :: Coercion -> Pair Type +coercionKindNonRepr co = Pair (repair from_ty) (repair to_ty) + where Pair from_ty to_ty = coercionKind co + repair ty | Just (tc, [ty1, ty2]) <- splitTyConApp_maybe ty + , tc == eqPredPrimTyCon + = mkPredTy (mkEqPred (ty1, ty2)) + | otherwise + = ty diff --git a/compiler/supercompile/Supercompile/Evaluator/Evaluate.hs b/compiler/supercompile/Supercompile/Evaluator/Evaluate.hs index fc9c898..406b274 100644 --- a/compiler/supercompile/Supercompile/Evaluator/Evaluate.hs +++ b/compiler/supercompile/Supercompile/Evaluator/Evaluate.hs @@ -221,7 +221,7 @@ step' normalising state = Just (co', tg_co) -> fmap (\deeds -> (deeds, Heap (M.insert y' (internallyBound (renamedTerm e_arg)) h) ids', Tagged tg_co (CastIt res_co') : k, (rn', e_body))) $ claimDeeds (deeds + answerSize' a) (annedSize e_arg + annedSize e_body) where (ids', rn', y') = renameNonRecBinder ids rn (x `setIdType` arg_co_from_ty') - Pair arg_co_from_ty' _arg_co_to_ty' = coercionKind arg_co' + Pair arg_co_from_ty' _arg_co_to_ty' = coercionKindNonRepr arg_co' [arg_co', res_co'] = decomposeCo 2 co' e_arg = annedTerm tg_co (annedTerm tg_v (Var x') `Cast` mkSymCo arg_co') @@ -271,7 +271,7 @@ step' normalising state = , Just res <- [do (deeds3, h', ids', rn_alts') <- case mb_dc_cos of Nothing -> return (deeds2, h1, ids, insertIdRenamings (insertCoercionSubsts rn_alts' (alt_qs `zip` cos')) (alt_xs `zip` xs')) Just dc_cos -> foldM (\(deeds, h, ids, rn_alts) (uncast_e_arg', alt_y, (dc_co, tg_co)) -> - let Pair _dc_co_from_ty' dc_co_to_ty' = coercionKind dc_co -- TODO: use to_tc_arg_tys' from above? + let Pair _dc_co_from_ty' dc_co_to_ty' = coercionKindNonRepr dc_co -- TODO: use to_tc_arg_tys' from above? (ids', rn_alts', y') = renameNonRecBinder ids rn_alts (alt_y `setIdType` dc_co_to_ty') e_arg = annedTerm tg_co $ annedTerm tg_v uncast_e_arg' `Cast` dc_co in fmap (\deeds' -> (deeds', M.insert y' (internallyBound (renamedTerm e_arg)) h, ids', rn_alts')) $ claimDeeds deeds (annedSize e_arg)) @@ -288,7 +288,7 @@ step' normalising state = | otherwise = Nothing where (mb_co_deref, (rn_v_deref, v_deref)) = dereference (Heap h0 ids) a - mb_co_deref_kind = fmap (\(co, tg_co) -> (co, tg_co, coercionKind co)) mb_co_deref + mb_co_deref_kind = fmap (\(co, tg_co) -> (co, tg_co, coercionKindNonRepr co)) mb_co_deref (deeds1, h1) | isDeadBinder wild' = (deeds0 + answerSize' a, h0) | otherwise = (deeds0, M.insert wild' wild_hb h0) where wild_hb = internallyBound $ annedAnswerToInAnnedTerm ids (annedAnswer tg_v a) diff --git a/compiler/supercompile/Supercompile/Evaluator/Syntax.hs b/compiler/supercompile/Supercompile/Evaluator/Syntax.hs index 4020466..ae6c4d3 100644 --- a/compiler/supercompile/Supercompile/Evaluator/Syntax.hs +++ b/compiler/supercompile/Supercompile/Evaluator/Syntax.hs @@ -19,7 +19,7 @@ import Type (applyTy, applyTys, mkForAllTy, mkFunTy, splitFunTy, eqType, isU import Pair (pSnd) import DataCon (dataConWorkId) import Literal (literalType) -import Coercion (coercionKind, coercionType) +import Coercion (coercionType) import qualified Data.Map as M @@ -241,7 +241,7 @@ stackFrameType kf hole_ty = case tagee kf of PrimApply pop tys in_as in_es -> ((primOpType pop `applyTys` tys) `applyFunTys` map answerType in_as) `applyFunTys` map (\in_e@(rn, e) -> termType (renameAnnedTerm (mkInScopeSet (inFreeVars annedFreeVars in_e)) rn e)) in_es StrictLet _ in_e@(rn, e) -> termType (renameAnnedTerm (mkInScopeSet (inFreeVars annedFreeVars in_e)) rn e) Update _ -> hole_ty - CastIt co -> pSnd (coercionKind co) + CastIt co -> pSnd (coercionKindNonRepr co) qaType :: Anned QA -> Type qaType anned_qa = case traverse (\qa -> case qa of Question x' -> Left (idType x'); Answer a -> Right a) anned_qa of @@ -250,7 +250,7 @@ qaType anned_qa = case traverse (\qa -> case qa of Question x' -> Left (idType x answerType :: Anned Answer -> Type answerType a = case annee a of - (Just (co, _), _) -> pSnd (coercionKind co) + (Just (co, _), _) -> pSnd (coercionKindNonRepr co) (Nothing, (rn, v)) -> valueType (renameAnnedValue' (mkInScopeSet (annedFreeVars a)) rn v) valueType :: Copointed ann => ValueF ann -> Type @@ -272,7 +272,7 @@ termType e = case extract e of Case _ _ ty _ -> ty Let _ _ e -> termType e LetRec _ e -> termType e - Cast _ co -> pSnd (coercionKind co) + Cast _ co -> pSnd (coercionKindNonRepr co) applyFunTy :: Type -> Type -> Type applyFunTy fun_ty got_arg_ty = ASSERT2(got_arg_ty `eqType` expected_arg_ty, text "applyFunTy:" <+> ppr got_arg_ty <+> ppr expected_arg_ty) res_ty _______________________________________________ Cvs-ghc mailing list Cvs-ghc@haskell.org http://www.haskell.org/mailman/listinfo/cvs-ghc