Better code for top-level indirections
GHC generates lots of top-level indirections looking like this:
foo :: T
foo = bar `cast` (some coercion)
There are good reasons for this. Moreover foo
will almost never be evaluated, because GHC will inline any call to foo
at its call site.
But GHC generates rather a lot of code for this one (almost-vacuous) bindings:
.align 4,0x90
.long _Swx_srt-(_Foo_zdfTypeableT_info)+4
.long 0
.long 65558
.globl _Foo_zdfTypeableT_info
_Foo_zdfTypeableT_info:
.LcwI:
movl %esi,%eax
leal -8(%ebp),%ecx
cmpl 84(%ebx),%ecx
jb .LcwP
addl $8,%edi
cmpl 92(%ebx),%edi
ja .LcwR
movl $_stg_CAF_BLACKHOLE_info,-4(%edi)
movl 100(%ebx),%ecx
movl %ecx,0(%edi)
leal -4(%edi),%ecx
pushl %ecx
pushl %eax
pushl %ebx
movl %eax,76(%esp)
call _newCAF
addl $12,%esp
testl %eax,%eax
je .LcwK
movl $_stg_bh_upd_frame_info,-8(%ebp)
leal -4(%edi),%eax
movl %eax,-4(%ebp)
movl $_Foo_zdfTypeableTzuzdctypeOf_closure+1,%esi
addl $-8,%ebp
jmp *(%ebp)
.LcwK:
movl 64(%esp),%eax
jmp *(%eax)
.LcwR:
movl $8,116(%ebx)
.LcwP:
movl %eax,%esi
jmp *-12(%ebx)
Whereas all we really need for foo
is code that says "jump to bar
". No need to update that top-level thunk. It's just an indirection and (if you have -O
on) one that will never even be used.
In short, I think that top-level indirections could do with a tiny special case in the code generator.
Trac metadata
Trac field | Value |
---|---|
Version | 7.6.1 |
Type | Bug |
TypeOfFailure | OtherFailure |
Priority | normal |
Resolution | Unresolved |
Component | Compiler |
Test case | |
Differential revisions | |
BlockedBy | |
Related | |
Blocking | |
CC | |
Operating system | |
Architecture |