Optimization llvm使用库函数进行优化
从这样的代码开始Optimization llvm使用库函数进行优化,optimization,assembly,embedded,arm,bare-metal,Optimization,Assembly,Embedded,Arm,Bare Metal,从这样的代码开始 void lib_memset( unsigned char *dest, unsigned char c, unsigned int n) { while(n--) { *dest=c; dest++; } } 使用llvm作为交叉编译器 clang -Wall -m32 -emit-llvm -fno-builtin --target=arm-none-eabi -c lib_memset.c -o lib_mem
void lib_memset( unsigned char *dest, unsigned char c, unsigned int n)
{
while(n--)
{
*dest=c;
dest++;
}
}
使用llvm作为交叉编译器
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
当使用优化器时,它会检测并用一个真正的memset替换它
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}
但它的实现没有任何限制
我不希望它编译我给它的目标代码,而不是使用库调用。我以为-disable-simplify-libcalls可以做到这一点,但事实并非如此
我以为我以前就知道了,但是我不知道怎么做。我需要优化器,我不希望出现实现库的循环依赖性问题,它需要库,等等。可以在asm中这样做,将编译器带出循环,但不应该这样做
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
多亏了添加-ffreestanding时的自然噪音,我决定重新阅读llc和opt的所有--help选项,发现-disable simpilfy libcalls是opt和llc的一个选项,将其添加到opt修复了问题
lib_memset:
cmp r2, #0
bxeq lr
.LBB0_1:
strb r1, [r0], #1
subs r2, r2, #1
bne .LBB0_1
bx lr
我不喜欢回答我自己的问题,可以坐在这里一会儿,这样我下次可能会找到答案,或者如果上帝决定把它留在这里,那就好了…我遇到了同样的问题,如果它仍然可以帮助任何人,这就是我解决它的方法-我修改llvm源代码中的loopImultim.cpp文件: 有一段代码检查函数名是memset还是memcpy,因为它取消了优化,所以我将其从:
StringRef Name = L->getHeader()->getParent()->getName();
if (Name == "memset" || Name == "memcpy")
到
-f重建
?啊!在opt步骤中需要-disable simplify libcalls而不是or以及llc…这就解决了它。回答你自己的问题就可以了。在你接受之前有两天的延迟,所以其他人也有公平的机会回复。你一定要把它放在这里,以防将来有人遇到同样的问题。
StringRef Name = L->getHeader()->getParent()->getName();
if (Name.endswith("memset") || Name == "memcpy")