[llvm-dev] Function calls keep increasing the stack usage
David Blaikie via llvm-dev
llvm-dev at lists.llvm.org
Fri Sep 14 11:15:53 PDT 2018
Can't say I've observed that behavior (though I'm just building from
top-of-tree rather than 6.0, compiling for x86-64 on linux), perhaps you
could provide more detail (what target are you compiling for - possibly
provide the -cc1 command line, etc).
bar: # @bar
.cfi_startproc
# %bb.0: # %entry
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset %rbp, -16
movq %rsp, %rbp
.cfi_def_cfa_register %rbp
subq $16, %rsp
movl $1, %edi
movl $2, %esi
callq foo
movl $3, %edi
movl $4, %esi
movl %eax, -4(%rbp) # 4-byte Spill
callq foo
movl %eax, -8(%rbp) # 4-byte Spill
addq $16, %rsp
popq %rbp
.cfi_def_cfa %rsp, 8
retq
Or on 32-bit X86:
bar: # @bar
.cfi_startproc
# %bb.0: # %entry
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset %rbp, -16
movq %rsp, %rbp
.cfi_def_cfa_register %rbp
subq $16, %rsp
movl $1, %edi
movl $2, %esi
callq foo
movl $3, %edi
movl $4, %esi
movl %eax, -4(%rbp) # 4-byte Spill
callq foo
movl %eax, -8(%rbp) # 4-byte Spill
addq $16, %rsp
popq %rbp
.cfi_def_cfa %rsp, 8
retq
On Fri, Sep 14, 2018 at 8:16 AM palpar via llvm-dev <llvm-dev at lists.llvm.org>
wrote:
> Hi everyone,
>
> I found that LLVM generates redundant code when calling functions with
> constant parameters, with optimizations disabled.
>
> Consider the following C code snippet:
>
> int foo(int x, int y);
>
> void bar()
> {
> foo(1, 2);
> foo(3, 4);
> }
>
> Clang/LLVM 6.0 generates the following assembly code:
> _bar:
> subl $32, %esp
> movl $1, %eax
> movl $2, %ecx
> movl $1, (%esp)
> movl $2, 4(%esp)
> movl %eax, 28(%esp)
> movl %ecx, 24(%esp)
> calll _foo
> movl $3, %ecx
> movl $4, %edx
> movl $3, (%esp)
> movl $4, 4(%esp)
> movl %eax, 20(%esp)
> movl %ecx, 16(%esp)
> movl %edx, 12(%esp)
> calll _foo
> movl %eax, 8(%esp)
> addl $32, %esp
> retl
>
> Note how the constants are stored in registers but when saving the
> parameters on the stack for the call the immediate values are used. The
> registers are still stored on the stack probably because it's the caller's
> responsibility once they were used (which seems expected).
> I think the problem comes from the fact that LLVM unconditionally
> allocates a register for each parameter value regardless if it's used later
> or not.
> If the stack space of the program is sufficiently large this is probably
> not a problem, but otherwise if there is a large number of such calls,
> despite not recursive, it can lead to stack overflow. Do you think I should
> create a bug report for this?
>
> (Similarly, the return value of the function could be not saved but the
> LLVM IR code that Clang generates has the call with assignment so at this
> point LLVM couldn't possibly know.
> define void @bar() #0 {
> %call = call i32 @foo(i32 1, i32 2)
> %call1 = call i32 @foo(i32 3, i32 4)
> ret void
> }
> )
>
> Thanks,
> Alpar
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20180914/bb2265cd/attachment.html>
More information about the llvm-dev
mailing list