Make letremoveunused work for recursive lets again.
authorMatthijs Kooijman <m.kooijman@student.utwente.nl>
Mon, 17 Aug 2009 09:28:20 +0000 (11:28 +0200)
committerMatthijs Kooijman <m.kooijman@student.utwente.nl>
Mon, 17 Aug 2009 09:28:20 +0000 (11:28 +0200)
The non-recursive version is also changed to work for each nested let in
turn, instead of running on a bunch of them at the same time.

cλash/CLasH/Normalize.hs

index a7223e3d8d0433ca55f21a3c5e7a729afb63a4d2..b16eb7ae536f89e475e58851296d98af08e21c4f 100644 (file)
@@ -248,13 +248,17 @@ letremovesimpletop = everywhere ("letremovesimple", inlinebind (\(b, e) -> Trans
 -- Unused let binding removal
 --------------------------------
 letremoveunused, letremoveunusedtop :: Transform
-letremoveunused expr@(Let _ _) = do
+letremoveunused expr@(Let (NonRec b bound) res) = do
+  let used = expr_uses_binders [b] res
+  if used
+    then return expr
+    else change res
+letremoveunused expr@(Let (Rec binds) res) = 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) (mkNonRecLets binds' res)
+  changeif (length binds' /= length binds) (Let (Rec 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