[GHC] #11486: info tables are no longer aligned

GHC ghc-devs at haskell.org
Sun Jan 24 06:34:21 UTC 2016


#11486: info tables are no longer aligned
-------------------------------------+-------------------------------------
           Reporter:  rwbarton       |             Owner:
               Type:  bug            |            Status:  new
           Priority:  high           |         Milestone:  8.0.1
          Component:  Compiler       |           Version:  8.1
           Keywords:                 |  Operating System:  Unknown/Multiple
       Architecture:                 |   Type of failure:  None/Unknown
  Unknown/Multiple                   |
          Test Case:                 |        Blocked By:
           Blocking:                 |   Related Tickets:
Differential Rev(s):                 |         Wiki Page:
-------------------------------------+-------------------------------------
 Take a simple program like
 {{{
 main = mapM_ print "Hello, world"
 }}}
 and build with `-O`.

 Versions of ghc as late as 7.11.20150806 generate assembly that includes
 {{{
 ...
 _c3mn:
         movq $sat_s3m2_info,-16(%r12)
         movq %r14,(%r12)
         movq $block_c3mi_info,-16(%rbp)
         movl $GHC.Types.True_closure+2,%edi
         movq %rsi,%rax
         leaq -16(%r12),%rsi
         movl $GHC.IO.Handle.FD.stdout_closure,%r14d
         movq %rax,-8(%rbp)
         addq $-16,%rbp
         jmp GHC.IO.Handle.Text.hPutStr2_info
 .text
         .align 8
         .quad   1
         .quad   32
 block_c3mi_info:
 _c3mi:
         movq 8(%rbp),%rbx
         addq $16,%rbp
         jmp stg_ap_v_fast
 ...
 }}}
 Note the `.align 8` ensuring that the info table (and the code `_c3mi`
 itself) is 8-byte aligned.

 In 8.1.20160107 we instead get
 {{{
 _c5gE:
         movq $sat_s5g9_info,-16(%r12)
         movq %r14,(%r12)
         movq $block_c5gz_info,-16(%rbp)
         movl $GHC.Types.True_closure+2,%edi
         movq %rsi,%rax
         leaq -16(%r12),%rsi
         movl $GHC.IO.Handle.FD.stdout_closure,%r14d
         movq %rax,-8(%rbp)
         addq $-16,%rbp
         jmp GHC.IO.Handle.Text.hPutStr2_info
 _c5gF:
         movq $24,904(%r13)
 _c5gC:
         movl $Main.main2_closure,%ebx
         jmp *-8(%r13)
         .quad   1
         .quad   32
 block_c5gz_info:
 _c5gz:
         movq 8(%rbp),%rbx
         addq $16,%rbp
         jmp stg_ap_v_fast
         .size Main.main2_info, .-Main.main2_info
 }}}
 There is some minor rearrangement, but more importantly there is no longer
 any `.align 8` before `.quad 1`. That means the info table is not
 necessarily aligned, and indeed `c5gz_info` ended up at the address
 `40676f`.

 I'm guessing this is bad for performance, though I don't know how bad.

 I'm pretty sure this is due to 4a32bf925b8aba7885d9c745769fe84a10979a53
 "Implement function-sections for Haskell code" though I haven't looked at
 that commit in detail.

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


More information about the ghc-tickets mailing list