[rearrange more of the simplifier, push contexts into lets, when doing the case-improve-default optimization, have the simplifier keep going.
John Meacham <john@repetae.net>**20061129065537] hunk ./E/SSimplify.hs 425
+    | Coerce Range Cont
hunk ./E/SSimplify.hs 457
+    makeRange b = do
+        sub <- asks envSubst
+        return $ susp b sub
hunk ./E/SSimplify.hs 464
-        sub <- asks envSubst
-        f ApplyTo { contArg = susp b sub, contNext = c } a
+        b' <- makeRange b
+        f ApplyTo { contArg = b', contNext = c } a
hunk ./E/SSimplify.hs 480
-
-    f cont e | isApplyTo cont = els
-             | otherwise = tryEta
-            where
-            els = do
-                x' <- g e
-                x'' <- coerceOpt return x'
-                x <- primOpt' (so_dataTable sopts) x''
-                done cont x
-            tryEta = do
-                eed <- etaExpandDef (so_dataTable sopts) 0 tvr { tvrIdent = 0 } e
-                case eed of
-                    Just (_,e) -> f cont e
-                    Nothing -> els
-
-    g :: InE -> SM OutE
-    --g e | trace ("g: " ++ take 20 (show e)) False = undefined
-    g (EPrim a es t) = return (EPrim a) `ap` mapM dosub es `ap` dosub t
-    g e@ELit {} = dosub e
-    g e@(EPi (TVr { tvrIdent = n }) _) = do
-        addNames [n]
-        e' <- dosub e
-        return e'
-    g (EError s t) = do EError s `fmap` dosub t
-    g ec@ECase { eCaseScrutinee = e, eCaseBind = b, eCaseAlts = as, eCaseDefault = d} = do
-        addNames (map tvrIdent $ caseBinds ec)
-        e' <- f (Scrutinee False) e
-        doCase e' (eCaseType ec) b as d
-    g (ELam v e)  = do
+    f (Coerce t cont) (EError s _) = evalRange t >>= \t' -> done cont (EError s t')
+    f (Coerce t cont) (ELit (LitInt n _)) = evalRange t >>= \t' -> done cont (ELit (LitInt n t'))
+    f cont v | Just (e,t) <- from_unsafeCoerce v =
+        makeRange t >>= \t' -> f (g t' cont) e where g t' (Coerce _ cont) = Coerce t' cont
+    f cont ep@EPrim {} = do
+        ep' <- primOpt' (so_dataTable sopts) ep
+        ep'' <- dosub ep'
+        done cont ep''
+    f cont e@ELit {} = dosub e >>= done cont
+    f cont (ELam v e)  = do
hunk ./E/SSimplify.hs 493
-        return $ ELam v' e'
-    g ELetRec { eDefs = ds@(_:_), eBody =  e } = do
+        done cont $ ELam v' e'
+    f cont e@(EPi (TVr { tvrIdent = n }) _) = do
+        addNames [n]
+        e' <- dosub e
+        done cont e'
+    f cont (EError s t) = (EError s `fmap` dosub t) >>= done cont
+    f cont ec@ECase { eCaseScrutinee = e, eCaseBind = b, eCaseAlts = as, eCaseDefault = d} = do
+        addNames (map tvrIdent $ caseBinds ec)
+        e' <- f (Scrutinee (not $ null as)) e
+        ec' <- doCase e' (eCaseType ec) b as d
+        done cont ec'
+    f cont ELetRec { eDefs = ds@(_:_), eBody =  e } = do
hunk ./E/SSimplify.hs 506
-        e' <- localEnv (const inb') $ f StartContext e
-        case ds' of
+        e' <- localEnv (const inb') $ f cont e
+        res <- case ds' of
hunk ./E/SSimplify.hs 528
+        done StartContext res
+    f cont e = dosub e >>= done cont
+--    f cont e | isApplyTo cont = els
+--             | otherwise = tryEta
+--            where
+--            els = do
+--                x' <- dosub e
+--                done cont x'
+--            tryEta = do
+--                eed <- etaExpandDef (so_dataTable sopts) 0 tvr { tvrIdent = 0 } e
+--                case eed of
+--                    Just (_,e) -> f cont e
+--                    Nothing -> els
+
+    g :: InE -> SM OutE
+    --g e | trace ("g: " ++ take 20 (show e)) False = undefined
hunk ./E/SSimplify.hs 590
-            f n = do
+            ff n = do
hunk ./E/SSimplify.hs 599
-        ls' <- mapM f ls
-        ec <- dosub $ caseUpdate emptyCase { eCaseScrutinee = e, eCaseType = t, eCaseBind = b, eCaseAlts = as ++ ls' }
-        return $ caseUpdate ec { eCaseScrutinee = e }
-        --doCase e t b (as ++ ls') Nothing inb
+        ls' <- mapM ff ls
+        --ec <- dosub $ caseUpdate emptyCase { eCaseScrutinee = e, eCaseType = t, eCaseBind = b, eCaseAlts = as ++ ls' }
+        --localEnv (envSubst_s mempty) $ f StartContext (caseUpdate ec { eCaseScrutinee = e })
+        doCase e t b (as ++ ls') Nothing
hunk ./E/SSimplify.hs 724
+        z (Coerce t cont) rs = do
+            t' <- evalRange t
+            z <- h e (reverse rs)
+            done cont (prim_unsafeCoerce z t')