[turn case of all enums into a case on the tags directly
John Meacham <john@repetae.net>**20060128042507] hunk ./C/FromGrin.hs 253
+        da (Tag t :-> e) = do
+            e' <- convertBody e
+            return $ (Just (enum (nodeTagName t)), e')
hunk ./Grin/PointsToAnalysis.hs 227
+-- TODO - follow tags through
+-- bind (NodeV t []) _ = tell mempty { varEq = [(t, Basic)] }
hunk ./Grin/PointsToAnalysis.hs 529
+toPos Tag {} = return Basic
hunk ./Grin/PointsToAnalysis.hs 531
-toPos u | u == unit = return Basic
hunk ./Grin/Simplify.hs 3
+import Control.Monad.Identity
hunk ./Grin/Simplify.hs 6
-import Control.Monad.Identity
-import Data.Map as Map
hunk ./Grin/Simplify.hs 7
-import Data.Set as Set
hunk ./Grin/Simplify.hs 9
+import qualified Data.Map as Map
+import qualified Data.Set as Set
hunk ./Grin/Simplify.hs 13
-import GenUtil hiding(putErrLn)
-import Support.CanType
+import C.Prims
hunk ./Grin/Simplify.hs 15
+import GenUtil hiding(putErrLn)
hunk ./Grin/Simplify.hs 17
-import C.Prims
hunk ./Grin/Simplify.hs 18
+import qualified Util.Histogram as Hist
hunk ./Grin/Simplify.hs 20
+import Support.CanType
hunk ./Grin/Simplify.hs 24
-import Util.Histogram as Hist
hunk ./Grin/Simplify.hs 176
-varBind :: Monad m => Val -> Val -> m (Map Var Val)
+varBind :: Monad m => Val -> Val -> m (Map.Map Var Val)
hunk ./Grin/Simplify.hs 187
-varBind' :: Monad m => Val -> Val -> m (Map Var Val)
+varBind' :: Monad m => Val -> Val -> m (Map.Map Var Val)
hunk ./Grin/Simplify.hs 225
-optimize1 ::  (Atom,Lam) -> StatM Lam
-optimize1 (n,l) = g l where
+optimize1 ::  Bool -> (Atom,Lam) -> StatM Lam
+optimize1 postEval (n,l) = g l where
hunk ./Grin/Simplify.hs 289
+    f cs@(Case x as) | postEval && all isEnum [ p | p :-> _ <- as] = do
+        mtick "Optimize.optimize.case-enum"
+        let fv = freeVars cs `Set.union` freeVars [ p | p :-> _ <- as ]
+            (va:vb:_vr) = [ v | v <- [v1..], not $ v `Set.member` fv ]
+        f (Return x :>>= NodeV va [] :-> Case (Var va TyTag) (Prelude.map (untagPat vb) as))
+
hunk ./Grin/Simplify.hs 339
+isEnum (NodeC t []) = True
+isEnum (Var t TyNode) = True
+isEnum _ = False
+
+untagPat _ (NodeC t [] :-> e) = Tag t :-> e
+untagPat vb (v@Var{} :-> e) = Var vb TyTag :-> Return (NodeV vb []) :>>= v :-> e
+
+
hunk ./Grin/Simplify.hs 404
-                let (nl',stat) = runStatM (optimize1 (a,nl''))
+                let (nl',stat) = runStatM (optimize1 postEval (a,nl''))