[GHC] #8900: Strictness analysis regression

GHC ghc-devs at haskell.org
Fri Mar 21 17:08:14 UTC 2014


#8900: Strictness analysis regression
--------------------------------------------+------------------------------
        Reporter:  tibbe                    |            Owner:
            Type:  bug                      |           Status:  new
        Priority:  normal                   |        Milestone:
       Component:  Compiler                 |          Version:  7.8.1-rc2
      Resolution:                           |         Keywords:
Operating System:  MacOS X                  |     Architecture:  x86_64
 Type of failure:  Runtime performance bug  |  (amd64)
       Test Case:                           |       Difficulty:  Unknown
        Blocking:                           |       Blocked By:
                                            |  Related Tickets:
--------------------------------------------+------------------------------

Comment (by simonpj):

 Johan, the "extra case" comes from commit
 28d9a03253e8fd613667526a170b684f2017d299, whose comment says
 {{{
     Make CaseElim a bit less aggressive

     See Note [Case elimination: lifted case]:

     We used to do case elimination if
             (c) the scrutinee is a variable and 'x' is used strictly
     But that changes
         case x of { _ -> error "bad" }
         --> error "bad"
     which is very puzzling if 'x' is later bound to (error "good").
     Where the order of evaluation is specified (via seq or case)
     we should respect it.
 }}}
 And indeed that's a good point.  `Note [Case binder next]` in
 `Simplify.lhs` is relevant here.

 You point out that `$wpoly_go` is strict in its last arg, so it really is
 "next".  I wonder how picky we want to be. Consider
 {{{
 case x of y -> g (error "uk") y
 }}}
 and suppose that g is strict in both arguments.  Would it be ok to drop
 the case?  Then we might get `error "uk"` (if `g` evaluated its first arg
 first) rather than any error arising from `x`?  Probably yes, I guess.

 Indeed maybe the change is just wrong, or at least over-conservative.
 According to our paper "A semantics of imprecise exceptions" it is ok.  I
 don't think anyone actually reported a bug.  So maybe we should revert to
 the ghc 7.6 behaviour?

--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/8900#comment:15>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list