X-Git-Url: https://git.stderr.nl/gitweb?a=blobdiff_plain;f=clash%2FCLasH%2FNormalize.hs;h=2778aa22057250a10ed65f92fb3d818495c5181e;hb=0e1a00f9a5b95f27cc10b3ffaa6533b6f321fd5c;hp=4fcc59a7470ac2a9f30b25d9d364be3ec83a5a8a;hpb=3a0511f8f05824dcd61264b2dd98bee42fe3ddbc;p=matthijs%2Fmaster-project%2Fc%CE%BBash.git diff --git a/clash/CLasH/Normalize.hs b/clash/CLasH/Normalize.hs index 4fcc59a..2778aa2 100644 --- a/clash/CLasH/Normalize.hs +++ b/clash/CLasH/Normalize.hs @@ -490,7 +490,23 @@ casesimpl c expr@(Case scrut bndr ty alts) | not bndr_used = do -- sideeffect. doalt :: CoreAlt -> TransformMonad ([(CoreBndr, CoreExpr)], CoreAlt) doalt (LitAlt _, _, _) = error $ "Don't know how to handle LitAlt in case expression: " ++ pprString expr - doalt alt@(DEFAULT, [], expr) = return ([], alt) + doalt alt@(DEFAULT, [], expr) = do + local_var <- Trans.lift $ is_local_var expr + repr <- isRepr expr + -- Extract any expressions that is not a local var already and is + -- representable (to prevent loops with inlinenonrep). + (exprbinding_maybe, expr') <- if (not local_var) && repr + then do + id <- Trans.lift $ mkBinderFor expr "caseval" + -- We don't flag a change here, since casevalsimpl will do that above + -- based on Just we return here. + return (Just (id, expr), Var id) + else + -- Don't simplify anything else + return (Nothing, expr) + let newalt = (DEFAULT, [], expr') + let bindings = Maybe.catMaybes [exprbinding_maybe] + return (bindings, newalt) doalt (DataAlt dc, bndrs, expr) = do -- Make each binder wild, if possible bndrs_res <- Monad.zipWithM dobndr bndrs [0..]