[add case-pullin optimization. disable some optimizations on trailing cases to avoid backpedaling
John Meacham <john@repetae.net>**20060420141258] hunk ./Grin/Simplify.hs 253
+combine pe nty e = error $ "combine: " ++ show (pe,nty,e)
hunk ./Grin/Simplify.hs 263
+mapExp f (b :-> e) = b :-> f e
+
+sizeLam (b :-> exp) = sizeExp exp
+sizeExp (x :>>= y) = sizeExp x + sizeLam y
+sizeExp (Case e as) = 1 + sum (map sizeLam as)
+sizeExp x = 1
+
hunk ./Grin/Simplify.hs 273
-    --f (e :>>= v1 :-> Return v2 :>>= lr) | (isTup v1 || isVar v1) && v1 == v2 = do
-    --    mtick "Optimize.optimize.unit-unit"
-    --    f (e :>>= lr)
+    f (Case e as :>>= lam)  | (sizeLam lam - 1) * length as <= 3 = do
+        mtick "Optimize.optimize.case-pullin"
+        return (Case e (map (mapExp (:>>= lam)) as))
hunk ./Grin/Simplify.hs 352
-    f cs@(Case x as) | Just UnboxTag <- isCombinable postEval cs = do
+    f (cs@(Case x as) :>>= lr) | Just UnboxTag <- isCombinable postEval cs = do
hunk ./Grin/Simplify.hs 356
-        f (Case x (map (combineLam postEval TyTag) as) :>>= Var va TyTag :-> Return (NodeV va []))
-    f cs@(Case x as) | Just (UnboxTup (t,ts)) <- isCombinable postEval cs = do
+        return ((Case x (map (combineLam postEval TyTag) as) :>>= Var va TyTag :-> Return (NodeV va [])) :>>= lr)
+    f (cs@(Case x as) :>>= lr) | Just (UnboxTup (t,ts)) <- isCombinable postEval cs = do
hunk ./Grin/Simplify.hs 362
-        f (Case x (map (combineLam postEval (tuple ts)) as) :>>= tuple vars  :-> Return (NodeC t vars))
-    f cs@(Case x as) | Just (UnboxConst val) <- isCombinable postEval cs = do
+        return ((Case x (map (combineLam postEval (tuple ts)) as) :>>= tuple vars  :-> Return (NodeC t vars)) :>>= lr)
+    f (cs@(Case x as) :>>= lr) | Just (UnboxConst val) <- isCombinable postEval cs = do
hunk ./Grin/Simplify.hs 365
-        f (Case x (map (combineLam postEval tyUnit) as) :>>= unit :-> Return val)
+        return ((Case x (map (combineLam postEval tyUnit) as) :>>= unit :-> Return val) :>>= lr)