Clang优化级别

Ant*_*ine 86 clang compiler-optimization user-manual

海合会,手动解释什么-O3,-Os等转化为在特定的优化参数方面(-funswitch-loops,-fcompare-elim,等)

我正在为clang寻找相同的信息.

我看过网上,man clang其中只提供一般信息(-O2优化更多-O1,-Os优化速度,...),并在此处查看Stack Overflow并发现了这一点,但我没有在引用的源文件中找到任何相关内容.

编辑:我找到了答案,但我仍然感兴趣,如果有人有链接到用户手册记录所有优化传递和选择的传球.目前我刚刚找到了这个通行证列表,但在优化级别上没有任何内容.-Ox

Ant*_*ine 144

我发现了这个相关的问题.

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

llvm-as < /dev/null | opt -O3 -disable-output -debug-pass=Arguments
Run Code Online (Sandbox Code Playgroud)

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

echo 'int;' | clang -xc -O3 - -o /dev/null -\#\#\#
Run Code Online (Sandbox Code Playgroud)

这里提供了个人通行证的文件.



使用6.0版本,通行证如下:

  • baseline(-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 -值信息-跳转线程-correlated传播-libcalls-拆封分枝-概率-嵌段-频率-pgo-memop-OPT -tailcallelim -reassociate -loop-简化-lcssa验证-lcssa -scalar -evolution -loop-rotate -licm -loop-unswitch -indvars -loop-idiom -loop-deletion -loop-unroll -memdep -memcpyopt -sccp -deeded-bits -bdce -dse -postdomtree -adce -barrier -rpo-functionattrs -globaldce -float2int -loop-访问-loop-分发-loop-矢量化-loop的负载琳-alignment从-假设-strip止原型-loop散热器-instsimplify -div-REM-对-verify -ee -instrume nt -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签名3/0 -freciprocal-数学-ffp合同=快速-menable不安全-FP-数学-menable-NO-NaN的-menable-NO-INF中-mreassociate -fno截留数学-ffast,数学-ffinite,数学只
  • -Os 类似于 -O2

    • optdrop:-libcalls-shrinkwrap和-pgo-memopt-opt
  • -Oz 是根据 -Os

    • opt:-slp-vectorizer

使用版本3.8,通行证如下:

  • baseline(-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直插-AA -嵌段频率-float2int低级,希望-sroa -loop-UNROLL -alignment从-假设-lazy价值-信息-prune-EH -跳转线程-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
    • clangdrop:-vectorize-loops


使用版本3.7,传递如下(上面命令的解析输出):

  • default(-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 -assumption-cache-tracker -reassociate -loop缺失分枝-概率-跳转线程-domtree -dse -loop-旋转-ipsccp -instcombine -scoped-noalias -licm -prune-EH -loop-unswitch -alignment从-假设-提早-CSE -inline -cost -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的帖子所述.


使用版本3.5,传递如下(解析上面命令的输出):

  • default(-O0): - targetgetibign -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 -loop-vectorize -inline-cost分枝-概率-提早-CSE -lazy价值-信息-loop -旋转-strip死的原型-loop缺失-tbaa -prune-EH -indvars -loop-UNROLL -reassociate -loops -sccp -always内联-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 -lazy-value-info -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 -simplify-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-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年3月]从列表中删除了重复项.

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

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

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

编辑 [可能2016]为3.8和optng添加了选项,并提及clang的现有答案(与opt相比)

编辑 [nov 2018]为6.0添加选项

  • 一些优化创建了可以进一步优化的东西(死代码等),因此重新运行一些优化过程可能是有意义的. (5认同)
  • @ZachB / @Antoine 为什么不(也?)LLVM 7(或者这就是你的意思?)另外:1.我不确定它存在了多久,但现在还有`-Og`a la GCC;2. 旧版本的所有细节是否仍然必要?3. 我认为考虑到这些年来所做出的不错的改变以及社区的地位,我将把我的答案简化为只提到“clang -cc1 -mllvm -help-list-hidden”之类的东西(除非你更愿意集成它)。 (3认同)
  • 是否有办法使用XCode5附带的clang版本?我已经尝试过寻找llvm-as命令了,但它在我的机器上不存在我能看到的任何地方 (2认同)
  • @Paschalis:我不确定,但是因为一些优化过程仅在运行了一些其他传递时才起作用,例如,多次传递需要`simplifycfg`.并且`debug-pass = Arguments`可能在重复数据删除之前发生.我在答案中删除了重复项,感谢您的反馈. (2认同)

Geo*_*xon 13

@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,-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


tie*_*tor 7

从 clang / LLVM 13.0.0 开始,旧的 pass 管理器已被弃用,默认使用新的 pass 管理器。这意味着之前用于打印用于不同优化级别的优化通道的解决方案opt仅在使用 显式启用旧通道管理器时才有效-enable-new-pm=0。因此,只要旧版 pass 管理器存在(预计到 LLVM 14),就可以使用以下命令

llvm-as < /dev/null | opt -O3 -disable-output -debug-pass=Arguments -enable-new-pm=0
Run Code Online (Sandbox Code Playgroud)

或者,可以使用--debug-pass-manager(而不是-debug-pass=Arguments) 提取新通道管理器的优化通道的执行顺序。不幸的是,输出非常冗长,需要进行一些处理才能使用 手动重建行为-passes=。如果仅对转换过程感兴趣,则可以使用该选项-debug-pass-manager=quiet来跳过有关分析的信息。

LLVM 网站opt上有关于如何使用新的通行证管理器的用户指南。