[cfe-dev] Poor register allocations vs gcc

deco33000 at yandex.com deco33000 at yandex.com
Mon Jul 13 10:58:30 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 cfe-dev mailing list