Repository : ssh://darcs.haskell.org//srv/darcs/ghc On branch : supercompiler
http://hackage.haskell.org/trac/ghc/changeset/ffa5c713527084a208ac254b0a7e067170bc68a5 >--------------------------------------------------------------- commit ffa5c713527084a208ac254b0a7e067170bc68a5 Author: Max Bolingbroke <batterseapo...@hotmail.com> Date: Wed Jul 27 19:19:52 2011 +0100 Don't lose deeds when the evaluator builds a term from a bare Var >--------------------------------------------------------------- compiler/supercompile/Supercompile/Core/Size.hs | 24 +++++++------------ .../Supercompile/Evaluator/Evaluate.hs | 2 +- .../supercompile/Supercompile/Evaluator/Syntax.hs | 4 --- 3 files changed, 10 insertions(+), 20 deletions(-) diff --git a/compiler/supercompile/Supercompile/Core/Size.hs b/compiler/supercompile/Supercompile/Core/Size.hs index 3b2d050..a2e1ba4 100644 --- a/compiler/supercompile/Supercompile/Core/Size.hs +++ b/compiler/supercompile/Supercompile/Core/Size.hs @@ -19,30 +19,27 @@ type TaggedSizedFVedAlt = AltF (O Tagged (O Sized FVed)) type TaggedSizedFVedValue = ValueF (O Tagged (O Sized FVed)) -(varSize', termSize, termSize', altsSize, valueSize, valueSize') = mkSize (\f (I e) -> f e) -(fvedVarSize', fvedTermSize, fvedTermSize', fvedAltsSize, fvedValueSize, fvedValueSize') = mkSize (\f (FVed _ e) -> f e) -(sizedVarSize', sizedTermSize, sizedTermSize', sizedAltsSize, sizedValueSize, sizedValueSize') = mkSize (\_ (Sized sz _) -> sz) -(sizedFVedVarSize', sizedFVedTermSize, sizedFVedTermSize', sizedFVedAltsSize, sizedFVedValueSize, sizedFVedValueSize') = mkSize (\_ (Comp (Sized sz (FVed _ _))) -> sz) -(taggedSizedFVedVarSize', taggedSizedFVedTermSize, taggedSizedFVedTermSize', taggedSizedFVedAltsSize, taggedSizedFVedValueSize, taggedSizedFVedValueSize') = mkSize (\_ (Comp (Tagged _ (Comp (Sized sz (FVed _ _))))) -> sz) +(termSize, termSize', altsSize, valueSize, valueSize') = mkSize (\f (I e) -> f e) +(fvedTermSize, fvedTermSize', fvedAltsSize, fvedValueSize, fvedValueSize') = mkSize (\f (FVed _ e) -> f e) +(sizedTermSize, sizedTermSize', sizedAltsSize, sizedValueSize, sizedValueSize') = mkSize (\_ (Sized sz _) -> sz) +(sizedFVedTermSize, sizedFVedTermSize', sizedFVedAltsSize, sizedFVedValueSize, sizedFVedValueSize') = mkSize (\_ (Comp (Sized sz (FVed _ _))) -> sz) +(taggedSizedFVedTermSize, taggedSizedFVedTermSize', taggedSizedFVedAltsSize, taggedSizedFVedValueSize, taggedSizedFVedValueSize') = mkSize (\_ (Comp (Tagged _ (Comp (Sized sz (FVed _ _))))) -> sz) {-# INLINE mkSize #-} mkSize :: (forall a. (a -> Size) -> ann a -> Size) - -> (Var -> Size, - ann (TermF ann) -> Size, + -> (ann (TermF ann) -> Size, TermF ann -> Size, [AltF ann] -> Size, ann (ValueF ann) -> Size, ValueF ann -> Size) -mkSize rec = (var', term, term', alternatives, value, value') +mkSize rec = (term, term', alternatives, value, value') where - var' = const 0 - term = rec term' term' e = 1 + case e of - Var x -> var' x + Var _ -> 0 Value v -> value' v - 1 -- Slight hack here so that we don't get +2 size on values TyApp e _ -> term e - App e x -> term e + var' x + App e _ -> term e PrimOp _ _ es -> sum (map term es) Case e _ _ alts -> term e + alternatives alts Let _ e1 e2 -> term e1 + term e2 @@ -74,9 +71,6 @@ instance Symantics (O Sized FVed) where letRec xes = sizedFVedTerm . LetRec xes cast e = sizedFVedTerm . Cast e -sizedFVedVar :: Var -> (O Sized FVed) Var -sizedFVedVar x = Comp (Sized (sizedFVedVarSize' x) (FVed (sizedFVedVarFreeVars' x) x)) - sizedFVedValue :: SizedFVedValue -> (O Sized FVed) SizedFVedValue sizedFVedValue v = Comp (Sized (sizedFVedValueSize' v) (FVed (sizedFVedValueFreeVars' v) v)) diff --git a/compiler/supercompile/Supercompile/Evaluator/Evaluate.hs b/compiler/supercompile/Supercompile/Evaluator/Evaluate.hs index 5583ae3..77c8301 100644 --- a/compiler/supercompile/Supercompile/Evaluator/Evaluate.hs +++ b/compiler/supercompile/Supercompile/Evaluator/Evaluate.hs @@ -89,7 +89,7 @@ step' normalising state = go (deeds, heap@(Heap h ids), k, (rn, e)) | Just anned_a <- termToAnswer ids (rn, e) = go_answer (deeds, heap, k, anned_a) | otherwise = case annee e of - Var x -> go_question (deeds, heap, k, annedVar (annedTag e) (renameId rn x)) + Var x -> go_question (deeds, heap, k, fmap (\(rn, Var _) -> renameId rn x) (renameAnned (rn, e))) Value v -> pprPanic "step': values are always answers" (ppr v) TyApp e ty -> go (deeds, heap, Tagged tg (TyApply (renameType ids rn ty)) : k, (rn, e)) App e x -> go (deeds, heap, Tagged tg (Apply (renameId rn x)) : k, (rn, e)) diff --git a/compiler/supercompile/Supercompile/Evaluator/Syntax.hs b/compiler/supercompile/Supercompile/Evaluator/Syntax.hs index 515e8ca..686bac5 100644 --- a/compiler/supercompile/Supercompile/Evaluator/Syntax.hs +++ b/compiler/supercompile/Supercompile/Evaluator/Syntax.hs @@ -54,7 +54,6 @@ annedValueFreeVars = taggedSizedFVedValueFreeVars annedValueFreeVars' = taggedSizedFVedValueFreeVars' annedAltsFreeVars = taggedSizedFVedAltsFreeVars -annedVarSize' = taggedSizedFVedVarSize' annedTermSize' = taggedSizedFVedTermSize' annedTermSize = taggedSizedFVedTermSize annedValueSize' = taggedSizedFVedValueSize' @@ -73,9 +72,6 @@ detagAnnedValue' = taggedSizedFVedValue'ToFVedValue' detagAnnedAlts = taggedSizedFVedAltsToFVedAlts -annedVar :: Tag -> Var -> Anned Var -annedVar tg x = Comp (Tagged tg (Comp (Sized (annedVarSize' x) (FVed (annedVarFreeVars' x) x)))) - annedTerm :: Tag -> TermF Anned -> AnnedTerm annedTerm tg e = Comp (Tagged tg (Comp (Sized (annedTermSize' e) (FVed (annedTermFreeVars' e) e)))) _______________________________________________ Cvs-ghc mailing list Cvs-ghc@haskell.org http://www.haskell.org/mailman/listinfo/cvs-ghc