Repository : ssh://darcs.haskell.org//srv/darcs/ghc On branch : supercompiler
http://hackage.haskell.org/trac/ghc/changeset/bc6a88327e2721d8ad13d21842b42be44e125178 >--------------------------------------------------------------- commit bc6a88327e2721d8ad13d21842b42be44e125178 Author: Max Bolingbroke <batterseapo...@hotmail.com> Date: Wed Mar 28 11:23:28 2012 +0100 Generalise residualisation code >--------------------------------------------------------------- .../Supercompile/Evaluator/Residualise.hs | 45 +++++++++++++------- 1 files changed, 30 insertions(+), 15 deletions(-) diff --git a/compiler/supercompile/Supercompile/Evaluator/Residualise.hs b/compiler/supercompile/Supercompile/Evaluator/Residualise.hs index 2e7edd8..3eb3b74 100644 --- a/compiler/supercompile/Supercompile/Evaluator/Residualise.hs +++ b/compiler/supercompile/Supercompile/Evaluator/Residualise.hs @@ -13,6 +13,7 @@ import Supercompile.Evaluator.Syntax import Supercompile.Core.FreeVars import Supercompile.Core.Renaming import Supercompile.Core.Syntax +import Supercompile.Core.Tag import Supercompile.Utilities @@ -24,50 +25,64 @@ import qualified Data.Set as S import Data.Ord -residualiseState :: State -> (Deeds, Out [(Var, PrettyFunction)], Out FVedTerm, Generalised) -residualiseState s = (deeds, floats_static, bindManyMixedLiftedness fvedTermFreeVars floats_nonstatic e, gen) +class Symantics ann => Symantics' ann where + inject :: AnnedTerm -> ann (TermF ann) + fvs :: ann (TermF ann) -> FreeVars + +instance Symantics' Identity where + inject = taggedSizedFVedTermToTerm + fvs = termFreeVars + +instance Symantics' FVed where + inject = detagAnnedTerm + fvs = fvedTermFreeVars + + +{-# SPECIALISE residualiseState :: State -> (Deeds, Out [(Var, PrettyFunction)], Out FVedTerm, Generalised) #-} +residualiseState :: Symantics' ann => State -> (Deeds, Out [(Var, PrettyFunction)], Out (ann (TermF ann)), Generalised) +residualiseState s = (deeds, floats_static, bindManyMixedLiftedness fvs floats_nonstatic e, gen) where (deeds, floats_static, floats_nonstatic, e, gen) = residualiseUnnormalisedState (denormalise s) -residualiseUnnormalisedState :: UnnormalisedState -> (Deeds, Out [(Var, PrettyFunction)], Out [(Var, FVedTerm)], Out FVedTerm, Generalised) +residualiseUnnormalisedState :: Symantics' ann => UnnormalisedState -> (Deeds, Out [(Var, PrettyFunction)], Out [(Var, ann (TermF ann))], Out (ann (TermF ann)), Generalised) residualiseUnnormalisedState (deeds, heap, k, in_e) = (deeds, floats_static, floats_nonstatic, e, gen) where (floats_static, floats_nonstatic, e, gen) = residualiseHeap heap (\ids -> residualiseStack ids k (residualiseTerm ids in_e)) -residualiseAnswer :: InScopeSet -> Answer -> Out FVedTerm -residualiseAnswer ids = fvedTerm . detagAnnedTerm' . answerToAnnedTerm' ids +residualiseAnswer :: Symantics' ann => InScopeSet -> Anned Answer -> Out (ann (TermF ann)) +residualiseAnswer ids = inject . fmap (answerToAnnedTerm' ids) -residualiseTerm :: InScopeSet -> In AnnedTerm -> Out FVedTerm -residualiseTerm ids = detagAnnedTerm . renameIn (renameAnnedTerm ids) +residualiseTerm :: Symantics' ann => InScopeSet -> In AnnedTerm -> Out (ann (TermF ann)) +residualiseTerm ids = inject . renameIn (renameAnnedTerm ids) -residualiseHeap :: Heap -> (InScopeSet -> ((Out [(Var, PrettyFunction)], Out [(Var, FVedTerm)]), Out FVedTerm, Generalised)) -> (Out [(Var, PrettyFunction)], Out [(Var, FVedTerm)], Out FVedTerm, Generalised) +residualiseHeap :: Symantics' ann => Heap -> (InScopeSet -> ((Out [(Var, PrettyFunction)], Out [(Var, ann (TermF ann))]), Out (ann (TermF ann)), Generalised)) -> (Out [(Var, PrettyFunction)], Out [(Var, ann (TermF ann))], Out (ann (TermF ann)), Generalised) residualiseHeap (Heap h ids) resid_body = (floats_static_h ++ floats_static_k, floats_nonstatic_h ++ floats_nonstatic_k, e, gen) where (floats_static_h, floats_nonstatic_h) = residualisePureHeap ids h ((floats_static_k, floats_nonstatic_k), e, gen) = resid_body ids -residualisePureHeap :: InScopeSet -> PureHeap -> (Out [(Var, PrettyFunction)], Out [(Var, FVedTerm)]) +residualisePureHeap :: Symantics' ann => InScopeSet -> PureHeap -> (Out [(Var, PrettyFunction)], Out [(Var, ann (TermF ann))]) residualisePureHeap ids h = partitionEithers [fmapEither ((,) x') ((,) x') (residualiseHeapBinding ids hb) | (x', hb) <- M.toList h] -residualiseHeapBinding :: InScopeSet -> HeapBinding -> Either (Out PrettyFunction) (Out FVedTerm) +residualiseHeapBinding :: Symantics' ann => InScopeSet -> HeapBinding -> Either (Out PrettyFunction) (Out (ann (TermF ann))) residualiseHeapBinding ids (HB InternallyBound (Right in_e)) = Right (residualiseTerm ids in_e) residualiseHeapBinding _ hb = Left (asPrettyFunction hb) -residualiseStack :: InScopeSet -> Stack -> Out FVedTerm -> ((Out [(Var, PrettyFunction)], Out [(Var, FVedTerm)]), Out FVedTerm, Generalised) +residualiseStack :: Symantics' ann => InScopeSet -> Stack -> Out (ann (TermF ann)) -> ((Out [(Var, PrettyFunction)], Out [(Var, ann (TermF ann))]), Out (ann (TermF ann)), Generalised) residualiseStack _ (Loco gen) e_body = (([], []), e_body, gen) residualiseStack ids (Car kf k) e_body = first3 ((static_floats ++) *** (nonstatic_floats ++)) $ residualiseStack ids k e where ((static_floats, nonstatic_floats), e) = residualiseStackFrame ids (tagee kf) e_body -residualiseStackFrame :: InScopeSet -> StackFrame -> Out FVedTerm -> ((Out [(Var, PrettyFunction)], Out [(Var, FVedTerm)]), Out FVedTerm) +residualiseStackFrame :: Symantics' ann => InScopeSet -> StackFrame -> Out (ann (TermF ann)) -> ((Out [(Var, PrettyFunction)], Out [(Var, ann (TermF ann))]), Out (ann (TermF ann))) residualiseStackFrame _ (TyApply ty') e = (([], []), e `tyApp` ty') residualiseStackFrame _ (CoApply co') e = (([], []), e `coApp` co') residualiseStackFrame _ (Apply x2') e1 = (([], []), e1 `app` x2') -residualiseStackFrame ids (Scrutinise x' ty in_alts) e = (([], []), case_ e x' ty (detagAnnedAlts $ renameIn (renameAnnedAlts ids) in_alts)) -residualiseStackFrame ids (PrimApply pop tys' as es') e = (([], []), primOp pop tys' (map (residualiseAnswer ids . annee) as ++ e : map (residualiseTerm ids) es')) +residualiseStackFrame ids (Scrutinise x' ty in_alts) e = (([], []), case_ e x' ty (map (second inject) $ renameIn (renameAnnedAlts ids) in_alts)) +residualiseStackFrame ids (PrimApply pop tys' as es') e = (([], []), primOp pop tys' (map (residualiseAnswer ids) as ++ e : map (residualiseTerm ids) es')) residualiseStackFrame ids (StrictLet x' in_e2) e1 = (([], []), let_ x' e1 (residualiseTerm ids in_e2)) residualiseStackFrame _ (Update x') e = (([], [(x', e)]), var x') residualiseStackFrame _ (CastIt co') e = (([], []), e `cast` co') pPrintHeap :: Heap -> SDoc -pPrintHeap (Heap h ids) = pPrint $ map (first (PrettyDoc . pPrintBndr LetBind)) $ floats_static_h ++ [(x, asPrettyFunction1 e) | (x, e) <- floats_nonstatic_h] +pPrintHeap (Heap h ids) = pPrint $ map (first (PrettyDoc . pPrintBndr LetBind)) $ floats_static_h ++ [(x, asPrettyFunction1 (e :: Term)) | (x, e) <- floats_nonstatic_h] where (floats_static_h, floats_nonstatic_h) = residualisePureHeap ids h data StatePrettiness = SP { includeLams :: Bool, includeStatics :: Bool, excludeBindings :: S.Set Var } _______________________________________________ Cvs-ghc mailing list Cvs-ghc@haskell.org http://www.haskell.org/mailman/listinfo/cvs-ghc