[Haskell-cafe] redundant loads and saves in code generated for recursive functions?

Johan Tibell johan.tibell at gmail.com
Wed Jul 30 10:44:33 UTC 2014

Hi Jyotirmoy,

I didn't read your assembly carefully, but it sounds similar to
https://ghc.haskell.org/trac/ghc/ticket/8905, which is not fixed yet.

On Wed, Jul 30, 2014 at 12:03 PM, Jyotirmoy Bhattacharya
<jyotirmoy at jyotirmoy.net> wrote:
> On reading this again I realise that I got the order of loads and stores
> wrong. The arguments are being stored on entering the function and loaded
> before the call. But still, is there a chance of eliminating this
> redundancy?
> Jyotirmoy
> On Wed, Jul 30, 2014 at 1:54 PM, Jyotirmoy Bhattacharya
> <jyotirmoy at jyotirmoy.net> wrote:
>> Dear All,
>> I am new to Haskell so please forgive me if I am asking about something
>> already well-understood.
>> I was trying to understand the performance of my Haskell program compiled
>> with the LLVM backend. I used -ddump-llvm to dump the LLVM assembly and then
>> ran llc -O3 on the resulting file to look at the native assembly.
>> One of the generated function starts off with
>> s5BH_info:                              # @s5BH_info
>> # BB#0:
>>         subq    $208, %rsp
>>         movq    %r13, 200(%rsp)
>>         movq    %rbp, 192(%rsp)
>>         movq    %r12, 184(%rsp)
>>         movq    %rbx, 176(%rsp)
>>         movq    %r14, 168(%rsp)
>>         movq    %rsi, 160(%rsp)
>>         movq    %rdi, 152(%rsp)
>>         movq    %r8, 144(%rsp)
>>         movq    %r9, 136(%rsp)
>>         movq    %r15, 128(%rsp)
>>         movss   %xmm1, 124(%rsp)
>>         movss   %xmm2, 120(%rsp)
>>         movss   %xmm3, 116(%rsp)
>>         movss   %xmm4, 112(%rsp)
>>         movsd   %xmm5, 104(%rsp)
>>         movsd   %xmm6, 96(%rsp)
>> At some point down the line the function makes a tail call to itself and
>> this is the code generated
>>         movq    %r14, 168(%rsp)
>>         movq    200(%rsp), %r13
>>         movq    192(%rsp), %rbp
>>         movq    184(%rsp), %r12
>>         movq    176(%rsp), %rbx
>>         movq    128(%rsp), %r15
>>         movsd   104(%rsp), %xmm5
>>         addq    $208, %rsp
>>         jmp     s5BH_info
>> So it looks like some values are being moved from registers to the stack
>> only to be immediately moved from the stack to the register on entry to the
>> function. It should be possible to eliminate both the load and the stores.
>> Is this behaviour due to LLVM or GHC? If it is GHC, it this an
>> optimization a newcomer can attempt to implement or are there deep issues
>> here?
>> Jyotirmoy Bhattacharya
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe

More information about the Haskell-Cafe mailing list