[cache free variables inside of ECase terms always. lazy evaluation assures we don't pay a cost for this
John Meacham <john@repetae.net>**20061128020643] hunk ./E/Annotate.hs 91
-        return  ECase { eCaseScrutinee = e', eCaseType = t', eCaseDefault = d, eCaseBind = b', eCaseAlts = alts }
+        return $ caseUpdate ECase { eCaseScrutinee = e', eCaseType = t', eCaseDefault = d, eCaseBind = b', eCaseAlts = alts }
hunk ./E/Binary.hs 4
+import E.FreeVars(caseUpdate)
hunk ./E/Binary.hs 179
-    put_ bh (ECase aq ar as at au) = do
+    put_ bh (ECase aq ar as at au fv) = do
hunk ./E/Binary.hs 231
-		    return (ECase aq ar as at au)
+		    return (caseUpdate $ ECase aq ar as at au undefined)
hunk ./E/Demand.hs 326
-            return (ec { eCaseScrutinee = e', eCaseAlts = [Alt lc alt'] }, nenv :=> siga)
+            return (caseUpdate $ ec { eCaseScrutinee = e', eCaseAlts = [Alt lc alt'] }, nenv :=> siga)
hunk ./E/Demand.hs 359
-    return (ec' {eCaseScrutinee = ecs},nenv :=> siga)
+    return (caseUpdate $ ec' {eCaseScrutinee = ecs},nenv :=> siga)
hunk ./E/E.hs 111
-    return $ ec { eCaseAlts = as', eCaseDefault = d' }
+    return $ caseUpdate ec { eCaseAlts = as', eCaseDefault = d' }
hunk ./E/FreeVars.hs 6
+    caseUpdate,
hunk ./E/FreeVars.hs 62
+caseUpdate :: E -> E
+caseUpdate ec@ECase {} = ec { eCaseAllFV = fv ec } where
+    fv ECase { eCaseScrutinee = e, eCaseBind = b, eCaseAlts = as, eCaseDefault = d, eCaseType = ty } = mconcat (freeIds e:freeIds (tvrType  b):freeIds ty:(delete (tvrIdent b) $ mconcat (freeVars d:map freeVars as)  ):[])
+caseUpdate e = e
+
hunk ./E/FreeVars.hs 81
-    fv ECase { eCaseScrutinee = e, eCaseBind = b, eCaseAlts = as, eCaseDefault = d, eCaseType = ty } = mconcat ( fv e:freeVars (tvrType  b):freeVars ty:(delete (tvrIdent b) $ mconcat (freeVars d:map freeVars as)  ):[])
+    --fv ECase { eCaseScrutinee = e, eCaseBind = b, eCaseAlts = as, eCaseDefault = d, eCaseType = ty } = mconcat ( fv e:freeVars (tvrType  b):freeVars ty:(delete (tvrIdent b) $ mconcat (freeVars d:map freeVars as)  ):[])
+    fv ECase { eCaseAllFV = cfv } = cfv
hunk ./E/Inline.hs 89
-    return ec' { eCaseType = t }
+    return $ caseUpdate ec' { eCaseType = t }
hunk ./E/LambdaLift.hs 200
-            return ec { eCaseAlts = as', eCaseDefault = d'}
+            return $ caseUpdate ec { eCaseAlts = as', eCaseDefault = d'}
hunk ./E/LetFloat.hs 141
-        ans = letRec p' $ ec { eCaseScrutinee = (f e pe), eCaseAlts = [ Alt l (f e pn) | Alt l e <- as | pn <- ps ], eCaseDefault = (fmap (flip f pd) d)}
+        ans = letRec p' $ caseUpdate ec { eCaseScrutinee = (f e pe), eCaseAlts = [ Alt l (f e pn) | Alt l e <- as | pn <- ps ], eCaseDefault = (fmap (flip f pd) d)}
hunk ./E/LetFloat.hs 332
-        return ec' { eCaseScrutinee = scrut' }
+        return $ caseUpdate ec' { eCaseScrutinee = scrut' }
hunk ./E/SSimplify.hs 169
-        return ec { eCaseScrutinee = scrut', eCaseAlts = as', eCaseBind = annbind' fidm b, eCaseType = ct, eCaseDefault = d'}
+        return $ caseUpdate ec { eCaseScrutinee = scrut', eCaseAlts = as', eCaseBind = annbind' fidm b, eCaseType = ct, eCaseDefault = d'}
hunk ./E/SSimplify.hs 523
-                return $ ec { eCaseDefault = Just $ ELetRec [(t,def)] e', eCaseType = getType e' }
+                return $ caseUpdate ec { eCaseDefault = Just $ ELetRec [(t,def)] e', eCaseType = getType e' }
hunk ./E/SSimplify.hs 526
-                return $ ec { eCaseAlts = [Alt c (ELetRec [(t,def)] e')], eCaseType = getType e' }
+                return $ caseUpdate ec { eCaseAlts = [Alt c (ELetRec [(t,def)] e')], eCaseType = getType e' }
hunk ./E/SSimplify.hs 576
-        return ECase { eCaseScrutinee = e, eCaseType = t', eCaseBind = b, eCaseAlts = as'', eCaseDefault = d''} -- XXX     -- we duplicate code so continue for next renaming pass before going further.
+        return $ caseUpdate ECase { eCaseScrutinee = e, eCaseType = t', eCaseBind = b, eCaseAlts = as'', eCaseDefault = d''} -- XXX     -- we duplicate code so continue for next renaming pass before going further.
hunk ./E/SSimplify.hs 593
-        ec <- dosub inb emptyCase { eCaseScrutinee = e, eCaseType = t, eCaseBind = b, eCaseAlts = as ++ ls' }
-        return ec { eCaseScrutinee = e }
+        ec <- dosub inb $ caseUpdate emptyCase { eCaseScrutinee = e, eCaseType = t, eCaseBind = b, eCaseAlts = as ++ ls' }
+        return $ caseUpdate ec { eCaseScrutinee = e }
hunk ./E/SSimplify.hs 661
-        return ECase { eCaseScrutinee = e, eCaseType = t', eCaseBind =  b', eCaseAlts = as', eCaseDefault = d'}
+        return $ caseUpdate ECase { eCaseScrutinee = e, eCaseType = t', eCaseBind =  b', eCaseAlts = as', eCaseDefault = d'}
hunk ./E/SSimplify.hs 784
-        return ec' { eCaseType = t }
+        return $ caseUpdate ec' { eCaseType = t }
hunk ./E/Subst.hs 114
-        return  ec { eCaseScrutinee = e', eCaseDefault = d, eCaseBind = b', eCaseAlts = alts, eCaseType = nty }
+        return  $ caseUpdate ec { eCaseScrutinee = e', eCaseDefault = d, eCaseBind = b', eCaseAlts = alts, eCaseType = nty }
hunk ./E/Subst.hs 234
-        return  ec { eCaseScrutinee = e', eCaseDefault = d, eCaseBind = b', eCaseAlts = alts, eCaseType = nty }
+        return $ caseUpdate ec { eCaseScrutinee = e', eCaseDefault = d, eCaseBind = b', eCaseAlts = alts, eCaseType = nty }
hunk ./E/Traverse.hs 19
+import E.FreeVars(caseUpdate)
hunk ./E/Traverse.hs 66
-        return ECase { eCaseScrutinee =e', eCaseBind = b', eCaseAlts = as', eCaseDefault = d', eCaseType = t'}
+        return $ caseUpdate ECase { eCaseScrutinee =e', eCaseBind = b', eCaseAlts = as', eCaseDefault = d', eCaseType = t'}
hunk ./E/Traverse.hs 129
-            return $ ec { eCaseScrutinee = e', eCaseType = t', eCaseBind = b', eCaseAlts = as', eCaseDefault = d' }
+            return $ caseUpdate ec { eCaseScrutinee = e', eCaseType = t', eCaseBind = b', eCaseAlts = as', eCaseDefault = d' }
hunk ./E/Type.hs 83
-       eCaseDefault :: (Maybe E)
+       eCaseDefault :: (Maybe E),
+       eCaseAllFV  :: IdSet
hunk ./E/TypeAnalysis.hs 234
-    nec = ec { eCaseAlts = f [] $ eCaseAlts ec, eCaseDefault = cd (eCaseDefault ec)}
+    nec = caseUpdate ec { eCaseAlts = f [] $ eCaseAlts ec, eCaseDefault = cd (eCaseDefault ec)}
hunk ./E/Values.hs 104
-emptyCase = ECase { eCaseDefault = Nothing, eCaseAlts = [], eCaseBind = error "emptyCase: bind", eCaseType = error "emptyCase: type", eCaseScrutinee = error "emptyCase: scrutinee" }
+emptyCase = ECase {
+    eCaseAllFV = mempty,
+    eCaseDefault = Nothing,
+    eCaseAlts = [],
+    eCaseBind = error "emptyCase: bind",
+    eCaseType = error "emptyCase: type",
+    eCaseScrutinee = error "emptyCase: scrutinee"
+    }
hunk ./E/Values.hs 113
-eCaseTup e vs w = emptyCase { eCaseScrutinee = e, eCaseBind =  (tVr 0 (getType e)), eCaseType = getType w, eCaseAlts =  [Alt litCons { litName = nameTuple DataConstructor (length vs), litArgs = vs, litType = getType e } w] }
-eCaseTup' e vs w = emptyCase { eCaseScrutinee = e, eCaseBind = (tVr 0 (getType e)), eCaseType = getType w, eCaseAlts =  [Alt litCons { litName = unboxedNameTuple DataConstructor (length vs), litArgs = vs, litType = getType e} w] }
+
+eCaseTup e vs w = caseUpdate emptyCase { eCaseScrutinee = e, eCaseBind =  (tVr 0 (getType e)), eCaseType = getType w, eCaseAlts =  [Alt litCons { litName = nameTuple DataConstructor (length vs), litArgs = vs, litType = getType e } w] }
+eCaseTup' e vs w = caseUpdate emptyCase { eCaseScrutinee = e, eCaseBind = (tVr 0 (getType e)), eCaseType = getType w, eCaseAlts =  [Alt litCons { litName = unboxedNameTuple DataConstructor (length vs), litArgs = vs, litType = getType e} w] }
hunk ./E/Values.hs 120
-eCase e alts@(alt:_) Unknown = emptyCase { eCaseScrutinee = e, eCaseBind = (tVr 0 (getType e)), eCaseType = getType alt,  eCaseAlts =  alts }
-eCase e alts els = emptyCase { eCaseScrutinee = e, eCaseBind = (tVr 0 (getType e)), eCaseDefault = Just els, eCaseAlts =  alts, eCaseType = getType els }
+eCase e alts@(alt:_) Unknown = caseUpdate emptyCase { eCaseScrutinee = e, eCaseBind = (tVr 0 (getType e)), eCaseType = getType alt,  eCaseAlts =  alts }
+eCase e alts els = caseUpdate emptyCase { eCaseScrutinee = e, eCaseBind = (tVr 0 (getType e)), eCaseDefault = Just els, eCaseAlts =  alts, eCaseType = getType els }
hunk ./E/Values.hs 135
-eStrictLet t v e = emptyCase { eCaseScrutinee = v, eCaseBind = t, eCaseDefault = Just e, eCaseType = getType e }
+eStrictLet t v e = caseUpdate emptyCase { eCaseScrutinee = v, eCaseBind = t, eCaseDefault = Just e, eCaseType = getType e }
hunk ./E/Values.hs 164
-prim_seq a b = emptyCase { eCaseScrutinee = a, eCaseBind =  (tVr 0 (getType a)), eCaseDefault = Just b, eCaseType = getType b }
+prim_seq a b = caseUpdate emptyCase { eCaseScrutinee = a, eCaseBind =  (tVr 0 (getType a)), eCaseDefault = Just b, eCaseType = getType b }
hunk ./E/Values.hs 184
-    f n ec@ECase {} t = (n,nx { eCaseType = t },id) where
+    f n ec@ECase {} t = (n,caseUpdate nx { eCaseType = t },id) where