[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