[switch to program based simplification rather than turning things into a single expression
John Meacham <john@repetae.net>**20060411014739] hunk ./E/SSimplify.hs 5
+    collectOccurance,
hunk ./Main.hs 156
-    transformProgram "Barendregt" (dump FD.Pass) (return . barendregtProgram) prog
+    transformProgram "Barendregt" False (dump FD.Pass) (return . barendregtProgram) prog
hunk ./Main.hs 288
-            let (stat, e'') = SS.simplifyE sopt e
+            let (e',_) = SS.collectOccurance e
+            let (stat, e'') = SS.simplifyE sopt e'
+            wdump FD.Pass $ printCheckName fullDataTable e''
hunk ./Main.hs 299
-            lc <- doopt mangle False mstats "SuperSimplify" cm lc
+            lc <- doopt mangle False mstats ("SuperSimplify:" ++ pprint v) cm lc
hunk ./Main.hs 304
-        mprog <- transformProgram "typeAnalyze" (dump FD.Pass) (typeAnalyze True) mprog
-        mprog <- transformProgram "floatOutward" (dump FD.Pass) floatOutward mprog
+        mprog <- transformProgram "typeAnalyze" False (dump FD.Pass) (typeAnalyze True) mprog
+        mprog <- transformProgram "floatOutward" False (dump FD.Pass) floatOutward mprog
hunk ./Main.hs 309
-            lc <- doopt mangle False mstats "SuperSimplify" cm lc
+            lc <- doopt mangle False mstats ("SuperSimplify: "  ++ pprint v) cm lc
hunk ./Main.hs 317
-            lc <- doopt mangle False mstats "SuperSimplify" cm lc
+            lc <- doopt mangle False mstats ("SuperSimplify:" ++ pprint v) cm lc
hunk ./Main.hs 349
-            let (stat, e'') = SS.simplifyE sopt e
+            let (e',_) = SS.collectOccurance e
+            let (stat, e'') = SS.simplifyE sopt e'
+            wdump FD.Pass $ printCheckName fullDataTable e''
hunk ./Main.hs 395
-                    let (stat, e') = SS.simplifyE sopt e
+                    let (e',_) = SS.collectOccurance e
+                    let (stat, e'') = SS.simplifyE sopt e'
+                    wdump FD.Pass $ printCheckName fullDataTable e''
hunk ./Main.hs 399
-                    return e'
+                    return e''
hunk ./Main.hs 430
-    prog <- transformProgram "typeAnalyze" True (typeAnalyze True) prog
+    prog <- transformProgram "typeAnalyze" False True (typeAnalyze True) prog
hunk ./Main.hs 456
-programPrune prog = transformProgram "Prune Unreachable" (dump FD.Pass) (return . programPruneUnreachable) prog
+programPrune prog = transformProgram "Prune Unreachable" False (dump FD.Pass) (return . programPruneUnreachable) prog
hunk ./Main.hs 461
-    transformProgram "eta expansion" (dump FD.Pass) (const $ return prog' { progStats = progStats prog' `mappend` stats }) prog
+    transformProgram "eta expansion" False (dump FD.Pass) (const $ return prog' { progStats = progStats prog' `mappend` stats }) prog
hunk ./Main.hs 505
-    prog <- programPrune prog
+    prog <- transformProgram "Initial Prune Unreachable" False False (return . programPruneUnreachable) prog
hunk ./Main.hs 537
-        prog <- transformProgram "lambda lift" (dump FD.Progress) (lambdaLift finalStats) prog
+        prog <- transformProgram "lambda lift" False (dump FD.Progress) (lambdaLift finalStats) prog
hunk ./Main.hs 555
-    let lc = programE prog
-
-    wdump FD.Progress $ printEStats lc
-    let cm stats e = do
-        let sopt = mempty { SS.so_rules = rules, SS.so_dataTable = dataTable }
-        let (stat, e') = SS.simplifyE sopt e
-        Stats.tickStat stats stat
-        return e'
hunk ./Main.hs 556
-    wdump FD.Lambdacube $ printProgram prog -- printCheckName dataTable (programE prog)
-    prog <- return $ SS.programPruneOccurance prog
-    putStrLn ">>>> after occurance analysis"
-    wdump FD.Lambdacube $ printProgram prog -- printCheckName dataTable (programE prog)
-
-    -- run first optimization
-    lc <- opt "SuperSimplify" cm lc
-    prog <- return $ programSetE lc prog
+    prog <- simplifyProgram mempty "SuperSimplify" True prog
hunk ./Main.hs 559
+
hunk ./Main.hs 561
-    --prog <- Stats.runStatIO st (etaExpandProgram prog)
-    --Stats.print "eta" st
hunk ./Main.hs 563
-    prog <- transformProgram "typeAnalyze" True (typeAnalyze True) prog
+    prog <- transformProgram "typeAnalyze" False True (typeAnalyze True) prog
hunk ./Main.hs 567
-    lc <- return $ programE prog
-    lc <- opt "SuperSimplify" cm lc
-    prog <- return $ programSetE lc prog
+--    prog <- transformProgram "OccuranceAnalysis" True (return . SS.programPruneOccurance) prog
+--    lc <- return $ programE prog
+--    lc <- opt "SuperSimplify" cm lc
+--    prog <- return $ programSetE lc prog
+
+    prog <- simplifyProgram mempty "SuperSimplify pass 2" True prog
hunk ./Main.hs 581
-    let cm stats e = do
-        let sopt = mempty { SS.so_dataTable = dataTable }
-        let (stat, e') = SS.simplifyE sopt e
-        Stats.tickStat stats stat
-        return e'
-    lc <- return $ programE prog
-    lc <- opt "SuperSimplify no Rules" cm lc
-    prog <- return $ programSetE lc prog
-
+    prog <- simplifyProgram mempty "SuperSimplify no rules" True prog
hunk ./Main.hs 583
+--
+--    let cm stats e = do
+--        let sopt = mempty { SS.so_dataTable = dataTable }
+--        let (stat, e') = SS.simplifyE sopt e
+--        Stats.tickStat stats stat
+--        return e'
+--    prog <- transformProgram "OccuranceAnalysis" True (return . SS.programPruneOccurance) prog
+--    lc <- return $ programE prog
+--    lc <- opt "SuperSimplify no Rules" cm lc
+--    prog <- return $ programSetE lc prog
+--
+--    prog <- barendregtProg prog
hunk ./Main.hs 599
-    prog <- transformProgram "lambda lift" (dump FD.Progress) (lambdaLift finalStats) prog
+    prog <- transformProgram "lambda lift" False (dump FD.Progress) (lambdaLift finalStats) prog
hunk ./Main.hs 730
+simplifyProgram sopt name dodump prog = do
+    let istat = progStats prog
+    let g =  return . SS.programSSimplify sopt { SS.so_dataTable = progDataTable prog } . SS.programPruneOccurance
+    prog <- transformProgram name True dodump g prog  { progStats = mempty }
+    when ((dodump && dump FD.Progress) || dump FD.Pass) $ Stats.printStat name (progStats prog)
+    return prog { progStats = progStats prog `mappend` istat }
hunk ./Main.hs 741
+    -> Bool                     -- ^ wether to iterate
hunk ./Main.hs 747
-transformProgram name dodump f prog = do
+transformProgram name iterate dodump f prog = do
hunk ./Main.hs 766
+    when (dodump && dump FD.Steps) $ Stats.printStat name estat
hunk ./Main.hs 768
-    return prog' { progStats = istat `mappend` estat, progPasses = name:progPasses prog' }
+    if iterate && estat /= mempty then transformProgram name True dodump f prog' { progStats = istat `mappend` estat } else
+        return prog' { progStats = istat `mappend` estat, progPasses = name:progPasses prog' }
hunk ./Main.hs 945
+
+
+