summaryrefslogtreecommitdiff
path: root/compiler
diff options
context:
space:
mode:
authorMichael D. Adams <adamsmd@cs.indiana.edu>2007-07-15 16:20:03 +0000
committerMichael D. Adams <adamsmd@cs.indiana.edu>2007-07-15 16:20:03 +0000
commitca9c90e51724d8efdebfd97128b21c5bc0eed555 (patch)
tree1998b162af478acdad6b50a9e8bd935998576170 /compiler
parenta9eda06434ea9fb4764c2a587ccd53df09f7c470 (diff)
downloadhaskell-ca9c90e51724d8efdebfd97128b21c5bc0eed555.tar.gz
Keep the CPS pass from creating proc points due to unreachable parents.
The parser/flattener will generate an extra block after an if/else statement even if both branches exit the function. So it is possible for the input to the CPS pass to have dead/unreachable blocks. If a dead block goes to a live block then the live block would have more parents than the dead block and prior to this patch the live block would then be identified as a proc point. This is fixed by adding a check to see if the parent has at least one owner.
Diffstat (limited to 'compiler')
-rw-r--r--compiler/cmm/CmmProcPoint.hs8
1 files changed, 6 insertions, 2 deletions
diff --git a/compiler/cmm/CmmProcPoint.hs b/compiler/cmm/CmmProcPoint.hs
index fe64608022..df408c666f 100644
--- a/compiler/cmm/CmmProcPoint.hs
+++ b/compiler/cmm/CmmProcPoint.hs
@@ -79,8 +79,12 @@ calculateNewProcPoints owners block =
where
parent_owners = lookupWithDefaultUFM owners emptyUniqSet parent_id
child_owners = lookupWithDefaultUFM owners emptyUniqSet child_id
- needs_proc_point = not $ isEmptyUniqSet $
- child_owners `minusUniqSet` parent_owners
+ needs_proc_point =
+ -- only if parent isn't dead
+ (not $ isEmptyUniqSet parent_owners) &&
+ -- and only if child has more owners than parent
+ (not $ isEmptyUniqSet $
+ child_owners `minusUniqSet` parent_owners)
calculateOwnership :: BlockEnv BrokenBlock
-> UniqSet BlockId