铿锵优化水平
在gcc上, 手册根据特定的优化参数( -funswitch-loops
, -fcompare-elim
等)来解释-O3
, -Os
等的转换。
我正在寻找叮当的相同信息 。
我已经在网上看到,只有一般信息( -O2
比-O1
更优化, -Os
优化速度,…)的man clang
,并且在Stack Overflow上看到了这个 ,但是我没有find任何相关的东西在引用的源文件中。
编辑:我发现了一个答案,但我仍然感兴趣,如果任何人有一个链接到用户手册logging所有的优化和通过-Oxselect的通行证。 目前我只是发现这个通行证列表,但没有优化级别。
我发现这个相关的问题。
总结一下,找出编译器优化的通行证:
llvm-as < /dev/null | opt -O3 -disable-output -debug-pass=Arguments
正如杰夫·尼克松 ( Geoff Nixon )的回答(+1)中指出的那样, clang
还运行了一些更高层次的优化,
echo 'int;' | clang -xc -O3 - -o /dev/null -\#\#\#
个人通行证的文件在这里 。
3.8版的通行证如下:
-
基线(
-O0
):-
opt
集 :-targetlibinfo -tti -verify -
clang
增加 :-mdisable-fp-elim -mrelax-all
-
-
-O1
基于-O0
-
opt
增加了 :-globalopt -demanded-bits -branch-prob -inferattrs -ipsccp -dse -loop-simpl -scoped-noalias -barrier -adce -deadargelim -memdep -licm -globals -aa -rpo-functionattrs -basiccg -loop- idiom -forceattrs -mem2reg -simplifycfg -early -cse -instcombine -sccp -loop-unswitch -loop-vectorize -tailcallelim -functionattrs -loop -accesses -memcpyopt -loop-deletion -reassociate -strip-dead-prototypes -loops -basicaa – correlation-propagation -lcssa -domtree -always-inline -aa -block-freq -float2int -lower-expect -sroa -loop-unroll -alignment-from-assumptions -lazy-value-info -prune -eh -jump-threading – 循环旋转-indvars -bdce -scalar-evolution-tbaa -assumption-cache-tracker -
clang
增加 :-momit-leaf-frame-pointer -
clang
滴 :-mdisable-fp-elim -mrelax-all
-
-
-O2
基于-O1
-
opt
添加 :-elim-avail-extern -mldst-motion -slp -vectorizer -gvn -inline -globaldce -constmerge -
opt
下降 : – 总是在线 -
clang
增加 :-vectorize-loops -vectorize-slp
-
-
-O3
基于-O2
-
opt
增加 :-argpromotion
-
-
-Ofast
基于-O3
,在clang
有效,但不在opt
-
clang
补充 :-fno-signed-zeros -fipiprocal-math -ffp-contract = fast -menable-unsafe -fp-math -menable-no-nans -menable-no-infs
-
-
-Os
与-O2
相同 -
-Oz
基于-Os
-
opt
下降 :-slp-vectorizer -
clang
滴 :-vectorize循环
-
在3.7版本中 ,pass如下(上面命令的parsing输出):
-
默认(-O0):-targetlibinfo -verify -tti
-
-O1基于-O0
- 添加 :-sccp -loop -verify -float2int -lazy-value-info -correlated-propagation -bdce -lcssa -deadargelim -loop-unroll -loop -vectorize -barrier -memcpyopt -loop -access -assumption-cache-tracker -reassociate -loop-deletion -branch-prob -jump-threading -domtree -dse -loop-rotate -ipsccp -instcombine -scoped-noalias -licm -prune -eh -loop-unswitch -alignment-from-assumptions -early-cse -inline -sost -simplifycfg -strip-dead-prototypes -tbaa -sroa -no -aa -adce -functionattrs -lower-expect -basiccg -loops -loop-idiom -tailcallelim -basicaa -indvars -globalopt -block-freq -scalar-evolution -memdep -always-inline
-
-O2基于-01
- 增加 :-elim-avail-extern -globaldce -inline -constmerge -mldst-motion -gvn -slp-vectorizer
- 删除 :-always-inline
-
-O3基于-O2
- 增加 :-argpromotion -verif
-
-Os与-O2相同
-
-Oz基于-Os
- 删除 :-slp-vectorizer
3.6版的通行证在GYUNGMIN KIM的文章中有logging。
在版本3.5中 ,传递如下(上面命令的parsing输出):
-
默认(-O0):-targetlibinfo -verify -verify-di
-
-O1基于-O0
- 增加 :-correlated-propagation -basiccg -simplifycfg -no -aa -jump-threading -sroa -loop-unswitch -ipsccp -instcombine -memdep -memcpyopt -barrier -block-freq -loop -verify -loop-vectorize -inline-cost -branch-prob -early -cse -lazy-value-info -loop-rotate -strip-dead-prototypes -loop-deletion -tbaa -prune -eh -indvars -loop-unroll -reassociate -loops -sccp -always -inline -basicaa -dse -globalopt -tailcallelim -functionattrs -deadargelim -notti -scalar-evolution -lower-expect -licm -loop-idiom -adce -domtree -lcssa
-
-O2基于-01
- 增加 :-gvn -constmerge -globaldce -slp-vectorizer -mldst-motion -inline
- 删除 :-always-inline
-
-O3基于-O2
- 补充说 :-argpromotion
-
-Os与-O2相同
-
-Oz基于-Os
- 删除 :-slp-vectorizer
在版本3.4中 ,传递如下(上面命令的parsing输出):
-
-O0:-targetlibinfo -preverify -domtree -verify
-
-O1基于-O0
- 添加 :-adce -always-inline -basicaa -basiccg -correlated-propagation -deadargelim -dse -early -cse -functionattrs -globalopt -indvars -inline-cost -instcombine -ipsccp -jump-threading -lazy-value-info -lcssa -licm -loop-deletion -loop-idiom -loop-rotate -loop-simpl -loop-unroll -loop-unswitch -loops -lower-expect -memcpyopt -memdep -no -aa -notti -prune -eh -reassociate -scalar -evolution -sccp -simplifycfg -sroa -strip-dead-prototypes -tailcallelim -tbaa
-
-O2基于-01
- 增加 :-barrier -constmerge -domtree -globaldce -gvn -inline -loop-vectorize -preverify -slp -vectorizer -targetlibinfo -verify
- 删除 :-always-inline
-
-O3基于-O2
- 补充说 :-argpromotion
-
-Os与-O2相同
-
-Oz基于-O2
- 删除 :-barrier -loop-vectorize -slp-vectorizer
在3.2版本中 ,传递如下(上面命令的parsing输出):
-
-O0:-targetlibinfo -preverify -domtree -verify
-
-O1基于-O0
- 添加 :-sroa -early -cse -lower-expect -no -aa -tbaa -basicaa -globalopt -ipsccp -deadargelim -instcombine -simplifycfg -basiccg -prune -eh -always-inline -functionattrs -simplify -libcalls -lazy-value -info -jump-threading -correlated-propagation -tailcallelim -reassociate -loops -loop-simpl -lcssa -loop-rotate -licm -loop-unswitch -scalar-evolution -indvars -loop-idiom -loop-deletion -loop-unroll -memdep -memcpyopt -sccp -dse -adce -strip-dead-prototypes
-
-O2基于-01
- 增加 :-inline -globaldce -constmerge
- 删除 :-always-inline
-
-O3基于-O2
- 补充说 :-argpromotion
-
-Os与-O2相同
-
-Oz与-Os相同
编辑 [三月2014]从列表中删除重复。
编辑 [2014年4月]添加了3.4的文档链接+选项
编辑 [2014年9月]添加了3.5的选项
编辑 [2015年12月]添加了3.7的选项,并提到3.6的现有答案
编辑 [2016年5月]添加选项为3.8,为select和铿锵声,并提出现有的答案铿(与select)
@ Antoine的回答(和其他问题链接)准确地描述了启用的LLVM优化,但还有一些Clang特定的选项(即影响降低到AST的选项)受到-O[0|1|2|3|fast]
标志。
你可以看看这些:
echo 'int;' | clang -xc -O0 - -o /dev/null -\#\#\#
echo 'int;' | clang -xc -O1 - -o /dev/null -\#\#\#
echo 'int;' | clang -xc -O2 - -o /dev/null -\#\#\#
echo 'int;' | clang -xc -O3 - -o /dev/null -\#\#\#
echo 'int;' | clang -xc -Ofast - -o /dev/null -\#\#\#
例如, -O0
启用-mrelax-all
, -vectorize-loops
启用-vectorize-loops
和-vectorize-slp
, -Ofast
启用-menable-no-infs
-menable-no-nans
, -menable-no-nans
-menable-unsafe-fp-math
, -menable-unsafe-fp-math
, -ffp-contract=fast
和-ffast-math
。
@Techogrebo:
是的,不一定需要其他的LLVM工具。 尝试:
echo 'int;' | clang -xc - -o /dev/null -mllvm -print-all-options
此外,还有更多更详细的选项,你可以单独检查/修改Clang …你只需要知道如何去他们!
尝试几个:
clang -help
clang -cc1 -help
clang -cc1 -mllvm -help
clang -cc1 -mllvm -help-list-hidden
clang -cc1as -help
LLVM 3.6 -O1
pass参数:-targetlibinfo -no -aa -tbaa -scoped -noalias -assumption-cache-tracker -basicaa -notti -verify-di -ipsccp -globalopt -deadargelim -domtree -instcombine -simplifycfg -basiccg -prune -eh -inline- cost -always-inline -functionattrs -sroa -domtree -early -cse -lazy-value-info -jump-threading -correlated-propagation -simplifycfg -domtree -instcombine -tailcallelim -simplifycfg -reassociate -domtree -loops -loop -verify- lcssa -loop-rotate -licm -loop-unswitch -instcombine -scalar-evolution -loop-simpl -lcssa -indvars -loop-idiom -loop-deletion -function_tti -loop-unroll -memdep -memcpyopt -sccp -domtree -instcombine – lazy-value-info -jump-threading -correlated-propagation -domtree -memdep -dse -adce -simplifycfg -domtree -instcombine -barrier -domtree -loops -loop-simpl -lcssa -branch -pro -block-freq -scalar- evolution -loop-vectorize -instcombine -simplifycfg -domtree -instcombine -loops -loop-simplify -lcssa -scalar-evolution -function_tti -loop-unroll -alignment-from-a 假设-strip-dead-prototypes -verify -verify-di
-O2基于-O1
添加:-inline -mldst-motion -domtree -memdep -gvn -memdep -scalar-evolution -slp -vectorizer -globaldce -constmerge
并删除:-always-inline
-O3基于-O2
添加:-argpromotion