[llvm-dev] Where's the optimiser gone? (part 5.c): missed tail calls, and more...
Stefan Kanthak via llvm-dev
llvm-dev at lists.llvm.org
Sat Dec 1 12:15:09 PST 2018
"Craig Topper" <craig.topper at gmail.com> wrote:
> For the multiply case, your improved code requires duplicating a load.
... while saving another load and a store, and it doesn't clobber ESI.
> Sure it's safe in this case because there are no stores and the memory isn't
> volatile.
Right. Especially the latter can safely be assumed true for function
arguments on the stack.
> But the register allocator would have to analyze the code to
> prove that it's safe to duplicate.
This sentence implies for me that it might be a design goal to
never load a function argument or variable twice.
If yes, that's OK; if not, the register allocator should prove.
regards
Stefan
> On Sat, Dec 1, 2018 at 9:38 AM Stefan Kanthak via llvm-dev <
> llvm-dev at lists.llvm.org> wrote:
>
>> Compile the following functions with "-O3 -target i386-win32"
>> (see <https://godbolt.org/z/exmjWY>):
>>
>> __int64 __fastcall div(__int64 foo, __int64 bar)
>> {
>> return foo / bar;
>> }
>>
>>
>> On the left the generated code; on the right the expected,
>> properly optimised code:
>>
>> push dword ptr [esp + 16] |
>> push dword ptr [esp + 16] |
>> push dword ptr [esp + 16] |
>> push dword ptr [esp + 16] |
>> call __alldiv | jmp __alldiv
>> ret 16 |
>>
>>
>> __int64 __fastcall mod(__int64 foo, __int64 bar)
>> {
>> return foo % bar;
>> }
>>
>> push dword ptr [esp + 16] |
>> push dword ptr [esp + 16] |
>> push dword ptr [esp + 16] |
>> push dword ptr [esp + 16] |
>> call __allrem | jmp __allrem
>> ret 16 |
>>
>>
>> __int64 __fastcall mul(__int64 foo, __int64 bar)
>> {
>> return foo * bar;
>> }
>>
>> push esi | mov ecx, dword ptr [esp + 16]
>> mov ecx, dword ptr [esp + 16] | mov edx, dword ptr [esp + 12]
>> mov esi, dword ptr [esp + 8] | imul edx, dword ptr [esp + 8]
>> mov eax, ecx | mov eax, dword ptr [esp + 4]
>> imul ecx, dword ptr [esp + 12] | imul ecx, eax
>> mul esi | add ecx, edx
>> imul esi, dword ptr [esp + 20] | mul dword ptr [esp + 12]
>> add edx, ecx | add edx, ecx
>> add edx, esi | ret 16
>> pop esi |
>> ret 16 |
>> _______________________________________________
>> 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