
#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): I have a nice one: {{{ libHSghc-8.5-ghc8.5.20180103.dylib`sSTG_info + 98 [inlined] _c147g + 1 503 -- force evaluation all this stuff to avoid space leaks 504 {-# SCC "seqString" #-} evaluate $ seqString (showSDoc dflags $ vcat $ map ppr imports) 505 0x102a5b6ca <+98>: leal -0x179cf8(%rip), %eax ; ghc_Outputable_SDC_con_info 0x102a5b6d0 <+104>: movq %rax, -0x18(%r12) 0x102a5b6d5 <+109>: leaq 0x95471c(%rip), %rax ; ghc_Outputable_defaultUserStyle1_closure 0x102a5b6dc <+116>: movq %rax, -0x10(%r12) 0x102a5b6e1 <+121>: movq %rbx, -0x8(%r12) 0x102a5b6e6 <+126>: movq 0x8(%rbp), %rax 0x102a5b6ea <+130>: movq %rax, (%r12) 0x102a5b6ee <+134>: movq -0x10(%r12), %rax 0x102a5b6f3 <+139>: testb $0x7, %al 0x102a5b6f5 <+141>: jne 0x102a5b70b ; <+163> [inlined] _c147A libHSghc-8.5-ghc8.5.20180103.dylib`sSTG_info + 143 [inlined] _c147B 503 -- force evaluation all this stuff to avoid space leaks 504 {-# SCC "seqString" #-} evaluate $ seqString (showSDoc dflags $ vcat $ map ppr imports) 505 0x102a5b6f7 <+143>: subq $0x8, %rsp 0x102a5b6fb <+147>: movq -0x10(%r12), %rdi 0x102a5b700 <+152>: xorl %eax, %eax 0x102a5b702 <+154>: callq 0x102eb8604 ; symbol stub for: checkTagged }}} Here the first (banged) field of `SDC` gets initialised to a global closure. Clearly it is non-tagged and not evaluated. It gets caught by my assertion a bit later. I think this is a clear bug. The closure should be entered and evaluated to a WHNF (tagged) constructor before saving it into the `SDC` constructor. I did a `quick` compilation with `make -j5 GhcStage2HcOpts="-O1 -g" stage=2` in this case. I still don't understand how GHC manages to create a standalone closure (nullary thunk, statically allocated, PC-relative) for `defaultUserStyle dflags`. {{{ showSDoc dflags sdoc = renderWithStyle dflags sdoc (defaultUserStyle dflags) }}} It looks ''unary'' to me! -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/14626#comment:33 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler