X-Git-Url: https://git.stderr.nl/gitweb?a=blobdiff_plain;f=c%CE%BBash%2FCLasH%2FNormalize.hs;h=75ab7380f0bca63f40bac1c4f423ef356e8c2c19;hb=9ebf03351aaec723053b7911aac922fbf2417756;hp=2b5c8999147c03662ff5bf806cab27af9e992ff3;hpb=74c1f82bd035a57c9df445d803644fb338b32120;p=matthijs%2Fmaster-project%2Fc%CE%BBash.git diff --git "a/c\316\273ash/CLasH/Normalize.hs" "b/c\316\273ash/CLasH/Normalize.hs" index 2b5c899..75ab738 100644 --- "a/c\316\273ash/CLasH/Normalize.hs" +++ "b/c\316\273ash/CLasH/Normalize.hs" @@ -158,26 +158,14 @@ retvalsimpltop = everywhere ("retvalsimpl", retvalsimpl) -------------------------------- -- let derecursification -------------------------------- -letderec, letderectop :: Transform -letderec c expr@(Let (Rec binds) res) = case liftable of - -- Nothing is liftable, just return - [] -> return expr - -- Something can be lifted, generate a new let expression - _ -> 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 - -- 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 - -- single bind recursive let. - canlift (bndr, e) = not $ expr_uses_binders bndrs e +letrec, letrectop :: Transform +letrec c expr@(Let (NonRec bndr val) res) = + change $ Let (Rec [(bndr, val)]) res + -- Leave all other expressions unchanged -letderec c expr = return expr +letrec c expr = return expr -- Perform this transform everywhere -letderectop = everywhere ("letderec", letderec) +letrectop = everywhere ("letrec", letrec) -------------------------------- -- let flattening @@ -805,7 +793,7 @@ funextracttop = everywhere ("funextract", funextract) -- What transforms to run? -transforms = [inlinedicttop, inlinetopleveltop, classopresolutiontop, argproptop, funextracttop, etatop, betatop, castproptop, letremovesimpletop, letderectop, letremovetop, retvalsimpltop, letflattop, scrutsimpltop, scrutbndrremovetop, casesimpltop, caseremovetop, inlinenonreptop, appsimpltop, letremoveunusedtop, castsimpltop] +transforms = [inlinedicttop, inlinetopleveltop, classopresolutiontop, argproptop, funextracttop, etatop, betatop, castproptop, letremovesimpletop, letrectop, letremovetop, retvalsimpltop, letflattop, scrutsimpltop, scrutbndrremovetop, casesimpltop, caseremovetop, inlinenonreptop, appsimpltop, letremoveunusedtop, castsimpltop] -- | Returns the normalized version of the given function, or an error -- if it is not a known global binder. @@ -856,9 +844,9 @@ normalizeExpr what expr = do trace (what ++ " before normalization:\n\n" ++ showSDoc ( ppr expr_uniqued ) ++ "\n") $ return () expr' <- dotransforms transforms expr_uniqued endcount <- MonadState.get tsTransformCounter - trace ("\n" ++ what ++ " after normalization:\n\n" ++ showSDoc ( ppr expr')) $ return () - trace ("\nNeeded " ++ show (endcount - startcount) ++ " transformations to normalize " ++ what) $ return () - return expr' + trace ("\n" ++ what ++ " after normalization:\n\n" ++ showSDoc ( ppr expr') + ++ "\nNeeded " ++ show (endcount - startcount) ++ " transformations to normalize " ++ what) $ + return expr' -- | Split a normalized expression into the argument binders, top level -- bindings and the result binder.