Repository : ssh://darcs.haskell.org//srv/darcs/ghc On branch : supercompiler
http://hackage.haskell.org/trac/ghc/changeset/79010d3ca1e44255ecce26f04a04db2608382726 >--------------------------------------------------------------- commit 79010d3ca1e44255ecce26f04a04db2608382726 Author: Max Bolingbroke <batterseapo...@hotmail.com> Date: Fri Aug 17 09:04:00 2012 +0100 Hack in some examples, not quite working >--------------------------------------------------------------- compiler/supercompile/Supercompile/Drive/MSG.hs | 31 ++++++++++++++++++++++- 1 files changed, 30 insertions(+), 1 deletions(-) diff --git a/compiler/supercompile/Supercompile/Drive/MSG.hs b/compiler/supercompile/Supercompile/Drive/MSG.hs index 16a17a9..3496062 100644 --- a/compiler/supercompile/Supercompile/Drive/MSG.hs +++ b/compiler/supercompile/Supercompile/Drive/MSG.hs @@ -40,6 +40,12 @@ import FastString (fsLit) --import BasicTypes (TupleSort(..)) import qualified State +import Id (mkTemplateLocals) +import Type (mkFunTy) +import TysWiredIn +import BasicTypes + + import Control.Monad (join) import Control.Monad.Fix import qualified Data.Foldable as Foldable @@ -60,6 +66,28 @@ traceSC _ = id --traceSC = trace +-- Demonstrates rollback due to heap work duplication +example1 :: SDoc +example1 = pPrint $ msg (MSGMode (mkInScopeSet emptyVarSet)) state1 state2 + where + state1 = (emptyDeeds, Heap (M.fromList [(f, lambdaBound), (g, lambdaBound), (x, internallyBound (renamedTerm $ annedTerm 0 (annedTerm 0 (Var g) `App` y))), (y, lambdaBound)]) (mkInScopeSet (mkVarSet [f, g, x, y])), Tagged 0 (Apply x) `Car` Tagged 0 (Update y) `Car` Loco False, (annedQA 0 (Question f))) + state2 = (emptyDeeds, Heap (M.fromList [(f, lambdaBound), (x, lambdaBound), (y, lambdaBound)]) (mkInScopeSet (mkVarSet [f, x, y])), Tagged 0 (Apply x) `Car` Tagged 0 (Update y) `Car` Loco False, (annedQA 0 (Question f))) + + [f, g, x, y] = mkTemplateLocals [boolTy `mkFunTy` intTy, intTy `mkFunTy` boolTy, boolTy, intTy] + +-- Demonstrates rollback due to stack "work duplication" +example2 :: SDoc +example2 = pPrint $ msg (MSGMode (mkInScopeSet emptyVarSet)) state1 state2 + where + expensive = internallyBound (renamedTerm $ annedTerm 0 (annedTerm 0 (Var f) `App` y)) + pairDC = tupleCon BoxedTuple 2 + + state1 = (emptyDeeds, Heap (M.fromList [(f, lambdaBound), (y, lambdaBound), (a, expensive)]) (mkInScopeSet (mkVarSet [f, y, a])), Loco False, annedQA 0 $ Answer $ renamedValue $ Data pairDC [intTy, intTy] [] [a, a]) + state2 = (emptyDeeds, Heap (M.fromList [(f, lambdaBound), (y, lambdaBound), (a, expensive), (b, expensive)]) (mkInScopeSet (mkVarSet [f, y, a, b])), Loco False, annedQA 0 $ Answer $ renamedValue $ Data pairDC [intTy, intTy] [] [a, b]) + + [a, b, f, y] = mkTemplateLocals [intTy, intTy, boolTy `mkFunTy` intTy, boolTy] + + rnBndr2' :: Applicative t => RnEnv2 -> Var -> Var -> MSGT t (RnEnv2, Var) rnBndr2' rn2 x_l x_r = MSG $ \_ s -> (s, pure (rnBndr2'' (msgInScopeSet s) rn2 x_l x_r)) -- The uniqAway is 1/2 of the story to ensure we don't get clashes between new rigid binders and the new common heap binders @@ -658,7 +686,8 @@ isTypeRenamingNonTrivial :: Renaming -> FreeVars -> Bool isTypeRenamingNonTrivial rn fvs = (\f -> foldVarSet f False fvs) $ \x rest -> (isTyVar x && isNothing (getTyVar_maybe (lookupTyVarSubst rn x))) || rest msg :: MSGMode -> State -> State -> MSG' MSGResult -msg mm (deeds_l, heap_l, k_l, qa_l) (deeds_r, heap_r, k_r, qa_r) = -- (\res -> traceRender ("msg", M.keysSet h_l, residualiseDriveState (Heap h_l prettyIdSupply, k_l, in_e_l), M.keysSet h_r, residualiseDriveState (Heap h_r prettyIdSupply, k_r, in_e_r), res) res) $ +msg = pprTrace "msg" example1 msg' +msg' mm (deeds_l, heap_l, k_l, qa_l) (deeds_r, heap_r, k_r, qa_r) = -- (\res -> traceRender ("msg", M.keysSet h_l, residualiseDriveState (Heap h_l prettyIdSupply, k_l, in_e_l), M.keysSet h_r, residualiseDriveState (Heap h_r prettyIdSupply, k_r, in_e_r), res) res) $ liftM (first (liftA2 (\deeds (heap, rn, k) -> (deeds, heap, rn, k)) (Pair deeds_l deeds_r))) $ msgLoop mm (heap_l, heap_r) (qa_l, qa_r) (k_l, k_r) msgAnned :: (Tag -> b -> Anned b) -> (Tag -> a -> Tag -> a -> MSG b) _______________________________________________ Cvs-ghc mailing list Cvs-ghc@haskell.org http://www.haskell.org/mailman/listinfo/cvs-ghc