Don't duplicate arbitrary CmmCalls
authorSimon Marlow <marlowsd@gmail.com>
Mon, 9 Jul 2012 15:23:21 +0000 (16:23 +0100)
committerSimon Marlow <marlowsd@gmail.com>
Mon, 9 Jul 2012 15:23:45 +0000 (16:23 +0100)
compiler/cmm/CmmContFlowOpt.hs

index 6b6ecc8..f9fa680 100644 (file)
@@ -157,9 +157,13 @@ callContinuation_maybe _ = Nothing
 
 okToDuplicate :: CmmBlock -> Bool
 okToDuplicate block
-  = case blockSplit block of (_, m, _) -> isEmptyBlock m
-  -- cheap and cheerful; we might expand this in the future to
-  -- e.g. spot blocks that represent a single instruction or two
+  = case blockSplit block of
+      (_, m, CmmBranch _) -> isEmptyBlock m
+      -- cheap and cheerful; we might expand this in the future to
+      -- e.g. spot blocks that represent a single instruction or two.
+      -- Be careful: a CmmCall can be more than one instruction, it
+      -- has a CmmExpr inside it.
+      _otherwise -> False
 
 ------------------------------------------------------------------------
 -- Map over the CmmGraph, replacing each label with its mapping in the