Repository : ssh://darcs.haskell.org//srv/darcs/ghc On branch :
http://hackage.haskell.org/trac/ghc/changeset/d1b498227c32c7b51fb3ec61b85ca01e6ce6f333 >--------------------------------------------------------------- commit d1b498227c32c7b51fb3ec61b85ca01e6ce6f333 Author: Max Bolingbroke <batterseapo...@hotmail.com> Date: Wed Feb 1 14:30:55 2012 +0000 Memo table preinitialization in Process3 >--------------------------------------------------------------- .../supercompile/Supercompile/Drive/Process.hs | 11 +++++---- .../supercompile/Supercompile/Drive/Process3.hs | 21 +++++++++++++++---- compiler/supercompile/Supercompile/StaticFlags.hs | 3 ++ 3 files changed, 25 insertions(+), 10 deletions(-) diff --git a/compiler/supercompile/Supercompile/Drive/Process.hs b/compiler/supercompile/Supercompile/Drive/Process.hs index d68d0bf..9445c30 100644 --- a/compiler/supercompile/Supercompile/Drive/Process.hs +++ b/compiler/supercompile/Supercompile/Drive/Process.hs @@ -295,7 +295,9 @@ prepareTerm unfoldings e = pprTraceSC "unfoldings" (pPrintPrecLetRec noPrec (M.t preinit_heap = mk_heap internallyBound -- NB: we assume that unfoldings are guaranteed to be cheap and hence duplicatiable. I think this is reasonable. - preinit_with = [(gc (normalise (maxBound, preinit_heap, [], anned_e')), accessor_e) | (x', anned_e) <- h_unfoldings, (accessor_e, anned_e') <- eta ids (var x') anned_e] + preinit_with = [(gc (normalise (maxBound, heap', [], anned_e')), accessor_e) + | (x', anned_e) <- h_unfoldings + , (heap', accessor_e, anned_e') <- eta preinit_heap (var x') anned_e] -- FIXME: instead of adding unfoldings as Let, (in order to sidestep the bug where Let stuff will be underspecialised) -- we should add it them as normal bindings but pre-initialise the memo cache. Of course this will be bad in the case @@ -322,8 +324,8 @@ prepareTerm unfoldings e = pprTraceSC "unfoldings" (pPrintPrecLetRec noPrec (M.t -- Especially when we do eager value splitting, we might never actually match against the RHS of a binding like (map = \f xs -> ...). -- This "hack" is designed to work around this issue by doing some eager value splitting of our own on lambdas. -eta :: InScopeSet -> FVedTerm -> In AnnedTerm -> [(FVedTerm, In AnnedTerm)] -eta ids accessor_e0 in_e = (accessor_e0, in_e) : case termToAnswer ids in_e of +eta :: Heap -> FVedTerm -> In AnnedTerm -> [(Heap, FVedTerm, In AnnedTerm)] +eta heap@(Heap h ids) accessor_e0 in_e = (heap, accessor_e0, in_e) : case termToAnswer ids in_e of Just anned_a | (a_cast, (rn, v)) <- extract anned_a , let accessor_e1 = case a_cast of Uncast -> accessor_e0 CastBy co _ -> accessor_e0 `cast` mkSymCo ids co @@ -333,11 +335,10 @@ eta ids accessor_e0 in_e = (accessor_e0, in_e) : case termToAnswer ids in_e of _ -> Nothing (ids', rn', x') = renameNonRecBinder ids rn x , Just (accessor_e2, _, e_body) <- mb_res - -> eta ids' accessor_e2 (rn', e_body) + -> eta (Heap (M.insert x' lambdaBound h) ids') accessor_e2 (rn', e_body) _ -> [] - data SCStats = SCStats { stat_reduce_stops :: !Int, stat_sc_stops :: !Int diff --git a/compiler/supercompile/Supercompile/Drive/Process3.hs b/compiler/supercompile/Supercompile/Drive/Process3.hs index 5977e1e..9ca615d 100644 --- a/compiler/supercompile/Supercompile/Drive/Process3.hs +++ b/compiler/supercompile/Supercompile/Drive/Process3.hs @@ -68,8 +68,8 @@ data MemoState = MS { hNames :: Stream Name } -promise :: (State, State) -> MemoState -> (Promise, MemoState) -promise (state, reduced_state) ms = (p, ms') +promise :: MemoState -> (State, State) -> (MemoState, Promise) +promise ms (state, reduced_state) = (ms', p) where (vs_list, h_ty) = stateAbsVars (Just (stateLambdaBounders reduced_state)) state h_name :< h_names' = hNames ms x = mkLocalId h_name h_ty @@ -330,7 +330,7 @@ memo opt state ; res <- addParentM p (opt (Just (getOccString (varName (fun p))))) state ; traceRenderM "<sc }" (fun p, PrettyDoc (pPrintFullState quietStatePrettiness state), res) ; fulfillM p res }, s { scpMemoState = ms' }) - where (p, ms') = promise (state, reduced_state) (scpMemoState s) + where (ms', p) = promise (scpMemoState s) (state, reduced_state) where (state_did_reduce, reduced_state) = reduceForMatch state -- The idea here is to prevent the supercompiler from building loops when doing instance matching. Without @@ -417,5 +417,16 @@ reduceForMatch :: State -> (Bool, State) reduceForMatch state = second gc $ reduceWithFlag (case state of (_, h, k, e) -> (maxBound, h, k, e)) -- Reduce ignoring deeds for better normalisation supercompile :: M.Map Var Term -> Term -> Term -supercompile unfoldings e = fVedTermToTerm $ runScpM (tagAnnotations state) $ liftM snd $ sc state - where (state, _) = prepareTerm unfoldings e +supercompile unfoldings e = fVedTermToTerm $ runScpM (tagAnnotations state) $ do + the_state <- if pREINITALIZE_MEMO_TABLE + then preinitalise preinit_with >> return preinit_state + else return state + liftM snd $ sc the_state + where (state, (preinit_with, preinit_state)) = prepareTerm unfoldings e + +preinitalise :: [(State, FVedTerm)] -> ScpM () +preinitalise states_fulfils = do + ps_es' <- ScpM $ StateT $ \s -> do + let (ms', ps_es') = mapAccumL (\ms (state, e') -> second (flip (,) e') $ promise ms (state, snd (reduceForMatch state))) (scpMemoState s) states_fulfils + return (ps_es', s { scpMemoState = ms' }) + mapM_ (\(p, e') -> fulfillM p (emptyDeeds, e')) ps_es' diff --git a/compiler/supercompile/Supercompile/StaticFlags.hs b/compiler/supercompile/Supercompile/StaticFlags.hs index 6379636..c9addba 100644 --- a/compiler/supercompile/Supercompile/StaticFlags.hs +++ b/compiler/supercompile/Supercompile/StaticFlags.hs @@ -42,6 +42,9 @@ pOSITIVE_INFORMATION :: Bool pOSITIVE_INFORMATION = lookUp $ fsLit "-fsupercompiler-positive-information" --pOSITIVE_INFORMATION = True +pREINITALIZE_MEMO_TABLE :: Bool +pREINITALIZE_MEMO_TABLE = not $ lookUp $ fsLit "-fsupercompiler-no-preinitalize" + data DeedsPolicy = FCFS | Proportional deriving (Read) _______________________________________________ Cvs-ghc mailing list Cvs-ghc@haskell.org http://www.haskell.org/mailman/listinfo/cvs-ghc