Repository : ssh://darcs.haskell.org//srv/darcs/ghc On branch : supercompiler
http://hackage.haskell.org/trac/ghc/changeset/feb653c2936b2bd0e714b818a1c7680b01497806 >--------------------------------------------------------------- commit feb653c2936b2bd0e714b818a1c7680b01497806 Author: Max Bolingbroke <batterseapo...@hotmail.com> Date: Mon Aug 13 18:09:50 2012 +0100 Due to evaluator change we can remove some ugliness from split cheap heap construction >--------------------------------------------------------------- compiler/supercompile/Supercompile/Drive/Split2.hs | 18 ++++-------------- 1 files changed, 4 insertions(+), 14 deletions(-) diff --git a/compiler/supercompile/Supercompile/Drive/Split2.hs b/compiler/supercompile/Supercompile/Drive/Split2.hs index ccb45fd..6f4eed6 100644 --- a/compiler/supercompile/Supercompile/Drive/Split2.hs +++ b/compiler/supercompile/Supercompile/Drive/Split2.hs @@ -454,24 +454,14 @@ push :: S.Set Context -> (Heap, Stack, PushFocus (Anned QA) (In AnnedTerm)) -> (PushedHeap, PushedStack, PushedFocus) push generalised (Heap h ids, k, focus) = (h', k', focus') - where -- NB: values or variables in focus which are immediately updated are a pain. We: - -- 1. Construct a bit of graph from the update frame which overwrites the normal HeapContext binding from splitStack to ensure - -- that there is no edge from the variable to its update frame (we can just push the definition down, not the frame) - -- 2. Explicitly ensure that the thing bound by the update frame is considered cheap and hence shorcutted through in the graph - -- - -- NB: in this case we may end up marking the y' bound by the update frame but not the frame itself (at index 0 or 1) - (cheap_marked_k_head, h_k_head) = case fst (peelUpdateStack k) of - Just (cast_by, Tagged _tg_y' y') | QAFocus qa <- focus -> (S.singleton (HeapContext y'), M.singleton y' (internallyBound (castAnnedQAToInAnnedTerm ids qa cast_by))) - _ -> (S.empty, M.empty) - - -- TODO: arguably I should try to get a QA for the thing in the focus. This will help in cases like where we MSG together: + where -- TODO: arguably I should try to get a QA for the thing in the focus. This will help in cases like where we MSG together: -- < H | v | > -- and: -- < H, H' | v | update f > -- Since ideally instance splitting the second state should allow us to drive H' with the value binding f |-> v. A similar argument applies to questions in focus. mb_scrut = case focus of QAFocus qa | Question x' <- annee qa -> Just x'; _ -> Nothing - (verts_h, prepare_h, mk_h) = splitPureHeap ids (h `unionDisjoint` h_k_head) + (verts_h, prepare_h, mk_h) = splitPureHeap ids h (verts_k, prepare_k, mk_k) = splitStack ids k mb_scrut (verts_focus, mk_focus) = splitFocus ids focus (FocusContext `S.member` generalised) @@ -494,11 +484,11 @@ push generalised (Heap h ids, k, focus) = (h', k', focus') -- forcing more things to be unmarked. In particular, we have to watch out for: -- 1. Vertices originating from dead heap bindings -- 2. Heap verticies originating from on-stack updates that bind dead variables - cheap_marked = (cheap_marked_k_head `S.union` S.fromDistinctAscList [HeapContext x' | (x', hb) <- M.toAscList h, maybe True (termIsCheap . snd) (heapBindingTerm hb)]) S.\\ generalised + cheap_marked = S.fromDistinctAscList [HeapContext x' | (x', hb) <- M.toAscList h, maybe True (termIsCheap . snd) (heapBindingTerm hb)] S.\\ generalised verts = trimUnreachable FocusContext $ shortcutEdges (`S.member` cheap_marked) plusEntries (\ent1 _ ent2 -> ent1 `plusEntries` ent2) - (verts_h `M.union` (verts_k `unionDisjoint` verts_focus)) -- NB: verts_h might mention a heap binding bound by a leading update frame in verts_k: h takes precedence + (verts_h `unionDisjoint` (verts_k `unionDisjoint` verts_focus)) extra_marked = solve generalised verts marked = cheap_marked `S.union` extra_marked _______________________________________________ Cvs-ghc mailing list Cvs-ghc@haskell.org http://www.haskell.org/mailman/listinfo/cvs-ghc