Make splitNormalized work for non-recursive lets.
authorMatthijs Kooijman <m.kooijman@student.utwente.nl>
Thu, 13 Aug 2009 14:24:44 +0000 (16:24 +0200)
committerMatthijs Kooijman <m.kooijman@student.utwente.nl>
Thu, 13 Aug 2009 14:24:44 +0000 (16:24 +0200)
For now, normalized expressions can only contain a (single) recursive let,
but this should become nested non-recursive lets only in the future.

cλash/CLasH/Normalize.hs

index 7fb0dc235d2a60d8a3e3798b8a655e9f6f3218f7..1d40f92d52f7b94989fc9215bcfd15723a9001e0 100644 (file)
@@ -595,9 +595,25 @@ getBinding bndr = Utils.makeCached bndr tsBindings $ do
 splitNormalized ::
   CoreExpr -- ^ The normalized expression
   -> ([CoreBndr], [Binding], CoreBndr)
-splitNormalized expr = 
-  case letexpr of
-    (Let (Rec binds) (Var res)) -> (args, binds, res)
-    _ -> error $ "Normalize.splitNormalized: Not in normal form: " ++ pprString expr ++ "\n"
+splitNormalized expr = (args, binds, res)
   where
     (args, letexpr) = CoreSyn.collectBinders expr
+    (binds, resexpr) = flattenLets letexpr
+    res = case resexpr of 
+      (Var x) -> x
+      _ -> error $ "Normalize.splitNormalized: Not in normal form: " ++ pprString expr ++ "\n"
+
+-- | 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.
+flattenLets ::
+  CoreExpr -- ^ The expression to flatten.
+  -> ([Binding], CoreExpr) -- ^ The bindings and resulting expression.
+flattenLets (Let binds expr) = 
+  (bindings ++ bindings', expr')
+  where
+    -- Recursively flatten the contained expression
+    (bindings', expr') =flattenLets expr
+    -- Flatten our own bindings to remove the Rec / NonRec constructors
+    bindings = CoreSyn.flattenBinds [binds]
+flattenLets expr = ([], expr)