Add a inlinebind helper function.
authorMatthijs Kooijman <m.kooijman@student.utwente.nl>
Thu, 18 Jun 2009 12:48:36 +0000 (14:48 +0200)
committerMatthijs Kooijman <m.kooijman@student.utwente.nl>
Thu, 18 Jun 2009 12:54:11 +0000 (14:54 +0200)
This function can create a transformation that will inline some bindings
in a let expression, based on a condition function passed in.

NormalizeTools.hs

index 193af61edc717571bccfd9def970f142e7c8c7e6..6699101d33bc18a3a90a8870ce18d095cd72b129 100644 (file)
@@ -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 ()