X-Git-Url: https://git.stderr.nl/gitweb?a=blobdiff_plain;f=c%CE%BBash%2FCLasH%2FNormalize.hs;h=984d739f830e0f11c2e45fb60d822a6d21a6a12c;hb=26ad8ba14c7c63978fc51fc81b92888e8e3963ef;hp=8cbebad6978b29b687fbc4e6f1f133e2ac145b42;hpb=c4aa528c379ea8c2fa2fb0d5f8d8c70ba41fb699;p=matthijs%2Fmaster-project%2Fc%CE%BBash.git diff --git "a/c\316\273ash/CLasH/Normalize.hs" "b/c\316\273ash/CLasH/Normalize.hs" index 8cbebad..984d739 100644 --- "a/c\316\273ash/CLasH/Normalize.hs" +++ "b/c\316\273ash/CLasH/Normalize.hs" @@ -123,15 +123,12 @@ letderec expr@(Let (Rec binds) res) = case liftable of -- Nothing is liftable, just return [] -> return expr -- Something can be lifted, generate a new let expression - _ -> change $ MkCore.mkCoreLets newbinds res + _ -> change $ mkNonRecLets liftable (Let (Rec nonliftable) res) where -- Make a list of all the binders bound in this recursive let bndrs = map fst binds -- See which bindings are liftable (liftable, nonliftable) = List.partition canlift binds - -- Create nonrec bindings for each liftable binding and a single recursive - -- binding for all others - newbinds = (map (uncurry NonRec) liftable) ++ [Rec nonliftable] -- Any expression that does not use any of the binders in this recursive let -- can be lifted into a nonrec let. It can't use its own binder either, -- since that would mean the binding is self-recursive and should be in a @@ -207,12 +204,13 @@ letremovesimpletop = everywhere ("letremovesimple", inlinebind (\(b, e) -> Trans -- Unused let binding removal -------------------------------- letremoveunused, letremoveunusedtop :: Transform -letremoveunused expr@(Let (Rec binds) res) = do +letremoveunused expr@(Let _ _) = do -- Filter out all unused binds. let binds' = filter dobind binds -- Only set the changed flag if binds got removed - changeif (length binds' /= length binds) (Let (Rec binds') res) + changeif (length binds' /= length binds) (mkNonRecLets binds' res) where + (binds, res) = flattenLets expr bound_exprs = map snd binds -- For each bind check if the bind is used by res or any of the bound -- expressions @@ -228,9 +226,10 @@ letremoveunusedtop = everywhere ("letremoveunused", letremoveunused) -- TODO: We would very much like to use GHC's CSE module for this, but that -- doesn't track if something changed or not, so we can't use it properly. letmerge, letmergetop :: Transform -letmerge expr@(Let (Rec binds) res) = do +letmerge expr@(Let _ _) = do + let (binds, res) = flattenLets expr binds' <- domerge binds - return (Let (Rec binds') res) + return $ mkNonRecLets binds' res where domerge :: [(CoreBndr, CoreExpr)] -> TransformMonad [(CoreBndr, CoreExpr)] domerge [] = return [] @@ -310,7 +309,7 @@ casesimpl expr@(Case scrut b ty alts) = do (bindingss, alts') <- (Monad.liftM unzip) $ mapM doalt alts let bindings = concat bindingss -- Replace the case with a let with bindings and a case - let newlet = (Let (Rec bindings) (Case scrut b ty alts')) + let newlet = mkNonRecLets bindings (Case scrut b ty alts') -- If there are no non-wild binders, or this case is already a simple -- selector (i.e., a single alt with exactly one binding), already a simple -- selector altan no bindings (i.e., no wild binders in the original case), @@ -620,18 +619,3 @@ splitNormalized expr = (args, binds, res) res = case resexpr of (Var x) -> x _ -> error $ "Normalize.splitNormalized: Not in normal form: " ++ pprString expr ++ "\n" - --- | Flattens nested lets into a single list of bindings. The expression --- passed does not have to be a let expression, if it isn't an empty list of --- bindings is returned. -flattenLets :: - CoreExpr -- ^ The expression to flatten. - -> ([Binding], CoreExpr) -- ^ The bindings and resulting expression. -flattenLets (Let binds expr) = - (bindings ++ bindings', expr') - where - -- Recursively flatten the contained expression - (bindings', expr') =flattenLets expr - -- Flatten our own bindings to remove the Rec / NonRec constructors - bindings = CoreSyn.flattenBinds [binds] -flattenLets expr = ([], expr)