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

On branch  : supercompiler

http://hackage.haskell.org/trac/ghc/changeset/ddde588cd09e6a7b43992277299273378b732eea

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

commit ddde588cd09e6a7b43992277299273378b732eea
Author: Max Bolingbroke <batterseapo...@hotmail.com>
Date:   Wed Mar 14 22:24:04 2012 +0000

    Fix small bug in speculation and add multiple comments

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

 .../supercompile/Supercompile/Core/FreeVars.hs     |    7 ++++-
 .../supercompile/Supercompile/Drive/Process.hs     |   26 +++++++++++++++++--
 .../supercompile/Supercompile/Evaluator/Syntax.hs  |    2 +-
 3 files changed, 29 insertions(+), 6 deletions(-)

diff --git a/compiler/supercompile/Supercompile/Core/FreeVars.hs 
b/compiler/supercompile/Supercompile/Core/FreeVars.hs
index f3813b5..51776aa 100644
--- a/compiler/supercompile/Supercompile/Core/FreeVars.hs
+++ b/compiler/supercompile/Supercompile/Core/FreeVars.hs
@@ -88,8 +88,11 @@ altConFreeVars DefaultAlt           = id
 
 
 coercedFreeVars :: (a -> FreeVars) -> Coerced a -> FreeVars
-coercedFreeVars f (Uncast,      x) = f x
-coercedFreeVars f (CastBy co _, x) = f x `unionVarSet` tyCoVarsOfCo co
+coercedFreeVars f (cast_by, x) = f x `unionVarSet` castByFreeVars cast_by
+
+castByFreeVars :: CastBy -> FreeVars
+castByFreeVars Uncast        = emptyVarSet
+castByFreeVars (CastBy co _) = tyCoVarsOfCo co
 
 
 data FVed a = FVed { freeVars :: !FreeVars, fvee :: !a }
diff --git a/compiler/supercompile/Supercompile/Drive/Process.hs 
b/compiler/supercompile/Supercompile/Drive/Process.hs
index e0b06f7..8fb9b70 100644
--- a/compiler/supercompile/Supercompile/Drive/Process.hs
+++ b/compiler/supercompile/Supercompile/Drive/Process.hs
@@ -656,10 +656,30 @@ speculateHeap speculated (stats, deeds, Heap h ids) = {-# 
SCC "speculate" #-} (M
                       -> spec_trace "speculation denied" (ppr x' {- $$ 
pPrintFullState quietStatePrettiness (gc state) $$ pPrintFullState 
quietStatePrettiness _gced_old_state -})
                          (no_change, {- speculation_failure Nothing -} if any 
(`isSuffixOf` old_parents') forbidden then speculation_failure Nothing else rb) 
-- Don't allow rollback to rolled back region
                     Continue hist -> case reduceWithStats state of
-                        (extra_stats, (deeds, Heap h_speculated_ok' ids, Loco 
_, qa))
-                          | Just a <- traverse qaToAnswer qa
+                        (extra_stats, (deeds, Heap h_speculated_ok' ids, k, 
qa))
+                          -- I used to insist that evaluation should reach an 
*answer*, but actually it's really good if we
+                          -- get any cheap thing -- so questions are OK, and 
even cast questions are permissible (cast answers
+                          -- will never occur in practice).
+                          --
+                          -- A case where this makes a difference is if we 
have:
+                          --   (+)_selector $dNumInteger
+                          -- It will normally get speculated to a Question:
+                          --   GHC.Integer.plusInteger
+                          -- Due to the fact that plusInteger does not have an 
unfolding.
+                          --
+                          -- If the speculator only keeps Answers then it 
wouldn't keep this result,
+                          -- and thus if we had something like:
+                          --  (let add = (+)_selector $dNumInteger in (.. add 
.., .. add ..))
+                          -- Then we got a residual let-binding for "add", and 
the two h-functions
+                          -- corresponding to each component of the tuple were 
lambda-abstracted
+                          -- over "add"!
+                          | Just cast_by <- stackToCast k
                           , let h_unspeculated = h_speculated_ok' M.\\ 
h_speculated_ok
-                                in_e' = annedAnswerToInAnnedTerm (mkInScopeSet 
(annedFreeVars a)) a
+                                -- NB: this "fmap" is safe for a rather 
delicate reason -- the renaming returned by annedQAToInAnnedTerm
+                                -- is an identity renaming that includes at 
least all of the variables in the input InScopeSet, *IN THE CASE
+                                -- THAT YOU PASS AN ANSWER*. This is just 
barely sufficient for our purposes due to the fact that "reduce" never
+                                -- returns an Answer with a cast pending on 
the stack -- it only returns such a Question.
+                                in_e' = fmap (castAnnedTerm cast_by) $ 
annedQAToInAnnedTerm (mkInScopeSet (castByFreeVars cast_by `unionVarSet` 
annedFreeVars qa)) qa
                           -> (((hist, forbidden, ids), (stats `mappend` 
extra_stats, deeds, M.insert x' (internallyBound in_e') h_speculated_ok, 
h_speculated_failure)), speculateManyMap parents' h_unspeculated)
                         _ -> (no_change, speculation_failure Nothing)
                   where state = normalise (deeds, Heap h_speculated_ok ids, 
Loco False, in_e)
diff --git a/compiler/supercompile/Supercompile/Evaluator/Syntax.hs 
b/compiler/supercompile/Supercompile/Evaluator/Syntax.hs
index a19d953..ebaf92e 100644
--- a/compiler/supercompile/Supercompile/Evaluator/Syntax.hs
+++ b/compiler/supercompile/Supercompile/Evaluator/Syntax.hs
@@ -144,7 +144,7 @@ annedQuestionToInAnnedTerm iss anned_q = 
(mkInScopeIdentityRenaming iss, fmap Va
 annedAnswerToInAnnedTerm :: InScopeSet -> Anned Answer -> In AnnedTerm
 annedAnswerToInAnnedTerm iss anned_a = case annee anned_a of
   (Uncast,          (rn, v)) -> (rn,                                           
                      fmap Value $ annedValue (annedTag anned_a) v)
-  (CastBy co co_tg, (rn, v)) -> (mkInScopeIdentityRenaming iss, annedTerm 
(annedTag anned_a) $ Cast (fmap Value $ annedValue co_tg      $ 
renameAnnedValue' iss rn v) co)
+  (CastBy co co_tg, (rn, v)) -> (mkInScopeIdentityRenaming iss, annedTerm 
(annedTag anned_a) $ Cast (fmap Value $ annedValue co_tg            $ 
renameAnnedValue' iss rn v) co)
 
 answerToAnnedTerm' :: InScopeSet -> Answer -> TermF Anned
 answerToAnnedTerm' iss (mb_co, (rn, v)) = case mb_co of



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

Reply via email to