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

On branch  : supercompiler

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

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

commit fa91c6f169bd58b6cc523b9c48ff9c536daa4bdb
Author: Max Bolingbroke <batterseapo...@hotmail.com>
Date:   Tue Jun 21 19:51:15 2011 +0100

    Deal with [CoreBind] by going via CoreExpr

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

 compiler/supercompile/Supercompile.hs           |   23 ++++++++++++++++-------
 compiler/supercompile/Supercompile/Utilities.hs |    4 ++--
 2 files changed, 18 insertions(+), 9 deletions(-)

diff --git a/compiler/supercompile/Supercompile.hs 
b/compiler/supercompile/Supercompile.hs
index ee45aa6..a69cdc5 100644
--- a/compiler/supercompile/Supercompile.hs
+++ b/compiler/supercompile/Supercompile.hs
@@ -6,10 +6,12 @@ import qualified Supercompile.Evaluator.Syntax as S
 import qualified Supercompile.Drive.Process as S
 
 import CoreSyn
+import CoreUtils  (exprType)
 import DataCon    (DataCon, dataConWorkId, dataConName)
 import Var        (isTyVar)
 import Id         (mkSysLocalM, idType)
 import MkId       (mkPrimOpId)
+import MkCore     (mkBigCoreVarTup, mkTupleSelector, mkWildValBinder)
 import FastString (mkFastString)
 import PrimOp     (PrimOp, primOpType)
 import Type       (Type)
@@ -54,7 +56,7 @@ data ParseState = ParseState {
 
 initParseState :: ParseState
 initParseState = ParseState {
-    uniqSupply = parseUniqSupply,
+    uniqSupply = anfUniqSupply,
     dcWrappers = M.empty,
     primWrappers = M.empty
   }
@@ -118,8 +120,8 @@ appE e1 e2 = nameIt (argOf (desc e1)) e2 >>= \x2 -> return 
(e1 `S.app` x2)
 
 
 
-termToCoreExpr :: CoreExpr -> S.Term
-termToCoreExpr = uncurry S.letRecSmart . runParseM . term
+coreExprToTerm :: CoreExpr -> S.Term
+coreExprToTerm = uncurry S.letRecSmart . runParseM . term
   where
     term (Var x) -- | Just pop <- isPrimOpId_maybe x     = primWrapper pop
                  -- | Just dc <- isDataConWorkId_maybe x = dataConWrapper dc
@@ -142,8 +144,8 @@ termToCoreExpr = uncurry S.letRecSmart . runParseM . term
     alt (DataAlt dc, xs, e) = fmap ((,) (S.DataAlt dc xs)) $ term e
     alt it                  = pprPanic "termToCoreExpr" (ppr it)
 
-coreExprToTerm :: S.Term -> CoreExpr
-coreExprToTerm = term
+termToCoreExpr :: S.Term -> CoreExpr
+termToCoreExpr = term
   where
     term e = case unI e of
         S.Var x            -> Var x
@@ -167,8 +169,15 @@ coreExprToTerm = term
     alt (S.LiteralAlt l,  e) = (LitAlt l,   [], term e)
     alt (S.DefaultAlt,    e) = (DEFAULT,    [], term e)
 
+coreBindsToCoreTerm :: [CoreBind] -> (CoreExpr, CoreExpr -> [CoreBind])
+coreBindsToCoreTerm binds
+  = (mkLets binds (mkBigCoreVarTup xs),
+     \e -> let wild_id = mkWildValBinder (exprType e) in [NonRec x 
(mkTupleSelector xs x wild_id e) | x <- xs])
+  where xs = bindersOfBinds binds
+
 supercompile :: CoreExpr -> CoreExpr
-supercompile = coreExprToTerm . snd . S.supercompile . termToCoreExpr
+supercompile = termToCoreExpr . snd . S.supercompile . coreExprToTerm
 
 supercompileProgram :: DynFlags -> [CoreBind] -> [CoreBind]
-supercompileProgram _dflags = undefined -- FIXME
+supercompileProgram _dflags binds = rebuild (supercompile e)
+  where (e, rebuild) = coreBindsToCoreTerm binds
diff --git a/compiler/supercompile/Supercompile/Utilities.hs 
b/compiler/supercompile/Supercompile/Utilities.hs
index 7247489..508413c 100644
--- a/compiler/supercompile/Supercompile/Utilities.hs
+++ b/compiler/supercompile/Supercompile/Utilities.hs
@@ -479,6 +479,6 @@ apportion orig_n weighting
 
 
 {-# NOINLINE prettyUniqSupply #-}
-hFunctionsUniqSupply, supercompileUniqSupply, parseUniqSupply, 
expandUniqSupply, reduceUniqSupply, tagUniqSupply, prettyUniqSupply, 
matchUniqSupply, splitterUniqSupply :: UniqSupply
+hFunctionsUniqSupply, supercompileUniqSupply, anfUniqSupply, expandUniqSupply, 
reduceUniqSupply, tagUniqSupply, prettyUniqSupply, matchUniqSupply, 
splitterUniqSupply :: UniqSupply
 supercompileUniqSupply = unsafePerformIO $ mkSplitUniqSupply 'p'
-(hFunctionsUniqSupply:parseUniqSupply:expandUniqSupply:reduceUniqSupply:tagUniqSupply:prettyUniqSupply:matchUniqSupply:splitterUniqSupply:_)
 = listSplitUniqSupply supercompileUniqSupply
+(hFunctionsUniqSupply:anfUniqSupply:expandUniqSupply:reduceUniqSupply:tagUniqSupply:prettyUniqSupply:matchUniqSupply:splitterUniqSupply:_)
 = listSplitUniqSupply supercompileUniqSupply



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

Reply via email to