2014-01-23 5 views
5

mit Code starten wie diesellvm optimiert mit Bibliotheksfunktionen

void lib_memset(unsigned char *dest, unsigned char c, unsigned int n) 
{ 
    while(n--) 
    { 
     *dest=c; 
     dest++; 
    } 
} 

llvm als Cross-Compiler

clang -Wall -m32 -emit-llvm -fno-builtin --target=arm-none-eabi -c lib_memset.c -o lib_memset.bc 
opt -std-compile-opts -strip-debug -march=arm -mcpu=mpcore -mtriple=arm-none-eabi lib_memset.bc -o lib_memset.opt.bc 
llc -march=arm -mcpu=mpcore -disable-simplify-libcalls lib_memset.opt.bc -o lib_memset.opt.s 
llc -march=arm -mcpu=mpcore -disable-simplify-libcalls lib_memset.bc -o lib_memset.s 

und es erkennt und ersetzt es mit einem echten Memset wenn der Optimierer verwendet wird

lib_memset: 
    push {r11, lr} 
    mov r3, r1 
    mov r11, sp 
    cmp r2, #0 
    beq .LBB0_2 
    mov r1, r2 
    mov r2, r3 
    bl __aeabi_memset 
.LBB0_2:        @ %while.end 
    pop {r11, pc} 

aber implementiert es ohne.

Ich will nicht, dass ich will, dass es den Code kompilieren, den ich es für das Ziel gab ich gab es eher als Bibliotheksaufrufe verwenden. Ich dachte, das -disable-simplify-libcalls würde es tun, tut es aber nicht.

Ich dachte, ich hätte das vorher herausgefunden, aber kann nicht herausfinden, wie es geht. Ich brauche den Optimierer, ich möchte dieses zirkuläre Abhängigkeitsproblem nicht haben, die Bibliothek zu implementieren, und es benötigt die Bibliothek, usw. Könnte es in asm tun, um den Compiler aus der Schleife herauszunehmen, aber nicht müssen.

+0

'-freestanding'? [dasselbe Problem?] (http://lists.cs.uiuc.edu/pipermail/llvmdev/2012-May/050112.html) –

+0

nein, hat es nicht behoben. –

+1

DOH! Benötigt die -disable-simplify-libcalls im opt-Schritt statt oder so gut wie llc ... das hat es behoben. –

Antwort

8
clang -Wall -m32 -emit-llvm -fno-builtin --target=arm-none-eabi -ffreestanding -c lib_memset.c -o lib_memset.bc 
opt -std-compile-opts -strip-debug -march=arm -mcpu=mpcore -mtriple=arm-none-eabi -disable-simplify-libcalls lib_memset.bc -o lib_memset.opt.bc 
llc -march=arm -mcpu=mpcore -disable-simplify-libcalls -mtriple=arm-none-eabi lib_memset.opt.bc -o lib_memset.opt.s 
llc -march=arm -mcpu=mpcore -disable-simplify-libcalls -mtriple=arm-none-eabi lib_memset.bc -o lib_memset.s 

dank artless Lärm während -ffreestanding Zugabe, habe ich beschlossen, alle --help Optionen für llc neu zu lesen und zu entscheiden, und fand die -disable-simpilfy-libcalls ist eine Option sowohl für opt und llc Hinzufügen zum opt behebt das Problem.

lib_memset: 
    cmp r2, #0 
    bxeq lr 
.LBB0_1: 
    strb r1, [r0], #1 
    subs r2, r2, #1 
    bne .LBB0_1 
    bx lr 

Ich habe wie meine eigene Frage zu beantworten, kann hier ein wenig sitzen, so kann ich vielleicht die Antwort beim nächsten Mal finden oder wenn die SO Götter entscheiden, es hier zu verlassen, die in Ordnung ist ...

+2

Die Beantwortung Ihrer eigenen Frage ist in Ordnung. Es gibt eine Verzögerung von zwei Tagen, bevor Sie es akzeptieren können, so dass auch alle anderen eine faire Chance haben, zu antworten. Sie sollten es auf jeden Fall hier behalten, falls jemand anderes in Zukunft auf dasselbe Problem stoßen sollte. – Lundin

1

Ich stoße auf das gleiche Problem und wenn es immer noch jemandem helfen kann, ist das, was ich getan habe, um es zu lösen - ich modifiziere die LoopIdiomRecognize.cpp Datei im llvm Quellcode: gibt es einen Code, der prüft, ob der Name der Funktion memset oder ist memcpy es bricht die Optimierung ab, also änderte ich es von:

StringRef Name = L->getHeader()->getParent()->getName(); 
    if (Name == "memset" || Name == "memcpy") 

bis

StringRef Name = L->getHeader()->getParent()->getName(); 
    if (Name.endswith("memset") || Name == "memcpy")