From b8c86a6e49e6fb3e2140ff3ca4fa9ecab9881219 Mon Sep 17 00:00:00 2001 From: Matthijs Kooijman Date: Wed, 31 Mar 2010 17:20:20 +0200 Subject: [PATCH] Revert "Make inlinebind work for non-recursive lets." MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit This reverts commit 077fe523188b85aff82569232acecfc9dbb082cb. Conflicts: cλash/CLasH/Normalize/NormalizeTools.hs --- .../CLasH/Normalize/NormalizeTools.hs" | 27 ++++++++++++------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git "a/c\316\273ash/CLasH/Normalize/NormalizeTools.hs" "b/c\316\273ash/CLasH/Normalize/NormalizeTools.hs" index 4d5b40c..be36349 100644 --- "a/c\316\273ash/CLasH/Normalize/NormalizeTools.hs" +++ "b/c\316\273ash/CLasH/Normalize/NormalizeTools.hs" @@ -6,6 +6,7 @@ module CLasH.Normalize.NormalizeTools where -- Standard modules import qualified Data.Monoid as Monoid +import qualified Data.Either as Either import qualified Control.Monad as Monad import qualified Control.Monad.Trans.Writer as Writer import qualified "transformers" Control.Monad.Trans as Trans @@ -111,16 +112,22 @@ dotransforms transs expr = do -- Inline all let bindings that satisfy the given condition inlinebind :: ((CoreBndr, CoreExpr) -> TransformMonad Bool) -> Transform -inlinebind condition context expr@(Let (NonRec bndr expr') res) = do - applies <- condition (bndr, expr') - if applies - then do - -- Substitute the binding in res and return that - res' <- substitute_clone bndr expr' context res - change res' - else - -- Don't change this let - return expr +inlinebind condition context expr@(Let (Rec binds) res) = do + -- Find all bindings that adhere to the condition + res_eithers <- mapM docond binds + case Either.partitionEithers res_eithers of + -- No replaces? No change + ([], _) -> return expr + (replace, others) -> do + -- Substitute the to be replaced binders with their expression + newexpr <- Monad.foldM (\e (bndr, repl) -> substitute_clone bndr repl context e) (Let (Rec others) res) replace + change newexpr + where + docond :: (CoreBndr, CoreExpr) -> TransformMonad (Either (CoreBndr, CoreExpr) (CoreBndr, CoreExpr)) + docond b = do + res <- condition b + return $ case res of True -> Left b; False -> Right b + -- Leave all other expressions unchanged inlinebind _ context expr = return expr -- 2.30.2