X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=blobdiff_plain;f=compiler%2Fcmm%2FCmmProcPointZ.hs;h=b477f4c2336071341fe51b4835df5639ad0da982;hp=5ec65c5d0b1a1b7dbc2113fe1a863f082fc17a85;hb=d436c70d43fb905c63220040168295e473f4b90a;hpb=31a9d04804d9cacda35695c5397590516b964964 diff --git a/compiler/cmm/CmmProcPointZ.hs b/compiler/cmm/CmmProcPointZ.hs index 5ec65c5..b477f4c 100644 --- a/compiler/cmm/CmmProcPointZ.hs +++ b/compiler/cmm/CmmProcPointZ.hs @@ -5,7 +5,6 @@ module CmmProcPointZ ) where -import qualified Prelude as P import Prelude hiding (zip, unzip, last) import BlockId @@ -329,7 +328,7 @@ add_CopyIns callPPs protos blocks = = case lookupBlockEnv protos id of Just (Protocol c fs _area) -> do LGraph _ blocks <- - lgraphOfAGraph (mkLabel id <*> copyInSlot c False fs <*> mkZTail t) + lgraphOfAGraph (mkLabel id <*> copyInSlot c fs <*> mkZTail t) return (map snd $ blockEnvToList blocks) Nothing -> return [b] | otherwise = return [b] @@ -356,8 +355,7 @@ add_CopyOuts protos procPoints g = fold_blocks mb_copy_out (return emptyBlockEnv if elemBlockSet succId procPoints then case lookupBlockEnv protos succId of Nothing -> z - Just (Protocol c fs _area) -> - insert z succId $ copyOutSlot c Jump fs + Just (Protocol c fs _area) -> insert z succId $ copyOutSlot c fs else z insert z succId m = do (b, bmap) <- z @@ -454,13 +452,20 @@ splitAtProcPoints entry_label callPPs procPoints procMap graphEnv <- foldM add_jumps emptyBlockEnv $ blockEnvToList graphEnv let to_proc (bid, g) | elemBlockSet bid callPPs = if bid == entry then - CmmProc (CmmInfo gc upd_fr info_tbl) top_l top_args g + CmmProc (CmmInfo gc upd_fr info_tbl) top_l top_args (replacePPIds g) else - CmmProc emptyContInfoTable lbl [] g + CmmProc emptyContInfoTable lbl [] (replacePPIds g) where lbl = expectJust "pp label" $ lookupFM procLabels bid to_proc (bid, g) = - CmmProc (CmmInfo Nothing Nothing CmmNonInfoTable) lbl [] g + CmmProc (CmmInfo Nothing Nothing CmmNonInfoTable) lbl [] (replacePPIds g) where lbl = expectJust "pp label" $ lookupFM procLabels bid + -- References to procpoint IDs can now be replaced with the infotable's label + replacePPIds (x, g) = (x, map_nodes id (mapExpMiddle repl) (mapExpLast repl) g) + where repl e@(CmmLit (CmmBlock bid)) = + case lookupFM procLabels bid of + Just l -> CmmLit (CmmLabel (entryLblToInfoLbl l)) + Nothing -> e + repl e = e -- The C back end expects to see return continuations before the call sites. -- Here, we sort them in reverse order -- it gets reversed later. let (_, block_order) = foldl add_block_num (0::Int, emptyBlockEnv) (postorder_dfs g)