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

GHC ghc-devs at haskell.org
Thu Jan 11 18:17:53 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 heisenbug):

 Replying to [comment:14 simonpj]:
 > > Name.hs:111 is a strict record field BTW. Does this ring a bell? Why
 is it OtherCon _ <- idUnfolding id but not tagged? Is it possibly
 implicitly unpacked?
 >
 > Can you explain more?  I can't make sense of this paragraph.  What is
 "it" that might be implicitly unpacked?  What does it mean to be
 "implicitly unpacked" ?

 No, this is a red herring. Just me, desperately looking for hints. The
 `n_occ` is not unpacked.

 But I have a theory now.

 I set a few breakpoints:


 {{{
 (gdb) info breakpoints
 Num     Type           Disp Enb Address            What
 8       breakpoint     keep n   0x00007ffff52e39e0 in ghc_Name_nzuocC_info
                                                    at
 compiler/basicTypes/Name.hs:111
         breakpoint already hit 1 time
 11      breakpoint     keep y   0x00007ffff52e3a18 in ghc_Name_nzuocC_info
                                                    at
 compiler/basicTypes/Name.hs:111
         breakpoint already hit 46 times
 12      breakpoint     keep y   0x00007ffff2332a58 <checkTagged>
         breakpoint already hit 1 time
 }}}

 ''bp11'' is set as `breakpoint *ghc_Name_nzuocC_info+56`

 ''bp11'' is the continuation of ''bp8'' which is jumped at when the `Name`
 is in WHNF. Then the `n_occ` field is being extracted.

 It turns out that ''bp11'' needs to be hit '''46 times''' in order to find
 it untagged!

 Then I looked into why it is untagged at all. Here is a transcript from
 `gdb`
 `0x420006f4a9` is the (tagged) `Name`:
 {{{
 (gdb) x/x 0x420006f4a9-1
 0x420006f4a8:   0xf52ece08
 (gdb) x/x 0x420006f4a9+7
 0x420006f4b0:   0x0006f451
 (gdb) x/x 0x420006f4a9+15
 0x420006f4b8:   0x000662a0
 (gdb) x/x 0x420006f4a9+19
 0x420006f4bc:   0x00000042
 ### the `n_occ` field is 0x42000662a0

 (gdb) x/x 0x420006f4a9+23
 0x420006f4c0:   0xf74a17e8
 (gdb) x/x 0x420006f4a9+31
 0x420006f4c8:   0x00001818
 }}}

 Then I follow the closure pointer of the `OccName`:

 {{{
 (gdb) x/2x 0x42000662a0
 0x42000662a0:   0xf2335878      0x00007fff
 (gdb) x/x 0x00007ffff2335878
 0x7ffff2335878 <stg_BLACKHOLE_info>:    0x08438b48
 }}}

 Ooops! How can a strict field point to a '''BLACKHOLE'''?

 So this is my findings. Are strict fields able to hold blackholes?
 And if so, why do they carry an ''isEvaldUnfolding` when pattern matched
 against?

 Any hints appreciated!

 >
 > One good thing would be to distill a tiny example, and it sounds as if
 you have enough insight to do that now.  E.g. perhaps you are saying that
 > {{{
 > data T = MkT ![Int]
 > f (MkT xs) = xs
 > }}}
 > returns a badly-tagged pointer?  If so, just compile that tiny program
 and see.  etc.

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


More information about the ghc-tickets mailing list