Keep the CPS pass from creating proc points due to unreachable parents.
authorMichael D. Adams <adamsmd@cs.indiana.edu>
Sun, 15 Jul 2007 16:20:03 +0000 (16:20 +0000)
committerMichael D. Adams <adamsmd@cs.indiana.edu>
Sun, 15 Jul 2007 16:20:03 +0000 (16:20 +0000)
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.

compiler/cmm/CmmProcPoint.hs

index fe64608..df408c6 100644 (file)
@@ -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