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

On branch  : supercompiler

http://hackage.haskell.org/trac/ghc/changeset/6cb88f4096c9c8d9416abeed0c7273a7cc9ac012

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

commit 6cb88f4096c9c8d9416abeed0c7273a7cc9ac012
Author: Max Bolingbroke <batterseapo...@hotmail.com>
Date:   Tue Jul 17 15:03:16 2012 +0100

    Correctly update type of a Case when pushing frames inside it

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

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

diff --git a/compiler/supercompile/Supercompile/Drive/Split2.hs 
b/compiler/supercompile/Supercompile/Drive/Split2.hs
index 312c28f..b84b5e3 100644
--- a/compiler/supercompile/Supercompile/Drive/Split2.hs
+++ b/compiler/supercompile/Supercompile/Drive/Split2.hs
@@ -623,6 +623,9 @@ splitPureHeap ids h = (M.fromDistinctAscList [ (HeapContext 
x', fmap fst mb_spli
                                              | (x', mb_split_hb) <- 
M.toAscList split_h ],
                        \generalised marked -> (\f -> M.mapWithKey f h) $ \x' 
hb -> if HeapContext x' `S.member` marked then hb else if HeapContext x' 
`S.member` generalised then generalisedLambdaBound else lambdaBound, -- FIXME: 
bugger around with howToBindCheap?
                        \h_prep -> (\f -> M.mapMaybe f split_h) $ \mb_split_hb 
-> do
+                                    -- TODO: we could only include in the 
output those bindings that are either NOT marked for inlining,
+                                    -- or are cheap (and thus had marking 
forced regardless of whether they are used in the residual).
+                                    -- Similarly, it would be cool to exclude 
bindings arising from the first update frame to avoid messiness in recurseHeap
                                     (_, (how_bound, mk_e)) <- mb_split_hb
                                     guard (how_bound == InternallyBound)
                                     return (mk_e h_prep))
@@ -665,7 +668,7 @@ splitStack ids k mb_scrut = go (fmap (\x' -> ((Uncast, x'), 
[])) mb_scrut, 0, []
           CoApply co'                  -> (Nothing, Nothing, False, varEdges 
ManyEntries (tyCoVarsOfCo co'), \_ _ -> CoApply co')
           Apply x'                     -> (Nothing, Nothing, False, 
M.singleton (HeapContext x') ManyEntries, \_ _ -> Apply x')
           Scrutinise x' ty' (rn, alts) -> (Nothing, Nothing, True, 
varBndrEdges x' $ foldr plusEntered M.empty alts_verts,
-                                           \h_prep k_prep -> Scrutinise x' ty' 
(map (($ k_prep) . ($ h_prep)) mk_alts))
+                                           \h_prep k_prep -> Scrutinise x' 
(stackType (lookupStackPrep next_frame k_prep) ty') (map (($ k_prep) . ($ 
h_prep)) mk_alts))
             where any_scrut_live = any (not . isDeadBinder . snd) scruts_flat
                   
                   -- These lines achieve two things:



_______________________________________________
Cvs-ghc mailing list
Cvs-ghc@haskell.org
http://www.haskell.org/mailman/listinfo/cvs-ghc

Reply via email to