Also simplify expressions of the DEFAULT alternative of case expressions
authorchristiaanb <christiaan.baaij@gmail.com>
Tue, 22 Jun 2010 09:36:28 +0000 (11:36 +0200)
committerchristiaanb <christiaan.baaij@gmail.com>
Tue, 22 Jun 2010 09:36:28 +0000 (11:36 +0200)
clash/CLasH/Normalize.hs

index 4fcc59a7470ac2a9f30b25d9d364be3ec83a5a8a..89f21c00ef0ecf83661a8a6248b5ae6b758d69d4 100644 (file)
@@ -490,7 +490,21 @@ 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
   -- 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
+    (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..]
   doalt (DataAlt dc, bndrs, expr) = do
     -- Make each binder wild, if possible
     bndrs_res <- Monad.zipWithM dobndr bndrs [0..]