diff options
author | Peter Wortmann <scpmw@leeds.ac.uk> | 2014-12-06 17:11:42 +0100 |
---|---|---|
committer | Austin Seipp <austin@well-typed.com> | 2014-12-16 15:02:33 -0600 |
commit | 5fecd767309f318e0ec6797667ca6442a54ea451 (patch) | |
tree | d0de9f33ffe98cb01273bb2b552628fa14112d8e /compiler/codeGen/StgCmmLayout.hs | |
parent | 7ceaf96fde63bd45dfc1e08a975cba0ee280eb7b (diff) | |
download | haskell-5fecd767309f318e0ec6797667ca6442a54ea451.tar.gz |
Tick scopes
This patch solves the scoping problem of CmmTick nodes: If we just put
CmmTicks into blocks we have no idea what exactly they are meant to
cover. Here we introduce tick scopes, which allow us to create
sub-scopes and merged scopes easily.
Notes:
* Given that the code often passes Cmm around "head-less", we have to
make sure that its intended scope does not get lost. To keep the amount
of passing-around to a minimum we define a CmmAGraphScoped type synonym
here that just bundles the scope with a portion of Cmm to be assembled
later.
* We introduce new scopes at somewhat random places, aligning with
getCode calls. This works surprisingly well, but we might have to
add new scopes into the mix later on if we find things too be too
coarse-grained.
(From Phabricator D169)
Diffstat (limited to 'compiler/codeGen/StgCmmLayout.hs')
-rw-r--r-- | compiler/codeGen/StgCmmLayout.hs | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/compiler/codeGen/StgCmmLayout.hs b/compiler/codeGen/StgCmmLayout.hs index af2d6619ea..c3d8873cfb 100644 --- a/compiler/codeGen/StgCmmLayout.hs +++ b/compiler/codeGen/StgCmmLayout.hs @@ -120,7 +120,8 @@ emitCallWithExtraStack (callConv, retConv) fun args extra_stack (off, _, copyin) = copyInOflow dflags retConv area res_regs [] copyout = mkCallReturnsTo dflags fun callConv args k off updfr_off extra_stack - emit (copyout <*> mkLabel k <*> copyin) + tscope <- getTickScope + emit (copyout <*> mkLabel k tscope <*> copyin) return (ReturnedTo k off) } @@ -224,15 +225,16 @@ slowCall fun stg_args let correct_arity = cmmEqWord dflags (funInfoArity dflags fun_iptr) (mkIntExpr dflags n_args) + tscope <- getTickScope emit (mkCbranch (cmmIsTagged dflags funv) is_tagged_lbl slow_lbl - <*> mkLabel is_tagged_lbl + <*> mkLabel is_tagged_lbl tscope <*> mkCbranch correct_arity fast_lbl slow_lbl - <*> mkLabel fast_lbl + <*> mkLabel fast_lbl tscope <*> fast_code <*> mkBranch end_lbl - <*> mkLabel slow_lbl + <*> mkLabel slow_lbl tscope <*> slow_code - <*> mkLabel end_lbl) + <*> mkLabel end_lbl tscope) return r else do @@ -536,7 +538,7 @@ emitClosureProcAndInfoTable top_lvl bndr lf_info info_tbl args body emitClosureAndInfoTable :: CmmInfoTable -> Convention -> [LocalReg] -> FCode () -> FCode () emitClosureAndInfoTable info_tbl conv args body - = do { blks <- getCode body + = do { (_, blks) <- getCodeScoped body ; let entry_lbl = toEntryLbl (cit_lbl info_tbl) ; emitProcWithConvention conv (Just info_tbl) entry_lbl args blks } |