Comments only
authorSimon Peyton Jones <simonpj@microsoft.com>
Thu, 16 Feb 2012 13:42:01 +0000 (13:42 +0000)
committerSimon Peyton Jones <simonpj@microsoft.com>
Thu, 16 Feb 2012 13:42:01 +0000 (13:42 +0000)
compiler/simplCore/SetLevels.lhs
compiler/simplCore/Simplify.lhs

index beb64cb..6e0afb4 100644 (file)
@@ -419,7 +419,10 @@ the inner loop.
 Things to note
  * We can't float a case to top level
  * It's worth doing this float even if we don't float
-   the case outside a value lambda
+   the case outside a value lambda.  Example
+     case x of { 
+       MkT y -> (case y of I# w2 -> ..., case y of I# w2 -> ...)
+   If we floated the cases out we could eliminate one of them.
  * We only do this with a single-alternative case
 
 Note [Check the output scrutinee for okForSpec]
index 900d70c..ee20a52 100644 (file)
@@ -1668,6 +1668,22 @@ not want to transform to
    in blah
 because that builds an unnecessary thunk.
 
+Note [Case elimination: unlifted case]
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Consider 
+   case a +# b of r -> ...r...
+Then we do case-elimination (to make a let) followed by inlining,
+to get
+        .....(a +# b)....
+If we have
+   case indexArray# a i of r -> ...r...
+we might like to do the same, and inline the (indexArray# a i). 
+But indexArray# is not okForSpeculation, so we don't build a let
+in rebuildCase (lest it get floated *out*), so the inlining doesn't
+happen either.
+
+This really isn't a big deal I think. The let can be 
+
 
 Further notes about case elimination
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -1788,6 +1804,7 @@ rebuildCase env scrut case_bndr [(_, bndrs, rhs)] cont
       | otherwise    = exprOkForSpeculation scrut
             -- The case-binder is alive, but we may be able
             -- turn the case into a let, if the expression is ok-for-spec
+            -- See Note [Case elimination: unlifted case]
 
     ok_for_spec      = exprOkForSpeculation scrut
     is_plain_seq     = isDeadBinder case_bndr  -- Evaluation *only* for effect