-- Nothing is liftable, just return
[] -> return expr
-- Something can be lifted, generate a new let expression
- _ -> change $ MkCore.mkCoreLets newbinds res
+ _ -> change $ mkNonRecLets liftable (Let (Rec nonliftable) res)
where
-- Make a list of all the binders bound in this recursive let
bndrs = map fst binds
-- See which bindings are liftable
(liftable, nonliftable) = List.partition canlift binds
- -- Create nonrec bindings for each liftable binding and a single recursive
- -- binding for all others
- newbinds = (map (uncurry NonRec) liftable) ++ [Rec nonliftable]
-- Any expression that does not use any of the binders in this recursive let
-- can be lifted into a nonrec let. It can't use its own binder either,
-- since that would mean the binding is self-recursive and should be in a
letmerge expr@(Let _ _) = do
let (binds, res) = flattenLets expr
binds' <- domerge binds
- return $ MkCore.mkCoreLets (map (uncurry NonRec) binds') res
+ return $ mkNonRecLets binds' res
where
domerge :: [(CoreBndr, CoreExpr)] -> TransformMonad [(CoreBndr, CoreExpr)]
domerge [] = return []
import qualified CoreUtils
import qualified CoreFVs
import qualified Literal
+import qualified MkCore
-- Local imports
import CLasH.Translator.TranslatorTypes
(bindings, res') = flattenLets res
flattenLets expr = ([], expr)
+-- | Create bunch of nested non-recursive let expressions from the given
+-- bindings. The first binding is bound at the highest level (and thus
+-- available in all other bindings).
+mkNonRecLets :: [Binding] -> CoreSyn.CoreExpr -> CoreSyn.CoreExpr
+mkNonRecLets bindings expr = MkCore.mkCoreLets binds expr
+ where
+ binds = map (uncurry CoreSyn.NonRec) bindings
+
-- | A class of things that (optionally) have a core Type. The type is
-- optional, since Type expressions don't have a type themselves.
class TypedThing t where