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")