[llvm-commits] PATCH: Tailcallopt x86 byval argument handling
Arnold Schwaighofer
arnold.schwaighofer at gmail.com
Thu Apr 10 17:52:19 PDT 2008
On Fri, Apr 11, 2008 at 2:10 AM, Evan Cheng <evan.cheng at apple.com> wrote:
> Thanks. The patch looks good. Have you verified the register allocator
> does eliminate the unnecessary copies?
Depends on what your notion of verify is. I checked with a few examples. :)
The copying of arguments for register parameters to virtual registers
and back to the parameter's register is only emitted in cases where
tail call opt is on and the function call contains a byval argument.
So tail calls without byval arguments would not pay the price. So even
in this case i wouldn't be so bad?
take for example the following call:
define fastcc i64 @tailcaller(i64 %b, %struct.s* byval %a) {
entry:
%tmp2 = getelementptr %struct.s* %a, i32 0, i32 1
%tmp3 = load i64* %tmp2, align 8
%tmp4 = tail call fastcc i64 @tailcallee(%struct.s* %a byval,
i64 %tmp3, i64 %b, i64 7, i64 13, i64 17)
ret i64 %tmp4
}
as you can see 3rd (7) and 5th (17) argument are directly moved to
their corresponding argument register (rdx,r8). only rsi, rdi, rcx are
moved to intermediate registers as expected (killed by byval
lowering). as note that when i say 3rd i really mean 4th (b) but since
the first argument is byval and passed on the stack it i do not take
into account. so it seems the allocator is doing it's job nicely.
tailcaller:
pushq %rbx
subq $32, %rsp
movq %rdi, %rax
movq 56(%rsp), %r9
movl $6, %r10d
leaq 48(%rsp), %rsi
movq %r10, %rcx
movq %rsp, %rdi
rep;movsl
leaq 48(%rsp), %rdi
movl $13, %ebx
movl $7, %edx
movl $17, %r8d
movq %r10, %rcx
movq %rsp, %rsi
rep;movsl
movq %r9, %rdi
movq %rax, %rsi
movq %rbx, %rcx
addq $32, %rsp
popq %rbx
jmp tailcallee # TAILCALL
.size tailcaller, .-tailcaller
okay to commit?
More information about the llvm-commits
mailing list