[GHC] #14372: CMM contains a bunch of tail-merging opportunities

GHC ghc-devs at haskell.org
Sat Jan 13 19:51:08 UTC 2018


#14372: CMM contains a bunch of tail-merging opportunities
-------------------------------------+-------------------------------------
        Reporter:  heisenbug         |                Owner:  (none)
            Type:  feature request   |               Status:  new
        Priority:  normal            |            Milestone:
       Component:  Compiler          |              Version:  8.2.1
      Resolution:                    |             Keywords:
Operating System:  Unknown/Multiple  |         Architecture:
                                     |  Unknown/Multiple
 Type of failure:  None/Unknown      |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:                    |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------

Comment (by AndreasK):

 Replying to [comment:3 bgamari]:
 > Poorly predicted branches can indeed be expensive. However, I think here
 we are just taking about jumps which, as far as I know, are quite cheap
 assuming they don't boot you out of $I since they can be predicted
 perfectly.

 I've run the code:
 {{{

 {-# NOINLINE f_test #-}
 f_test :: Int ->Int
 f_test a = case a of
     1  -> 11001
     2  -> 11002
     3  -> 11003
     4  -> 11004
     5  -> 11005
     6  -> 11006
     7  -> 11007
     8  -> 11008

 main = print . sum . map (f_test) $ (concat . replicate 9000000)
 [1..45::Int]
 }}}

 I did the transformation manually into:


 {{{
 .Lc48I:
         cmpq $9,%r14
         jge .Lc48z
 .Lu48L:
         cmpq $1,%r14
         jl .Lc48z
 .Lu48M:
         movl .Ln48P-8(,%r14,8), %ebx
         jmp *(%rbp)
 .Lc48z:
         movq $-1,%rbx
         jmp *(%rbp)


 .section .rodata
 .Ln48P:
         .quad   11001
         # 11002 .. 11007
         .quad   11008
 }}}
 Turning the jumps into a indirect mov instruction.

 > I wonder what prior art exists in this area; I'm sure other compilers
 have considered this in the past.

 Gcc/clang do the same thing for switch statements.

 It improved speed, but not by much and depending on the codelayout I did
 it was possible to get worse performance in specific cases. But thats true
 for everything that changes the code layout and isn't a major win I
 assume.

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


More information about the ghc-tickets mailing list