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/cmm/CmmContFlowOpt.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/cmm/CmmContFlowOpt.hs')
-rw-r--r-- | compiler/cmm/CmmContFlowOpt.hs | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/compiler/cmm/CmmContFlowOpt.hs b/compiler/cmm/CmmContFlowOpt.hs index 4b8ce6f0f3..bcb4cf97b3 100644 --- a/compiler/cmm/CmmContFlowOpt.hs +++ b/compiler/cmm/CmmContFlowOpt.hs @@ -317,18 +317,22 @@ decPreds bid edges = case mapLookup bid edges of canShortcut :: CmmBlock -> Maybe BlockId canShortcut block | (_, middle, CmmBranch dest) <- blockSplit block - , isEmptyBlock middle + , all dont_care $ blockToList middle = Just dest | otherwise = Nothing - + where dont_care CmmComment{} = True + dont_care CmmTick{} = True + dont_care _other = False -- Concatenates two blocks. First one is assumed to be open on exit, the second -- is assumed to be closed on entry (i.e. it has a label attached to it, which -- the splice function removes by calling snd on result of blockSplitHead). splice :: Block CmmNode C O -> CmmBlock -> CmmBlock -splice head rest = head `blockAppend` snd (blockSplitHead rest) - +splice head rest = entry `blockJoinHead` code0 `blockAppend` code1 + where (CmmEntry lbl sc0, code0) = blockSplitHead head + (CmmEntry _ sc1, code1) = blockSplitHead rest + entry = CmmEntry lbl (combineTickScopes sc0 sc1) -- If node is a call with continuation call return Just label of that -- continuation. Otherwise return Nothing. |