O3 是一个固定的优化序列吗?以及如何更改 LLVM IR 中的帧指针值?
Is O3 a fixed optimization sequence? And how to change frame-pointer value in LLVM IR?
我用下面的命令算出clang O3的顺序,
$ opt -enable-new-pm=0 -O3 -debug-pass=Arguments input.ll
我得到了一个很长的优化序列。
所有代码的序列是否相同?或者O3可以根据源码改一下顺序?
而且,我发现如果我使用-O0
标志生成IR文件,属性可能是这样的,
attributes #0 = { noinline nounwind uwtable "frame-pointer"="all" "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-pr otector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #1 = { "frame-pointer"="all" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target- features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
我们可以看到 frame-pointer = all
的值,我认为这可能会让代码变慢。
(使用O3标志会变成none
)
如何通过 opt
命令更改此值?
非常感谢。
是的,所有输入的优化顺序都是相同的。但请注意 opt
的 -O3 可能与 clang
的 -O3 不同。
至于禁用帧指针,可以去掉
- with
-fomit-frame-pointer
当用 clang
生成 LLVM IR 时:
$ clang input.c -emit-llvm -S -O0 -o fp.ll
$ grep frame-pointer fp.ll
attributes #0 = { ... "frame-pointer"="all" ... }
$ clang input.c -emit-llvm -S -O0 -fomit-frame-pointer -o nofp.ll
$ grep frame-pointer nofp.ll
attributes #0 = { ... "frame-pointer"="none" ... }
- with
-frame-pointer=none
when optimizing LLVM IR with opt
$ opt -frame-pointer=none fp.ll -S -o fp_removed.ll
$ grep frame-pointer fp_removed.ll
attributes #0 = { ... "frame-pointer"="none" ... }
我用下面的命令算出clang O3的顺序,
$ opt -enable-new-pm=0 -O3 -debug-pass=Arguments input.ll
我得到了一个很长的优化序列。
所有代码的序列是否相同?或者O3可以根据源码改一下顺序?
而且,我发现如果我使用-O0
标志生成IR文件,属性可能是这样的,
attributes #0 = { noinline nounwind uwtable "frame-pointer"="all" "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-pr otector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #1 = { "frame-pointer"="all" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target- features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
我们可以看到 frame-pointer = all
的值,我认为这可能会让代码变慢。
(使用O3标志会变成none
)
如何通过 opt
命令更改此值?
非常感谢。
是的,所有输入的优化顺序都是相同的。但请注意 opt
的 -O3 可能与 clang
的 -O3 不同。
至于禁用帧指针,可以去掉
- with
-fomit-frame-pointer
当用clang
生成 LLVM IR 时:
$ clang input.c -emit-llvm -S -O0 -o fp.ll
$ grep frame-pointer fp.ll
attributes #0 = { ... "frame-pointer"="all" ... }
$ clang input.c -emit-llvm -S -O0 -fomit-frame-pointer -o nofp.ll
$ grep frame-pointer nofp.ll
attributes #0 = { ... "frame-pointer"="none" ... }
- with
-frame-pointer=none
when optimizing LLVM IR withopt
$ opt -frame-pointer=none fp.ll -S -o fp_removed.ll
$ grep frame-pointer fp_removed.ll
attributes #0 = { ... "frame-pointer"="none" ... }