From 61fdce014466a517e71e3abc0fe568f5895b46bb Mon Sep 17 00:00:00 2001 From: Matthijs Kooijman Date: Thu, 18 Jun 2009 14:48:36 +0200 Subject: [PATCH] Add a inlinebind helper function. This function can create a transformation that will inline some bindings in a let expression, based on a condition function passed in. --- NormalizeTools.hs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/NormalizeTools.hs b/NormalizeTools.hs index 193af61..6699101 100644 --- a/NormalizeTools.hs +++ b/NormalizeTools.hs @@ -5,6 +5,7 @@ module NormalizeTools where -- Standard modules import Debug.Trace +import qualified List import qualified Data.Monoid as Monoid import qualified Control.Monad as Monad import qualified Control.Monad.Trans.State as State @@ -123,6 +124,18 @@ dotransforms' transs expr = do (expr', changed) <- Writer.runWriterT $ Monad.foldM (flip ($)) expr transs if Monoid.getAny changed then dotransforms' transs expr' else return expr' +-- Inline all let bindings that satisfy the given condition +inlinebind :: ((CoreBndr, CoreExpr) -> Bool) -> Transform +inlinebind condition (Let (Rec binds) expr) | not $ null replace = + change newexpr + where + -- Find all simple bindings + (replace, others) = List.partition condition binds + -- Substitute the to be replaced binders with their expression + newexpr = substitute replace (Let (Rec others) expr) +-- Leave all other expressions unchanged +inlinebind _ expr = return expr + -- Sets the changed flag in the TransformMonad, to signify that some -- transform has changed the result setChanged :: TransformMonad () -- 2.30.2