X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=blobdiff_plain;f=compiler%2Fcmm%2FCmmCPS.hs;h=acdd2a6bc4f2687d4bde54b717a5d3e26c6fc2d6;hp=ffd807b71ea838b5e3be9cc937b18f6e971d7562;hb=e6243a818496aad82b6f47511d3bd9bc800f747d;hpb=7fc749a43b4b6b85d234fa95d4928648259584f4 diff --git a/compiler/cmm/CmmCPS.hs b/compiler/cmm/CmmCPS.hs index ffd807b..acdd2a6 100644 --- a/compiler/cmm/CmmCPS.hs +++ b/compiler/cmm/CmmCPS.hs @@ -13,6 +13,7 @@ module CmmCPS ( #include "HsVersions.h" +import BlockId import Cmm import CmmLint import PprCmm @@ -25,7 +26,6 @@ import CmmCPSGen import CmmUtils import ClosureInfo -import MachOp import CLabel import SMRep import Constants @@ -93,7 +93,7 @@ cpsProc uniqSupply proc@(CmmData _ _) = [proc] -- Empty functions just don't work with the CPS algorithm, but -- they don't need the transformation anyway so just output them directly -cpsProc uniqSupply proc@(CmmProc _ _ _ []) +cpsProc uniqSupply proc@(CmmProc _ _ _ (ListGraph [])) = pprTrace "cpsProc: unexpected empty proc" (ppr proc) [proc] -- CPS transform for those procs that actually need it @@ -104,7 +104,7 @@ cpsProc uniqSupply proc@(CmmProc _ _ _ []) -- * Now break each block into a bunch of blocks (at call sites); -- all but the first will be ContinuationEntry -- -cpsProc uniqSupply (CmmProc info ident params blocks) = cps_procs +cpsProc uniqSupply (CmmProc info ident params (ListGraph blocks)) = cps_procs where -- We need to be generating uniques for several things. -- We could make this function monadic to handle that @@ -117,7 +117,7 @@ cpsProc uniqSupply (CmmProc info ident params blocks) = cps_procs block_uniques = uniques proc_uniques = map (map (map uniqsFromSupply . listSplitUniqSupply) . listSplitUniqSupply) $ listSplitUniqSupply uniqSupply2 - stack_use = CmmLocal (LocalReg stack_use_unique (cmmRegRep spReg) KindPtr) + stack_use = CmmLocal (LocalReg stack_use_unique (cmmRegType spReg)) stack_check_block_id = BlockId stack_check_block_unique stack_check_block = make_stack_check stack_check_block_id info stack_use (blockId $ head blocks) @@ -199,7 +199,7 @@ make_stack_check stack_check_block_id info stack_use next_block_id = -- then great, well check the stack. CmmInfo (Just gc_block) _ _ -> [CmmCondBranch - (CmmMachOp (MO_U_Lt $ cmmRegRep spReg) + (CmmMachOp (MO_U_Lt (typeWidth (cmmRegType spReg))) [CmmReg stack_use, CmmReg spLimReg]) gc_block] -- If we aren't given a stack check handler, @@ -219,7 +219,7 @@ collectNonProcPointTargets proc_points blocks current_targets new_blocks = new_targets (map (:[]) targets) where - blocks' = map (lookupWithDefaultUFM blocks (panic "TODO")) new_blocks + blocks' = map (lookupWithDefaultBEnv blocks (panic "TODO")) new_blocks targets = -- Note the subtlety that since the extra branch after a call -- will always be to a block that is a proc-point, @@ -241,8 +241,8 @@ gatherBlocksIntoContinuation live proc_points blocks start = Continuation info_table clabel params is_gc_cont body where children = (collectNonProcPointTargets proc_points blocks (unitUniqSet start) [start]) `minusUniqSet` (unitUniqSet start) - start_block = lookupWithDefaultUFM blocks unknown_block start - children_blocks = map (lookupWithDefaultUFM blocks unknown_block) (uniqSetToList children) + start_block = lookupWithDefaultBEnv blocks unknown_block start + children_blocks = map (lookupWithDefaultBEnv blocks unknown_block) (uniqSetToList children) unknown_block = panic "unknown block in gatherBlocksIntoContinuation" body = start_block : children_blocks @@ -268,7 +268,7 @@ gatherBlocksIntoContinuation live proc_points blocks start = ContinuationEntry args _ _ -> args ControlEntry -> uniqSetToList $ - lookupWithDefaultUFM live unknown_block start + lookupWithDefaultBEnv live unknown_block start -- it's a proc-point, pass lives in parameter registers -------------------------------------------------------------------------------- @@ -282,7 +282,7 @@ selectContinuationFormat live continuations = where -- User written continuations selectContinuationFormat' (Continuation - (Right (CmmInfo _ _ (CmmInfoTable _ _ (ContInfo format srt)))) + (Right (CmmInfo _ _ (CmmInfoTable _ _ _ (ContInfo format srt)))) label formals _ _) = (formals, Just label, format) -- Either user written non-continuation code @@ -296,7 +296,7 @@ selectContinuationFormat live continuations = in (formals, Just label, map Just $ uniqSetToList $ - lookupWithDefaultUFM live unknown_block ident) + lookupWithDefaultBEnv live unknown_block ident) unknown_block = panic "unknown BlockId in selectContinuationFormat" @@ -329,7 +329,7 @@ processFormats formats update_frame continuations = update_size [] = 0 update_size (expr:exprs) = width + update_size exprs where - width = machRepByteWidth (cmmExprRep expr) `quot` wORD_SIZE + width = (widthInBytes $ typeWidth $ cmmExprType expr) `quot` wORD_SIZE -- TODO: it would be better if we had a machRepWordWidth -- TODO: get rid of "+ 1" etc. @@ -339,7 +339,7 @@ processFormats formats update_frame continuations = stack_size (Nothing:formats) = 1 + stack_size formats -- one dead word stack_size (Just reg:formats) = width + stack_size formats where - width = machRepByteWidth (localRegRep reg) `quot` wORD_SIZE + width = (widthInBytes $ typeWidth $ localRegType reg) `quot` wORD_SIZE -- TODO: it would be better if we had a machRepWordWidth continuationMaxStack :: [(CLabel, ContinuationFormat)] @@ -359,14 +359,14 @@ continuationMaxStack formats (Continuation _ label _ False blocks) = map stmt_arg_size (brokenBlockStmts block)) final_arg_size (FinalReturn args) = - argumentsSize (cmmExprRep . fst) args + argumentsSize (cmmExprType . hintlessCmm) args final_arg_size (FinalJump _ args) = - argumentsSize (cmmExprRep . fst) args + argumentsSize (cmmExprType . hintlessCmm) args final_arg_size (FinalCall next _ _ args _ _ True) = 0 final_arg_size (FinalCall next _ _ args _ _ False) = -- We have to account for the stack used when we build a frame -- for the *next* continuation from *this* continuation - argumentsSize (cmmExprRep . fst) args + + argumentsSize (cmmExprType . hintlessCmm) args + continuation_frame_size next_format where next_format = maybe unknown_format id $ lookup next' formats @@ -375,7 +375,7 @@ continuationMaxStack formats (Continuation _ label _ False blocks) = final_arg_size _ = 0 stmt_arg_size (CmmJump _ args) = - argumentsSize (cmmExprRep . fst) args + argumentsSize (cmmExprType . hintlessCmm) args stmt_arg_size (CmmCall _ _ _ (CmmSafe _) _) = panic "Safe call in processFormats" stmt_arg_size (CmmReturn _) = @@ -388,10 +388,11 @@ applyContinuationFormat :: [(CLabel, ContinuationFormat)] -> Continuation CmmInfo -- User written continuations -applyContinuationFormat formats (Continuation - (Right (CmmInfo gc update_frame (CmmInfoTable prof tag (ContInfo _ srt)))) - label formals is_gc blocks) = - Continuation (CmmInfo gc update_frame (CmmInfoTable prof tag (ContInfo format srt))) +applyContinuationFormat formats + (Continuation (Right (CmmInfo gc update_frame + (CmmInfoTable clos prof tag (ContInfo _ srt)))) + label formals is_gc blocks) = + Continuation (CmmInfo gc update_frame (CmmInfoTable clos prof tag (ContInfo format srt))) label formals is_gc blocks where format = continuation_stack $ maybe unknown_block id $ lookup label formats @@ -405,7 +406,7 @@ applyContinuationFormat formats (Continuation -- CPS generated continuations applyContinuationFormat formats (Continuation (Left srt) label formals is_gc blocks) = - Continuation (CmmInfo gc Nothing (CmmInfoTable prof tag (ContInfo (continuation_stack $ format) srt))) + Continuation (CmmInfo gc Nothing (CmmInfoTable undefined prof tag (ContInfo (continuation_stack $ format) srt))) label formals is_gc blocks where gc = Nothing -- Generated continuations never need a stack check