gcc clang和llvm opt中可用的优化列表

o7jaxewo  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(131)

可以通过gcc --help=optimizers获得GCC/G++中可用的优化器列表。法律的值和参数范围也在params.def中定义。是否也有这样的命令和params.def文件可用于clang?

vktxenjb

vktxenjb1#

1-对于Clang用途:

clang -OX -mllvm -debug-pass=Arguments foo.c

字符串

clang -OX -mllvm -debug-pass=Structure foo.c


其中X可以是Os,O1,O2,O3 and O4(-O 4等效于-O3,除了当源文件中的编译对象文件发出LLVM IR而不是对象代码时,它执行LTO(链接时优化))
您将有两组Pass Arguments,其中第一组是global kernel传球,第二组是function pass传球。
2-对于Opt用途:

llvm-as < /dev/null | opt -OX -disable-output -debug-pass=Arguments


其中X可以是Os,O1,O2 and O3

更新至LLVM-15 x

由于new pass manager is set to be the default pass manager,上面的答案只打印legacy pass manager通行证。为了看到新的通行证管理器通过opt,尝试:

opt --print-passes   "Print available passes that can be specified in -passes=foo and exit"


llvm-as < /dev/null | opt -OX --print-pipeline-passes    "Print a '-passes' compatible string describing the pipeline (best-effort only)"

mefy6pfw

mefy6pfw2#

根据Amir的回答,看看-O1-O2之间的区别:

# echo 'main(){}' > foo.c
# diff -uw <(clang -O0 -mllvm -debug-pass=Arguments foo.c 2>&1 | tr ' ' '\n' | sort) <(clang -O2 -mllvm -debug-pass=Arguments foo.c 2>&1 | tr ' ' '\n' | sort)

字符串
这会产生一个差异:

--- /dev/fd/63  2023-12-03 14:02:18.393064827 -0800
+++ /dev/fd/62  2023-12-03 14:02:18.394064877 -0800
@@ -1,22 +1,47 @@
 
 ^
 1
+-aa
+-aa
+-aa
 -amdgpu-isel
 and
 Arguments:
 -assumption-cache-tracker
 -atomic-expand
+-basic-aa
+-basic-aa
+-basic-aa
+-basic-aa
+-block-freq
... and many more


您可能还希望添加| grep '^[+-]'以忽略输出上下文。
奇怪的是,-O1-O2之间没有区别,所以我不确定这意味着什么,因为从-O0到-O2有很多输出

相关问题