[rework inlining logic in simplifier
John Meacham <john@repetae.net>**20060314040158] hunk ./E/Rules.hs 227
+rsubstMap :: Map.Map Id E -> E -> E
+rsubstMap im e = doSubst False True (Map.map ( (`Map.lookup` im) . tvrIdent) (Map.unions $ (freeVars e :: Map.Map Id TVr):map freeVars (Map.elems im))) e
hunk ./E/Rules.hs 237
-            let b = substMap (Map.fromList [ (i,x) | (TVr { tvrIdent = i },x) <- concat ss ]) (ruleBody r)
+            let b = rsubstMap (Map.fromList [ (i,x) | (TVr { tvrIdent = i },x) <- concat ss ]) (ruleBody r)
hunk ./E/SSimplify.hs 161
-data Binding = NotAmong [Name] | IsBoundTo Occurance E | NotKnown
+data Binding =
+    NotAmong [Name]
+    | IsBoundTo { bindingOccurance :: Occurance, bindingE :: E }
+    | NotKnown
hunk ./E/SSimplify.hs 322
-        let t'' = substMap'' (Map.map (\ (IsBoundTo _ e) -> e) $ Map.filter isIsBoundTo (envInScope inb)) t'  --  (Map.fromAscList [ (t,e) | (t,IsBoundTo _ e) <- Map.toAscList (envInScope inb) ]) t'
+        let t'' = substMap'' (Map.map (\ IsBoundTo { bindingE = e } -> e) $ Map.filter isIsBoundTo (envInScope inb)) t'  --  (Map.fromAscList [ (t,e) | (t,IsBoundTo _ e) <- Map.toAscList (envInScope inb) ]) t'
hunk ./E/SSimplify.hs 340
-    doCase (EVar v) t b as d sub inb |  Just (IsBoundTo _ (ELit l)) <- Map.lookup (tvrNum v) (envInScope inb)  = doConstCase l t  b as d sub inb
+    doCase (EVar v) t b as d sub inb |  Just IsBoundTo { bindingE = ELit l } <- Map.lookup (tvrNum v) (envInScope inb)  = doConstCase l t  b as d sub inb
hunk ./E/SSimplify.hs 343
-    doCase (EVar v) t b as d sub inb | Just (IsBoundTo _ e) <- Map.lookup (tvrNum v) (envInScope inb) , isBottom e = do
+    doCase (EVar v) t b as d sub inb | Just IsBoundTo { bindingE = e } <- Map.lookup (tvrNum v) (envInScope inb) , isBottom e = do
hunk ./E/SSimplify.hs 413
-            mins (EVar v) e = envInScope_u (Map.insert (tvrNum v) (IsBoundTo Many $  e))
+            mins (EVar v) e = envInScope_u (Map.insert (tvrNum v) (IsBoundTo Many e))
hunk ./E/SSimplify.hs 453
-                Just (IsBoundTo _ e) -> Just e
+                Just IsBoundTo { bindingE = e } -> Just e
hunk ./E/SSimplify.hs 473
-                (Just (IsBoundTo _ e)) -> Just e
+                Just IsBoundTo { bindingE = e } -> Just e
hunk ./E/SSimplify.hs 477
-    h (EVar v) xs' inb | forceNoinline v = do
-        z <- applyRule v xs' inb
-        case z of
-            Just (x,xs) -> didInline inb (x,xs) --h x xs inb
-            Nothing -> app (EVar v, xs')
-
hunk ./E/SSimplify.hs 479
-        case z of
-            Just (x,xs) -> didInline inb (x,xs) -- h x xs inb
-            Nothing -> case Map.lookup (tvrNum v) (envInScope inb) of
-                Just (IsBoundTo LoopBreaker _) -> appVar v xs'
-                Just (IsBoundTo Once _) -> error "IsBoundTo: Once"
+        case (z,forceNoinline v) of
+            (Just (x,xs),_) -> didInline inb x xs  -- h x xs inb
+            (_,True) -> app (EVar v, xs')
+            _ -> case Map.lookup (tvrNum v) (envInScope inb) of
+                Just IsBoundTo { bindingOccurance = LoopBreaker } -> appVar v xs'
+                Just IsBoundTo { bindingOccurance = Once } -> error "IsBoundTo: Once"
hunk ./E/SSimplify.hs 487
-                    didInline inb (e,xs')
-                Just (IsBoundTo OnceInLam e) | safeToDup e && someBenefit e xs' -> do
+                    didInline inb e xs'
+                Just (IsBoundTo OnceInLam e) | isCheap e && someBenefit v e xs' -> do
hunk ./E/SSimplify.hs 490
-                    didInline inb (e,xs')
-                Just (IsBoundTo ManyBranch e) | multiInline e xs' -> do
+                    didInline inb e xs'
+                Just (IsBoundTo ManyBranch e) | multiInline v e xs' -> do
hunk ./E/SSimplify.hs 493
-                    didInline inb (e,xs')
-                Just (IsBoundTo Many e) | safeToDup e && multiInline e xs' -> do
+                    didInline inb  e xs'
+                Just (IsBoundTo Many e) | isCheap e && multiInline v e xs' -> do
hunk ./E/SSimplify.hs 496
-                    didInline inb (e,xs')
+                    didInline inb  e xs'
hunk ./E/SSimplify.hs 503
-    didInline inb z = do
-        e <- app z
+    didInline inb z zs = do
+        e <- app (z,zs)
hunk ./E/SSimplify.hs 514
-someBenefit _ _ = False
+someBenefit _ ELit {} _ = True
+someBenefit _ EPrim {} _ = True
+someBenefit _ e xs | f e xs = True where
+    f (ELam _ e) (x:xs) = f e xs
+    f ELam {} [] = False
+    f _ _ = True
+someBenefit v e xs = False
hunk ./E/SSimplify.hs 522
-multiInline x xs | not (someBenefit x xs) = False
-multiInline e xs = length xs + 2 >= (nsize + if safeToDup b then negate 4 else 0)  where
+multiInline _ e xs | isSmall (f e xs) = True  where -- should be noSizeIncrease
+    f e [] = e
+    f (ELam _ e) (_:xs) = f e xs
+    f e xs = foldl EAp e xs
+multiInline v e xs | not (someBenefit v e xs) = False
+multiInline _ e xs = length xs + 2 >= (nsize + if safeToDup b then negate 4 else 0)  where