Clang 优化级别

Posted

技术标签:

【中文标题】Clang 优化级别【英文标题】:Clang optimization levels 【发布时间】:2013-03-10 23:48:45 【问题描述】:

对于 gcc,the manual 解释了 -O3-Os 等根据特定优化参数(-funswitch-loops-fcompare-elim 等)的含义

我正在寻找与 clang 相同的信息

我查看了 online 和 man clang,它们只提供一般信息(-O2-O1 更积极地优化,-Os 针对大小进行优化,...)并在 Stack Overflow 上查看并找到了this,但我在引用的源文件中没有找到任何相关内容。

编辑:我找到了答案,但我仍然感兴趣如果有人有一个用户手册的链接,记录了所有优化通道和@987654333 选择的通道@。目前我只找到了this 的通行证列表,但没有关于优化级别的信息。

【问题讨论】:

【参考方案1】:

我找到了this 相关问题。

总结一下,了解一下编译器优化pass:

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

正如 Geoff Nixon 的回答 (+1) 中指出的,clang 还运行了一些更高级别的优化,我们可以通过以下方式检索:

echo 'int;' | clang -xc -O3 - -o /dev/null -\#\#\#

个人通行证的文档可通过here获取。

您可以像这样比较更改高级标志(例如-O)的效果:

diff -wy --suppress-common-lines  \
  <(echo 'int;' | clang -xc     - -o /dev/null -\#\#\# 2>&1 | tr " " "\n" | grep -v /tmp) \
  <(echo 'int;' | clang -xc -O0 - -o /dev/null -\#\#\# 2>&1 | tr " " "\n" | grep -v /tmp)
# will tell you that -O0 is indeed the default.

6.0版的通行证如下:

基线(-O0):

opt 设置:-tti -verify -ee-instrument -targetlibinfo -assumption-cache-tracker -profile-summary-info -forceattrs -basiccg -always-inline -barrier clang 添加:-mdisable-fp-elim -mrelax-all

-O1 基于-O0

opt 添加:-targetlibinfo -tti -tbaa -scoped-noalias -assumption-cache-tracker -profile-summary-info -forceattrs -inferattrs -ipsccp - called-value-propagation -globalopt -domtree -mem2reg -deadargelim -basicaa -aa -loops -lazy-branch-prob -lazy-block-freq -opt-remark-emitter -instcombine -simplifycfg -basiccg -globals-aa -prune-eh -always-inline -functionattrs -sroa -memoryssa -early-cse-memssa -speculative-execution -lazy-value-info -jump-threading -correlated-propagation -libcalls-shrinkwrap -branch-prob -block-freq -pgo-memop-opt -tailcallelim -reassociate -loop -simplify -lcssa-verification -lcssa -scalar-evolution -loop-rotate -licm -loop-unswitch -indvars -loop-idiom -loop-deletion -loop-unroll -memdep -memcpyopt -sccp -demanded-bits -bdce -dse -postdomtree -adce -barrier -rpo-functionattrs -globaldce -float2int -loop-accesses -loop-distribute -loop-vectorize -loop-load-elim -alignment-from-assumptions -strip-dead-prototypes -loop-sink -instsimplify -div-rem-pairs -verify -ee-instrument -early-cse -lower-expect clang 添加:-momit-leaf-frame-pointer clang : -mdisable-fp-elim -mrelax-all

-O2 基于-O1

opt 添加:-inline -mldst-motion -gvn -elim-avail-extern -slp-vectorizer -constmerge opt:-always-inline clang 添加:-vectorize-loops -vectorize-slp

-O3 基于-O2

opt 添加:-callsite-splitting -argpromotion

-Ofast 基于-O3,在clang 中有效,但在opt 中无效

clang 添加:-fno-signed-zeros -freciprocal-math -ffp-contract=fast -menable-unsafe-fp-math -menable-no-nans -menable-no-infs -mreassociate -fno-trapping-math -ffast-math -ffinite-math-only

-Os类似于-O2

opt 丢弃:-libcalls-shrinkwrap 和 -pgo-memopt-opt

-Oz 基于-Os

opt:-slp-vectorizer

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-simplify -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 -correlated-propagation -lcssa -domtree -always-inline -aa -block-freq -float2int -lower-expect -sroa -loop-unroll -alignment-from-assumptions -lazy-value-info -prune-eh -jump-threading -loop-rotate -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:-always-inline clang 添加:-vectorize-loops -vectorize-slp

-O3 基于-O2

opt 补充:-argpromotion

-Ofast 基于-O3,在clang 中有效,但在opt 中无效

clang 添加:-fno-signed-zeros -freciprocal-math -ffp-contract=fast -menable-unsafe-fp-math -menable-no-nans -menable-no-infs李>

-Os-O2相同

-Oz 基于-Os

opt:-slp-vectorizer clang:-vectorize-loops
----------

使用 3.7 版,通行证如下(上面命令的解析输出):

默认(-O0):-targetlibinfo -verify -tti

-O1 基于-O0

添加:-sccp -loop-simplify -float2int -lazy-value-info -correlated-propagation -bdce -lcssa -deadargelim -loop-unroll -loop-vectorize -barrier -memcpyopt -loop-accesses -假设-缓存跟踪器-重新关联-循环删除-分支概率-跳转线程-domtree-dse-循环旋转-ipsccp-instcombine-scoped-noalias-licm-prune-eh-loop-unswitch-alignment-from-假设 -early-cse -inline-cost -simplifycfg -strip-dead-prototypes -tbaa -sroa -no-aa -adce -functionattrs -lower-expect -basiccg -loops -loop-idiom -tailcallelim -basicaa -indvars -globalopt -块频率 -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 的帖子中所述。


----------

使用 3.5 版,通行证如下(上面命令的解析输出):

默认(-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-simplify -循环向量化-内联成本-分支概率-early-cse -lazy-value-info -loop-rotate -strip-dead-prototypes -loop-deletion -tbaa -prune-eh -indvars -loop-unroll -reassociate -循环 -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版,通行证如下(上面命令的解析输出):

-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 -惰性值信息 -lcssa -licm -loop-deletion -loop-idiom -loop-rotate -loop-simplify -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 版,通行证如下(上面命令的解析输出):

-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 -简化libcalls -lazy-value-info -jump-threading -correlated-propagation -tailcallelim -reassociate -loops -loop-simplify -lcssa -loop-rotate -licm -loop-unswitch -scalar-evolution -indvars -loop-idiom -循环删除 -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 年 3 月]从列表中删除了重复项。

编辑 [2014 年 4 月] 添加了 3.4 的文档链接 + 选项

编辑 [2014 年 9 月] 添加了 3.5 的选项

编辑 [2015 年 12 月] 添加了 3.7 的选项并提及 3.6 的现有答案

编辑 [2016 年 5 月] 为 opt 和 clang 添加了 3.8 的选项,并提及 clang 的现有答案(相对于 opt)

编辑 [2018 年 11 月]为 6.0 添加选项

【讨论】:

XCode5 附带的 clang 版本有没有办法做到这一点?我试过四处寻找 llvm-as 命令,但它在我的机器上任何我能看到的地方都不存在 @Paschalis:我不确定,但由于某些优化通道仅在运行了其他通道时才有效,例如多次通道需要simplifycfg。而debug-pass=Arguments 可能发生在重复数据删除之前。我删除了答案中的重复项,感谢您的反馈。 一些优化创建的东西可以进一步优化(死代码等),因此重新运行一些优化通道可能是有意义的。 @ZachB / @Antoine 为什么不(也是?)LLVM 7(或者这就是你的意思?)另外:1.我不确定它存在多长时间,但还有@ 987654384@现在是海湾合作委员会; 2. 旧版本的所有细节仍然需要吗? 3. 我认为考虑到这些年来做出的不错的改变以及社区状态,我将把我的答案缩减为仅提及 clang -cc1 -mllvm -help-list-hidden 之类的东西(除非你更愿意整合它)。跨度> @pmor 是的,我有点停止在每个 llvm 版本中更新这篇文章。据我所知,默认仍然是-O0。不确定是否/在哪里记录。我在帖子中添加了(相当长的)我用来比较默认值的命令 -O0 作为编辑,所以人们可以使用它。【参考方案2】:

@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-O1 启用-vectorize-loops-vectorize-slp,以及-Ofast 启用-menable-no-infs-menable-no-nans-menable-unsafe-fp-math-ffast-math6 和@4 .


@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

【讨论】:

【参考方案3】:

LLVM 3.6 -O1

传递参数:-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 -simplify -lcssa -loop-rotate -licm -loop-unswitch -instcombine -scalar-evolution -loop-simplify -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-simplify -lcssa -branch-prob -block-freq -scalar-evolution -loop-vectorize -instcombine -simplifycfg -domtree -instcombine -loops -loop-simplify -lcssa -scalar-evolution -function_tti -loop-unroll -alignment-fr om-assumptions -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

【讨论】:

以上是关于Clang 优化级别的主要内容,如果未能解决你的问题,请参考以下文章

为啥检查没有被优化

优化Ubuntu-修改启动级别

GCC 优化级别有多少?

优化级别影响比较枚举

keil优化等级设置

深入探索Android内存优化(炼狱级别)