[GHC] #9944: Performance issue

GHC ghc-devs at haskell.org
Wed Dec 31 08:54:31 UTC 2014


#9944: Performance issue
-------------------------------------+-------------------------------------
        Reporter:  clinton           |                   Owner:
            Type:  bug               |                  Status:  new
        Priority:  low               |               Milestone:
       Component:  Compiler          |                 Version:  7.8.3
      Resolution:                    |                Keywords:
Operating System:  Linux             |            Architecture:  x86_64
 Type of failure:  Runtime           |  (amd64)
  performance bug                    |               Test Case:
      Blocked By:                    |                Blocking:
 Related Tickets:                    |  Differential Revisions:
-------------------------------------+-------------------------------------
Description changed by clinton:

Old description:

> The runtime of the following code actually decreases if the number
> 2147483647 (2^31-1) is increased to 2147483648 (2^31).
>
> {{{#!hs
> f n = go 1 0 where
>   go i c = if i == n then c + i else go (i+1) (c+i)
>
> main = print $ f (2147483647 :: Int)
> }}}
>
> I've attached two dumps from ghc-core, core7 is the 2147483647 case and
> core8 is the 2147483648 case, however the main differences are below:
>
> '''2147483647 case:'''
> {{{
> _c3Qg:
>         cmpq $2147483647,%r14
>         jne _c3Q9
> _c3Qa:
>         leaq 2147483647(%rsi),%rbx
>         jmp *(%rbp)
> _c3Q9:
>         addq %r14,%rsi
>         incq %r14
>         jmp _c3Qg
> }}}
>
> '''2147483648 case:'''
> {{{
> _c3Qg:
>         movl $2147483648,%eax
>         cmpq %rax,%r14
>         jne _c3Q9
> _c3Qa:
>         movl $2147483648,%eax
>         movq %rsi,%rbx
>         addq %rax,%rbx
>         jmp *(%rbp)
> _c3Q9:
>         addq %r14,%rsi
>         incq %r14
>         jmp _c3Qg
> }}}
>
> Despite the extra instructions, the latter approach seems faster for  my
> PC.

New description:

 The runtime of the following code actually decreases if the number
 2147483647 (2^31^-1) is increased to 2147483648 (2^31^).

 {{{#!hs
 f n = go 1 0 where
   go i c = if i == n then c + i else go (i+1) (c+i)

 main = print $ f (2147483647 :: Int)
 }}}

 I've attached two dumps from ghc-core, core7 is the 2147483647 case and
 core8 is the 2147483648 case, however the main differences are below:

 '''2147483647 case:'''
 {{{
 _c3Qg:
         cmpq $2147483647,%r14
         jne _c3Q9
 _c3Qa:
         leaq 2147483647(%rsi),%rbx
         jmp *(%rbp)
 _c3Q9:
         addq %r14,%rsi
         incq %r14
         jmp _c3Qg
 }}}

 '''2147483648 case:'''
 {{{
 _c3Qg:
         movl $2147483648,%eax
         cmpq %rax,%r14
         jne _c3Q9
 _c3Qa:
         movl $2147483648,%eax
         movq %rsi,%rbx
         addq %rax,%rbx
         jmp *(%rbp)
 _c3Q9:
         addq %r14,%rsi
         incq %r14
         jmp _c3Qg
 }}}

 Despite the extra instructions, the latter approach seems faster for  my
 PC.

--

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


More information about the ghc-tickets mailing list