Repository : ssh://darcs.haskell.org//srv/darcs/ghc

On branch  : supercompiler

http://hackage.haskell.org/trac/ghc/changeset/8388dd29c803ca8800beeea5e00dd5c6e3b398e0

>---------------------------------------------------------------

commit 8388dd29c803ca8800beeea5e00dd5c6e3b398e0
Author: Max Bolingbroke <batterseapo...@hotmail.com>
Date:   Fri Oct 19 16:24:40 2012 +0100

    Fix bug in cheap node shortcutting that was pessimising the splitter

>---------------------------------------------------------------

 compiler/supercompile/Supercompile/Drive/Split2.hs |    7 ++++---
 1 files changed, 4 insertions(+), 3 deletions(-)

diff --git a/compiler/supercompile/Supercompile/Drive/Split2.hs 
b/compiler/supercompile/Supercompile/Drive/Split2.hs
index 51b412e..7a9041b 100644
--- a/compiler/supercompile/Supercompile/Drive/Split2.hs
+++ b/compiler/supercompile/Supercompile/Drive/Split2.hs
@@ -57,7 +57,7 @@ shortcutEdges :: forall node edge.
                  Ord node
               => (node -> Bool)
               -> (edge -> edge -> edge)         -- Used to join edges if after 
shortcutting there is more than one path from a node to another one
-              -> (edge -> node -> edge -> edge) -- Used when joining two edges 
in a contiguous path
+              -> (edge -> node -> edge -> edge) -- Used when joining two edges 
in a contiguous path (the node always satisfys the predicate)
               -> LGraph node edge
               -> LGraph node edge
 shortcutEdges should_shortcut combine_edges combine g = State.evalState 
visit_graph M.empty
@@ -464,7 +464,8 @@ type PushedFocus = PushFocus PushedQA State
 push :: S.Set Context
      -> (Heap, Stack, PushFocus (Anned QA) (In AnnedTerm))
      -> (PushedHeap, PushedStack, PushedFocus)
-push generalised (Heap h ids, k, focus) = (h', k', focus')
+push generalised (Heap h ids, k, focus) = -- pprTrace "push" (ppr verts $$ ppr 
marked)
+                                          (h', k', focus')
   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:
@@ -498,7 +499,7 @@ push generalised (Heap h ids, k, focus) = (h', k', focus')
         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)
+                              plusEntries (\ent1 _ _ent2 -> ent1) -- NB: we 
discard ent2. Consider inlining binding (x = Just y) [which marks y as Many] 
into context (case x of Just y -> ...) [which marks x as Once]. We don't want 
to mark y with Many (i.e. Once+Many) because we can in fact push it down safely.
                               (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

Reply via email to