X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2Fcmm%2FZipCfg.hs;h=1001f23b77611bfaf70117ecfe94b23e51c3cee3;hb=4e0c994eb1613c62e94069642d7acdb2e69b773b;hp=3a5932cadd36809050bf5776f8706665f0101455;hpb=d436c70d43fb905c63220040168295e473f4b90a;p=ghc-hetmet.git diff --git a/compiler/cmm/ZipCfg.hs b/compiler/cmm/ZipCfg.hs index 3a5932c..1001f23 100644 --- a/compiler/cmm/ZipCfg.hs +++ b/compiler/cmm/ZipCfg.hs @@ -45,7 +45,7 @@ import PprCmm() import Outputable hiding (empty) -import Maybe +import Data.Maybe import Prelude hiding (zip, unzip, last) ------------------------------------------------------------------------- @@ -461,25 +461,32 @@ postorder_dfs g@(LGraph _ blockenv) = let FGraph id eblock _ = entry g in zip eblock : postorder_dfs_from_except blockenv eblock (unitBlockSet id) -postorder_dfs_from_except :: (HavingSuccessors b, LastNode l) +postorder_dfs_from_except :: forall m b l. (HavingSuccessors b, LastNode l) => BlockEnv (Block m l) -> b -> BlockSet -> [Block m l] -postorder_dfs_from_except blocks b visited = - vchildren (get_children b) (\acc _visited -> acc) [] visited +postorder_dfs_from_except blocks b visited + = vchildren (get_children b) (\acc _visited -> acc) [] visited where - -- vnode :: - -- Block m l -> ([Block m l] -> BlockSet -> a) -> [Block m l] -> BlockSet -> a + vnode :: Block m l -> ([Block m l] -> BlockSet -> a) + -> [Block m l] -> BlockSet -> a vnode block@(Block id _) cont acc visited = if elemBlockSet id visited then cont acc visited else let cont' acc visited = cont (block:acc) visited in vchildren (get_children block) cont' acc (extendBlockSet visited id) + + vchildren :: [Block m l] -> ([Block m l] -> BlockSet -> a) + -> [Block m l] -> BlockSet -> a vchildren bs cont acc visited = let next children acc visited = case children of [] -> cont acc visited (b:bs) -> vnode b (next bs) acc visited in next bs acc visited + + get_children :: HavingSuccessors c => c -> [Block m l] get_children block = foldl add_id [] (succs block) + + add_id :: [Block m l] -> BlockId -> [Block m l] add_id rst id = case lookupBlockEnv blocks id of Just b -> b : rst Nothing -> rst