[llvm-dev] Where's the optimiser gone? (part 5.b): missed tail calls, and more...

Stefan Kanthak via llvm-dev llvm-dev at lists.llvm.org
Sat Dec 1 11:55:38 PST 2018


"Craig Topper" <craig.topper at gmail.com> wrote:


> Clang's -target option is supposed to take a cpu type and an operating
> system. So "-target i386" is giving it no operatiing system. This is
> preventing frame pointer elimination which is why ebp is being updated. If
> you pass "-target i386-linux" you get sightly better code.

The frame pointer is but not the point here.

> The division/remainder operations are turned into library calls as part of
> instruction selection. This code is somewhat independent of how other calls
> are handled. We probably don't support tail calls in it. Is it really
> realistic that a user would have a non-inlined function that contains just
> a division? Why should we optimize for that case?

I've seen quite some libraries which implement such functions, calling
just another function having the same prototype, as target-independent
wrappers.
So the question is not whether it's just a division, but in general the
call of a function having the same prototype.

regards
Stefan

> On Sat, Dec 1, 2018 at 9:37 AM Stefan Kanthak via llvm-dev <
> llvm-dev at lists.llvm.org> wrote:
> 
>> Compile the following functions with "-O3 -target i386"
>> (see <https://godbolt.org/z/VmKlXL>):
>>
>> long long div(long long foo, long long bar)
>> {
>>     return foo / bar;
>> }
>>
>> On the left the generated code; on the right the expected,
>> properly optimised code:
>>
>> div: # @div
>>     push  ebp                     |
>>     mov   ebp, esp                |
>>     push  dword ptr [ebp + 20]    |
>>     push  dword ptr [ebp + 16]    |
>>     push  dword ptr [ebp + 12]    |
>>     push  dword ptr [ebp + 8]     |
>>     call  __divdi3                |    jmp   __divdi3
>>     add   esp, 16                 |
>>     pop   ebp                     |
>>     ret                           |
>>
>>
>> long long mod(long long foo, long long bar)
>> {
>>     return foo % bar;
>> }
>>
>> mod: # @mod
>>     push  ebp                     |
>>     mov   ebp, esp                |
>>     push  dword ptr [ebp + 20]    |
>>     push  dword ptr [ebp + 16]    |
>>     push  dword ptr [ebp + 12]    |
>>     push  dword ptr [ebp + 8]     |
>>     call  __moddi3                |    jmp   __moddi3
>>     add   esp, 16                 |
>>     pop   ebp                     |
>>     ret                           |
>>
>>
>> long long mul(long long foo, long long bar)
>> {
>>     return foo * bar;
>> }
>>
>> mul: # @mul
>>     push  ebp
>>     mov   ebp, esp
>>     push  esi
>>     mov   ecx, dword ptr [ebp + 16]
>>     mov   esi, dword ptr [ebp + 8]
>>     mov   eax, ecx
>>     imul  ecx, dword ptr [ebp + 12]
>>     mul   esi
>>     imul  esi, dword ptr [ebp + 20]
>>     add   edx, ecx
>>     add   edx, esi
>>     pop   esi
>>     pop   ebp
>>     ret
>> _______________________________________________
>> LLVM Developers mailing list
>> llvm-dev at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>>
>


More information about the llvm-dev mailing list