Repository : ssh://darcs.haskell.org//srv/darcs/ghc On branch : supercompiler
http://hackage.haskell.org/trac/ghc/changeset/e195faace93aef37a2dbd324f2e839bb31520ea7 >--------------------------------------------------------------- commit e195faace93aef37a2dbd324f2e839bb31520ea7 Author: Max Bolingbroke <batterseapo...@hotmail.com> Date: Mon Aug 1 13:04:34 2011 +0100 The evaluator was not releasing deeds from coercions inside an Answer >--------------------------------------------------------------- .../Supercompile/Evaluator/Evaluate.hs | 44 ++++++++++---------- 1 files changed, 22 insertions(+), 22 deletions(-) diff --git a/compiler/supercompile/Supercompile/Evaluator/Evaluate.hs b/compiler/supercompile/Supercompile/Evaluator/Evaluate.hs index 2b4a699..a3eef29 100644 --- a/compiler/supercompile/Supercompile/Evaluator/Evaluate.hs +++ b/compiler/supercompile/Supercompile/Evaluator/Evaluate.hs @@ -155,17 +155,17 @@ step' normalising state = -- Deal with a value at the top of the stack unwind :: Deeds -> Heap -> Stack -> Tag -> Answer -> Maybe UnnormalisedState - unwind deeds h k tg_v in_v = uncons k >>= \(kf, k) -> case tagee kf of - TyApply ty' -> tyApply (deeds + 1) h k in_v ty' - CoApply co' -> coApply (deeds + 1) h k in_v co' - Apply x2' -> apply deeds (tag kf) h k in_v x2' - Scrutinise x' ty' in_alts -> scrutinise (deeds + 1) h k tg_v in_v x' ty' in_alts - PrimApply pop tys' in_vs in_es -> primop deeds (tag kf) h k tg_v pop tys' in_vs in_v in_es - StrictLet x' in_e2 -> strictLet (deeds + 1) h k tg_v in_v x' in_e2 - CastIt co' -> cast deeds (tag kf) h k in_v co' + unwind deeds h k tg_v a = uncons k >>= \(kf, k) -> case tagee kf of + TyApply ty' -> tyApply (deeds + 1) h k a ty' + CoApply co' -> coApply (deeds + 1) h k a co' + Apply x2' -> apply deeds (tag kf) h k a x2' + Scrutinise x' ty' in_alts -> scrutinise (deeds + 1) h k tg_v a x' ty' in_alts + PrimApply pop tys' in_vs in_es -> primop deeds (tag kf) h k tg_v pop tys' in_vs a in_es + StrictLet x' in_e2 -> strictLet (deeds + 1) h k tg_v a x' in_e2 + CastIt co' -> cast deeds (tag kf) h k a co' Update x' | normalising, dUPLICATE_VALUES_EVALUATOR -> Nothing -- If duplicating values, we ensure normalisation by not executing updates - | otherwise -> update deeds h k tg_v x' in_v + | otherwise -> update deeds h k tg_v x' a where -- When derereferencing an indirection, it is important that the resulting value is not stored anywhere. The reasons are: -- 1) That would cause allocation to be duplicated if we residualised immediately afterwards, because the value would still be in the heap @@ -187,15 +187,15 @@ step' normalising state = | otherwise = Just (dereference h a) tyApply :: Deeds -> Heap -> Stack -> Answer -> Out Type -> Maybe UnnormalisedState - tyApply deeds h k in_v@(_, (_, v)) ty' = do - (mb_co, (rn, TyLambda x e_body)) <- deferenceLambdaish h in_v + tyApply deeds h k a@(_, (_, v)) ty' = do + (mb_co, (rn, TyLambda x e_body)) <- deferenceLambdaish h a fmap (\deeds -> (deeds, h, case mb_co of Nothing -> k; Just (co', tg_co) -> Tagged tg_co (CastIt (co' `mkInstCo` ty')) : k, (insertTypeSubst rn x ty', e_body))) $ - claimDeeds (deeds + annedValueSize' v) (annedSize e_body) + claimDeeds (deeds + answerSize' a) (annedSize e_body) coApply :: Deeds -> Heap -> Stack -> Answer -> Out Coercion -> Maybe UnnormalisedState - coApply deeds h k in_v@(_, (_, v)) apply_co' = do - (mb_co, (rn, Lambda x e_body)) <- deferenceLambdaish h in_v - flip fmap (claimDeeds (deeds + annedValueSize' v) (annedSize e_body)) $ \deeds -> case mb_co of + coApply deeds h k a@(_, (_, v)) apply_co' = do + (mb_co, (rn, Lambda x e_body)) <- deferenceLambdaish h a + flip fmap (claimDeeds (deeds + answerSize' a) (annedSize e_body)) $ \deeds -> case mb_co of Nothing -> (deeds, h, k, (insertCoercionSubst rn x apply_co', e_body)) Just (co', tg_co) -> (deeds, h, Tagged tg_co (CastIt res_co') : k, (insertCoercionSubst rn x cast_apply_co', e_body)) where -- Implements the special case of beta-reduction of cast lambda where the argument is an explicit coercion value. @@ -208,20 +208,20 @@ step' normalising state = cast_apply_co' = arg_from_co' `mkTransCo` apply_co' `mkTransCo` mkSymCo arg_to_co' apply :: Deeds -> Tag -> Heap -> Stack -> Answer -> Out Var -> Maybe UnnormalisedState - apply deeds tg_v (Heap h ids) k in_v@(_, (_, v)) x' = do - (mb_co, (rn, Lambda x e_body)) <- deferenceLambdaish (Heap h ids) in_v + apply deeds tg_v (Heap h ids) k a@(_, (_, v)) x' = do + (mb_co, (rn, Lambda x e_body)) <- deferenceLambdaish (Heap h ids) a case mb_co of Nothing -> fmap (\deeds -> (deeds, Heap h ids, k, (insertIdRenaming rn x x', e_body))) $ - claimDeeds (deeds + 1 + annedValueSize' v) (annedSize e_body) + claimDeeds (deeds + 1 + answerSize' a) (annedSize e_body) 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 + 1 + annedValueSize' v) (annedSize e_arg + annedSize e_body) + claimDeeds (deeds + 1 + 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' [arg_co', res_co'] = decomposeCo 2 co' e_arg = annedTerm tg_co (annedTerm tg_v (Var x') `Cast` mkSymCo arg_co') scrutinise :: Deeds -> Heap -> Stack -> Tag -> Answer -> Out Var -> Out Type -> In [AnnedAlt] -> Maybe UnnormalisedState - scrutinise deeds0 (Heap h0 ids) k tg_v (mb_co_v, (rn_v, v)) wild' _ty' (rn_alts, alts) + scrutinise deeds0 (Heap h0 ids) k tg_v a@(mb_co_v, (rn_v, v)) wild' _ty' (rn_alts, alts) -- Literals are easy -- we can make the simplifying assumption that the types of literals are -- always simple TyCons without any universally quantified type variables. | Literal l <- v_deref @@ -281,8 +281,8 @@ step' normalising state = = Nothing where (mb_co_deref, (rn_v_deref, v_deref)) = dereference (Heap h0 ids) (mb_co_v, (rn_v, v)) mb_co_deref_kind = fmap (\(co, tg_co) -> (co, tg_co, coercionKind co)) mb_co_deref - (deeds1, h1) | isDeadBinder wild' = (deeds0 + annedValueSize' v + maybe 0 (const 1) mb_co_v, h0) - | otherwise = (deeds0, M.insert wild' wild_hb h0) + (deeds1, h1) | isDeadBinder wild' = (deeds0 + answerSize' a, h0) + | otherwise = (deeds0, M.insert wild' wild_hb h0) where wild_hb = case mb_co_v of Nothing -> internallyBound (rn_v, annedTerm tg_v (Value v)) Just co_tg_v -> internallyBound (renamedTerm $ annedTerm tg_v (castValueToAnnedTerm' co_tg_v (renameAnnedValue' ids rn_v v))) _______________________________________________ Cvs-ghc mailing list Cvs-ghc@haskell.org http://www.haskell.org/mailman/listinfo/cvs-ghc