From 0c217ca0c03fa8b3ebdb12a1c36a6ee03724eb55 Mon Sep 17 00:00:00 2001 From: Max Bolingbroke <batterseapower@hotmail.com> Date: Fri, 29 Jul 2011 09:18:38 +0100 Subject: [PATCH] Common up uses of entryLblToInfoLbl in CmmProcPoint --- compiler/cmm/CmmProcPoint.hs | 41 ++++++++++++++++++------------------ 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/compiler/cmm/CmmProcPoint.hs b/compiler/cmm/CmmProcPoint.hs index 6af8a69e777c..9c03d83e2662 100644 --- a/compiler/cmm/CmmProcPoint.hs +++ b/compiler/cmm/CmmProcPoint.hs @@ -401,10 +401,13 @@ splitAtProcPoints entry_label callPPs procPoints procMap where graph = mapLookup procId graphEnv `orElse` mapEmpty graph' = mapInsert bid b graph graphEnv <- return $ foldGraphBlocks addBlock emptyBlockMap g - -- Build a map from proc point BlockId to labels for their new procedures + -- Build a map from proc point BlockId to pairs of: + -- * Labels for their new procedures + -- * Labels for the info tables of their new procedures (only if the proc point is a callPP) -- Due to common blockification, we may overestimate the set of procpoints. - let add_label map pp = return $ Map.insert pp lbl map + let add_label map pp = return $ Map.insert pp (lbl, mb_info_lbl) map where lbl = if pp == entry then entry_label else blockLbl pp + mb_info_lbl = guard (setMember id callPPs) >> Just (entryLblToInfoLbl lbl) procLabels <- foldM add_label Map.empty (filter (flip mapMember (toBlockMap g)) (setElems procPoints)) -- For each procpoint, we need to know the SP offset on entry. @@ -427,9 +430,8 @@ splitAtProcPoints entry_label callPPs procPoints procMap do bid <- liftM mkBlockId getUniqueM let b = blockOfNodeList (JustC (CmmEntry bid), [], JustC jump) StackInfo {arg_space = argSpace, updfr_space = off} = getStackInfo pp - jump = CmmCall (CmmLit (CmmLabel l')) Nothing argSpace 0 + jump = CmmCall (CmmLit (CmmLabel l)) Nothing argSpace 0 (off `orElse` 0) -- Jump's shouldn't need the offset... - l' = if setMember pp callPPs then entryLblToInfoLbl l else l return (mapInsert pp bid env, b : bs) add_jumps (newGraphEnv) (ppId, blockEnv) = do let needed_jumps = -- find which procpoints we currently branch to @@ -442,8 +444,8 @@ splitAtProcPoints entry_label callPPs procPoints procMap CmmSwitch _ tbl -> foldr add_if_pp rst (catMaybes tbl) _ -> rst add_if_pp id rst = case Map.lookup id procLabels of - Just x -> (id, x) : rst - Nothing -> rst + Just (lbl, mb_info_lbl) -> (id, mb_info_lbl `orElse` lbl) : rst + Nothing -> rst (jumpEnv, jumpBlocks) <- foldM add_jump_block (mapEmpty, []) needed_jumps -- update the entry block @@ -458,24 +460,23 @@ splitAtProcPoints entry_label callPPs procPoints procMap -- pprTrace "g' pre jumps" (ppr g') $ do return (mapInsert ppId g' newGraphEnv) graphEnv <- foldM add_jumps emptyBlockMap $ mapToList graphEnv - let to_proc (bid, (stack_info, g)) | setMember bid callPPs = - if bid == entry then - CmmProc (TopInfo {info_tbl=info_tbl, stack_info=stack_info}) - top_l (replacePPIds g) - else - CmmProc (TopInfo {info_tbl=mkEmptyContInfoTable (entryLblToInfoLbl lbl), stack_info=stack_info}) - lbl (replacePPIds g) - where lbl = expectJust "pp label" $ Map.lookup bid procLabels - to_proc (bid, (stack_info, g)) = - CmmProc (TopInfo {info_tbl=CmmNonInfoTable, stack_info=stack_info}) - lbl (replacePPIds g) - where lbl = expectJust "pp label" $ Map.lookup bid procLabels + let to_proc (bid, (stack_info, g)) = case expectJust "pp label" $ Map.lookup bid procLabels of + (lbl, Just info_lbl) + | bid == entry + -> CmmProc (TopInfo {info_tbl=info_tbl, stack_info=stack_info}) + top_l (replacePPIds g) + | otherwise + -> CmmProc (TopInfo {info_tbl=mkEmptyContInfoTable info_lbl, stack_info=stack_info}) + lbl (replacePPIds g) + (lbl, Nothing) + -> CmmProc (TopInfo {info_tbl=CmmNonInfoTable, stack_info=stack_info}) + lbl (replacePPIds g) -- References to procpoint IDs can now be replaced with the infotable's label replacePPIds g = mapGraphNodes (id, mapExp repl, mapExp repl) g where repl e@(CmmLit (CmmBlock bid)) = case Map.lookup bid procLabels of - Just l -> CmmLit (CmmLabel (entryLblToInfoLbl l)) - Nothing -> e + Just (_, Just info_lbl) -> CmmLit (CmmLabel info_lbl) + _ -> 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. -- GitLab