可以通过gcc --help=optimizers获得GCC/G++中可用的优化器列表。法律的值和参数范围也在params.def中定义。是否也有这样的命令和params.def文件可用于clang?
gcc --help=optimizers
params.def
vktxenjb1#
1-对于Clang用途:
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用途:
X
Os,O1,O2,O3 and O4
LLVM IR
Pass Arguments
global kernel
function pass
Opt
llvm-as < /dev/null | opt -OX -disable-output -debug-pass=Arguments
型其中X可以是Os,O1,O2 and O3
Os,O1,O2 and O3
更新至LLVM-15 x:
由于new pass manager is set to be the default pass manager,上面的答案只打印legacy pass manager通行证。为了看到新的通行证管理器通过opt,尝试:
legacy pass manager
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)"
型
mefy6pfw2#
根据Amir的回答,看看-O1和-O2之间的区别:
-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有很多输出
| grep '^[+-]'
-O0
O2
2条答案
按热度按时间vktxenjb1#
1-对于
Clang
用途:字符串
或
型
其中
X
可以是Os,O1,O2,O3 and O4
(-O 4等效于-O3,除了当源文件中的编译对象文件发出LLVM IR
而不是对象代码时,它执行LTO(链接时优化))您将有两组
Pass Arguments
,其中第一组是global kernel
传球,第二组是function pass
传球。2-对于
Opt
用途:型
其中
X
可以是Os,O1,O2 and O3
更新至LLVM-15 x:
由于new pass manager is set to be the default pass manager,上面的答案只打印
legacy pass manager
通行证。为了看到新的通行证管理器通过opt,尝试:型
或
型
mefy6pfw2#
根据Amir的回答,看看
-O1
和-O2
之间的区别:字符串
这会产生一个差异:
型
您可能还希望添加
| grep '^[+-]'
以忽略输出上下文。奇怪的是,
-O1
和-O2
之间没有区别,所以我不确定这意味着什么,因为从-O0
到-O2
有很多输出