gpt4 book ai didi

optimization - llvm 使用库函数进行优化

转载 作者:行者123 更新时间:2023-12-03 15:57:08 27 4
gpt4 key购买 nike

从这样的代码开始

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

我不喜欢回答我自己的问题,可以在这里坐一会儿,以便下次我可以找到答案,或者如果 SO 大神决定把它留在这里,那很好……

关于optimization - llvm 使用库函数进行优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21318229/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com