[added case-hoist-return optimization
John Meacham <john@repetae.net>**20060128204812] hunk ./Grin/DeadCode.hs 56
-        if not u then tick stats ("Optimize.dead-code.func.{" ++ show x) >> return [] else do
+        --if not u then tick stats ("Optimize.dead-code.func.{" ++ show x) >> return [] else do
+        if not u then tick stats "Optimize.dead-code.func" >> return [] else do
hunk ./Grin/Simplify.hs 15
-import GenUtil hiding(putErrLn)
+import GenUtil hiding(putErrLn,replicateM_)
hunk ./Grin/Simplify.hs 250
+modifyTail lam@(_ :-> lb) e = f e where
+    f (Error s ty) = Error s (getType lb)
+    f (Case x ls) = Case x (map g ls)
+    f (e1 :>>= p :-> e2) = e1 :>>= p :-> f e2
+    f e = e :>>= lam
+    g (p :-> e) = p :-> f e
+
+
hunk ./Grin/Simplify.hs 335
+    f (Case x alts :>>= v :-> Return v' :>>= NodeC t as :-> lr ) | v == v' = do
+        mtick "Optimize.optimize.case-hoist-return"
+        let (va:_) = [ v | v <- [v1..], not $ v `Set.member` fv ]
+            var = Var va TyNode
+            fv = freeVars as
+            mc = modifyTail ( var :-> Return var :>>=  NodeC t as :-> Return (tuple as))
+        f (mc (Case x alts) :>>= tuple as :-> Return (NodeC t as) :>>= v :-> lr)
+
+
hunk ./Grin/Simplify.hs 448
-    gv w@(vs,Case x xs) = do
+    gv w@(Tup vs,Case x xs) = do
hunk ./Grin/Simplify.hs 451
-        return (Just w)
+        let used v = any (`Set.member` uv) (freeVars v)
+        case partition used vs of
+            (_,[]) -> return $ Just w
+            (nvs,unused) -> do
+                replicateM_ (length unused) $ lift (tick stats "Optimize.simplify.dead-var-case-tup")
+                let ml = modifyTail (tuple vs :-> Return (tuple nvs))
+                return (Just (tuple nvs,ml (Case x xs) ))