<div dir="ltr">Still not seeing it on ToT, so maybe it's been fixed?<br><br>





<p class="inbox-inbox-p1"><span class="inbox-inbox-s1">$ clang-tot -cc1 -S -triple i386-pc-win32 stack.c<br>...</span></p><div>_bar:   </div><div>        subl    $16, %esp</div><div>        movl    $1, (%esp)</div><div>        movl    $2, 4(%esp)</div><div>        calll   _foo</div><div>        movl    $3, (%esp)</div><div>        movl    $4, 4(%esp)</div><div>        movl    %eax, 12(%esp)</div><div>        calll   _foo</div><div>        movl    %eax, 8(%esp)</div><div>        addl    $16, %esp</div><div>        retl</div><div><br></div><div class="gmail_quote"><div>$ clang-tot --version</div><div>clang version 8.0.0 (trunk 342200) (llvm/trunk 342202)</div><div>Target: x86_64-unknown-linux-gnu</div><div>Thread model: posix<br><br><br></div><div dir="ltr"><br><br>On Fri, Sep 14, 2018 at 11:57 AM palpar <<a href="mailto:palparni@gmail.com">palparni@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div dir="ltr">Sorry I missed that important detail. The relevant part of the command line is:<div>-cc1 -S -triple i386-pc-win32<br></div><div>I don't expect it matters if it's for Windows or Linux in this case.</div></div></div><br><div class="gmail_quote"><div dir="ltr">On Fri, Sep 14, 2018 at 9:16 PM David Blaikie <<a href="mailto:dblaikie@gmail.com" target="_blank">dblaikie@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">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).<br><br><div>bar:                                    # @bar</div><div>        .cfi_startproc</div><div># %bb.0:                                # %entry</div><div>        pushq   %rbp</div><div>        .cfi_def_cfa_offset 16</div><div>        .cfi_offset %rbp, -16</div><div>        movq    %rsp, %rbp</div><div>        .cfi_def_cfa_register %rbp</div><div>        subq    $16, %rsp</div><div>        movl    $1, %edi</div><div>        movl    $2, %esi</div><div>        callq   foo</div><div>        movl    $3, %edi</div><div>        movl    $4, %esi</div><div>        movl    %eax, -4(%rbp)          # 4-byte Spill</div><div>        callq   foo</div><div>        movl    %eax, -8(%rbp)          # 4-byte Spill</div><div>        addq    $16, %rsp</div><div>        popq    %rbp</div><div>        .cfi_def_cfa %rsp, 8</div><div>        retq</div><div><br><br>Or on 32-bit X86:<br><br><div>bar:                                    # @bar</div><div>        .cfi_startproc</div><div># %bb.0:                                # %entry</div><div>        pushq   %rbp</div><div>        .cfi_def_cfa_offset 16</div><div>        .cfi_offset %rbp, -16</div><div>        movq    %rsp, %rbp</div><div>        .cfi_def_cfa_register %rbp</div><div>        subq    $16, %rsp</div><div>        movl    $1, %edi</div><div>        movl    $2, %esi</div><div>        callq   foo</div><div>        movl    $3, %edi</div><div>        movl    $4, %esi</div><div>        movl    %eax, -4(%rbp)          # 4-byte Spill</div><div>        callq   foo</div><div>        movl    %eax, -8(%rbp)          # 4-byte Spill</div><div>        addq    $16, %rsp</div><div>        popq    %rbp</div><div>        .cfi_def_cfa %rsp, 8</div><div>        retq</div></div><div><br></div></div><br><div class="gmail_quote"><div dir="ltr">On Fri, Sep 14, 2018 at 8:16 AM palpar via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Hi everyone,<div><br></div><div>I found that LLVM generates redundant code when calling functions with constant parameters, with optimizations disabled.</div><div><br></div><div><div>Consider the following C code snippet:</div><div><br></div><div>int foo(int x, int y);</div><div><br></div><div><div>void bar()</div><div>{</div><div><span style="white-space:pre-wrap"> </span>foo(1, 2);</div><div><span style="white-space:pre-wrap">       </span>foo(3, 4);</div><div>}</div></div><div><br></div><div>Clang/LLVM 6.0 generates the following assembly code:</div><div>_bar:</div><div><span style="white-space:pre-wrap">  </span>subl<span style="white-space:pre-wrap">    </span>$32, %esp</div><div><span style="white-space:pre-wrap">        </span>movl<span style="white-space:pre-wrap">    </span>$1, %eax</div><div><span style="white-space:pre-wrap"> </span>movl<span style="white-space:pre-wrap">    </span>$2, %ecx</div><div><span style="white-space:pre-wrap"> </span>movl<span style="white-space:pre-wrap">    </span>$1, (%esp)</div><div><span style="white-space:pre-wrap">       </span>movl<span style="white-space:pre-wrap">    </span>$2, 4(%esp)</div><div><span style="white-space:pre-wrap">      </span>movl<span style="white-space:pre-wrap">    </span>%eax, 28(%esp)</div><div><span style="white-space:pre-wrap">   </span>movl<span style="white-space:pre-wrap">    </span>%ecx, 24(%esp)</div><div><span style="white-space:pre-wrap">   </span>calll<span style="white-space:pre-wrap">   </span>_foo</div><div><span style="white-space:pre-wrap">     </span>movl<span style="white-space:pre-wrap">    </span>$3, %ecx</div><div><span style="white-space:pre-wrap"> </span>movl<span style="white-space:pre-wrap">    </span>$4, %edx</div><div><span style="white-space:pre-wrap"> </span>movl<span style="white-space:pre-wrap">    </span>$3, (%esp)</div><div><span style="white-space:pre-wrap">       </span>movl<span style="white-space:pre-wrap">    </span>$4, 4(%esp)</div><div><span style="white-space:pre-wrap">      </span>movl<span style="white-space:pre-wrap">    </span>%eax, 20(%esp)</div><div><span style="white-space:pre-wrap">   </span>movl<span style="white-space:pre-wrap">    </span>%ecx, 16(%esp)</div><div><span style="white-space:pre-wrap">   </span>movl<span style="white-space:pre-wrap">    </span>%edx, 12(%esp)</div><div><span style="white-space:pre-wrap">   </span>calll<span style="white-space:pre-wrap">   </span>_foo</div><div><span style="white-space:pre-wrap">     </span>movl<span style="white-space:pre-wrap">    </span>%eax, 8(%esp)</div><div><span style="white-space:pre-wrap">    </span>addl<span style="white-space:pre-wrap">    </span>$32, %esp</div><div><span style="white-space:pre-wrap">        </span>retl</div><div><span style="white-space:pre-wrap">     </span><br></div><div>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).</div><div>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.</div><div>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?</div><div><br></div><div>(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.</div><div><div>define void @bar() #0 {</div><div>  %call = call i32 @foo(i32 1, i32 2)</div><div>  %call1 = call i32 @foo(i32 3, i32 4)</div><div>  ret void</div><div>}</div></div><div>)</div></div><div><br></div><div>Thanks,</div><div>Alpar</div></div>
_______________________________________________<br>
LLVM Developers mailing list<br>
<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a><br>
</blockquote></div>
</blockquote></div>
</blockquote></div></div>