[GHC] #14626: No need to enter a scrutinised value

GHC ghc-devs at haskell.org
Wed Jan 3 00:41:10 UTC 2018


#14626: No need to enter a scrutinised value
-------------------------------------+-------------------------------------
        Reporter:  heisenbug         |                Owner:  heisenbug
            Type:  bug               |               Status:  new
        Priority:  normal            |            Milestone:
       Component:  Compiler          |              Version:  8.2.2
      Resolution:                    |             Keywords:  performance
Operating System:  Unknown/Multiple  |         Architecture:
                                     |  Unknown/Multiple
 Type of failure:  None/Unknown      |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:  #13861            |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------

Comment (by simonpj):

 > So something is definitely fishy here.

 I think that there's something different about '''top-level''' binders.
 Consider
 {{{
 data T = MkT !Bool
 top_x = True

 f True  (MkT local_y) = local_y
 f False _             = top_x
 }}}
 Here I think that `local_y` gets bound to a correctly-tagged pointer,
 fetched out of the `MkT` constructor.

 But, in contrast, I think that `top_x` is bound to the label for the top-
 level closure for `top_x`, which is 8-byte aligned.  So the label isn't
 tagged; instead, the code generator has to tag it.  Is that happening in
 your "return it instead of eantering it" path?

 Other than that I have no idea why it crashes.  Things you might try:

 * Switch off the new optimisation when building stage2 and the libraries.
 Use it only for the test suite: these are small programs and easier to
 debug.

 * Maybe add an assertion in the Cmm: the claim is that on the "return it"
 path, the thing beign returned is a correctly-tagged pointer.  So, the
 assertion can follow the pointer and check that the thing pointed to is a
 value, with the right tag, etc.  There must be some code in the RTS (or
 somewhere) that checks that.

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


More information about the ghc-tickets mailing list