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" ... }