Limit flattenLets to non-recursive lets only.
authorMatthijs Kooijman <m.kooijman@student.utwente.nl>
Fri, 14 Aug 2009 13:38:03 +0000 (15:38 +0200)
committerMatthijs Kooijman <m.kooijman@student.utwente.nl>
Fri, 14 Aug 2009 13:40:29 +0000 (15:40 +0200)
flattenLets is currently used for splitNormalized only, which should be
non-recursive lets only. To use it in other places to filter lets, we
should only flatten non-recursive lets, so we can create new non-recursive
lets afterwards.

cλash/CLasH/Utils/Core/CoreTools.hs

index 21c5e1465f5a052a580ea64fce150a08ac2ab01b..3945cce2a72dcf5ef55a6e87d3bb2980eab553b7 100644 (file)
@@ -298,19 +298,17 @@ hasStateType expr = case getType expr of
   Just ty -> isStateType ty
 
 
--- | 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.
+-- | Flattens nested non-recursive 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 ::
   CoreSyn.CoreExpr -- ^ The expression to flatten.
   -> ([Binding], CoreSyn.CoreExpr) -- ^ The bindings and resulting expression.
-flattenLets (CoreSyn.Let binds expr) = 
-  (bindings ++ bindings', expr')
+flattenLets (CoreSyn.Let (CoreSyn.NonRec bndr expr) res) =
+  ((bndr, expr):bindings, res')
   where
     -- Recursively flatten the contained expression
-    (bindings', expr') =flattenLets expr
-    -- Flatten our own bindings to remove the Rec / NonRec constructors
-    bindings = CoreSyn.flattenBinds [binds]
+    (bindings, res') = flattenLets res
 flattenLets expr = ([], expr)
 
 -- | A class of things that (optionally) have a core Type. The type is