[LLVMdev] Poor register allocations vs gcc
deco33000 at yandex.com
deco33000 at yandex.com
Mon Jul 13 10:03:05 PDT 2015
Hello,
I have an issue with the llvm optimizations. I need to create object codes.
the -ON PURPOSE poor && useless- code :
---------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
int ci(int a){
return 23;
}
int flop(int a, char ** c){
a += 71;
int b = 0;
if (a == 56){
b = 69;
b += ci(a);
}
puts("ok");
return a + b;
}
--------------------------------------
Compiled that way (using the versions I downloaded and eventually compiled) :
clang_custom -std=c11 -O3 -march=native -c app2.c -S
against gcc:
gcc_custom -std=c11 -O3 -march=native -c app2.c -S
Versions (latest for each, downloaded just a few days ago):
gcc : 5.1
clang/llvm: clang+llvm-3.6.1-x86_64-apple-darwin
Host:
osx yosemite.
The assembly (cut to the essential):
LLVM:
pushq %rbp
movq %rsp, %rbp
pushq %r14
pushq %rbx
movl %edi, %r14d
leal 71(%r14), %eax
xorl %ecx, %ecx
cmpl $56, %eax
movl $92, %ebx
cmovnel %ecx, %ebx
leaq L_.str(%rip), %rdi
callq _puts
leal 71(%rbx,%r14), %eax
popq %rbx
popq %r14
popq %rbp
retq
and the gcc one:
pushq %rbp
movl $0, %eax
movl $92, %ebp
pushq %rbx
leal 71(%rdi), %ebx
leaq LC1(%rip), %rdi
subq $8, %rsp
cmpl $56, %ebx
cmovne %eax, %ebp
call _puts
addq $8, %rsp
leal 0(%rbp,%rbx), %eax
popq %rbx
popq %rbp
ret
As we can see, llvm makes poor register allocations (ecx and r14), leading to more instructions for the same result.
Are there some optimizations I can bring on the table to avoid this ?
--
Jog
More information about the llvm-dev
mailing list