lang优化级别


91

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

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

我在网上看过,man clang并且只提供一般信息(-O2优化多于-O1-Os针对速度进行了优化,…),还在此处查看Stack Overflow并发现了这一点,但是在引用的源文件中没有发现任何相关信息。

编辑:我找到了答案,但是我仍然感兴趣是否有人链接到用户手册,该手册记录了所有优化过程以及所选择的过程。目前,我仅找到通行证列表,但在优化级别上却一无所获。-Ox

Answers:


156

我发现了这个相关问题。

总结一下,以了解有关编译器优化过程的信息:

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

正如Geoff Nixon的答案(+1)中指出的那样,clang还运行了一些更高级别的优化,我们可以使用以下方法进行检索:

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

个人通行证的文件可在此处获得



对于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-作用域noalias-假定缓存跟踪器-profile-summary-info -forceattrs -inferattrs -ipsccp-被称为值传播-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-推测执行-惰性值信息-跳转线程-相关传播-libcalls-shrinkwrap-分支问题-block-freq -pgo-memop-opt -tailcallelim-重新关联-循环简化-lcssa验证-lcssa-标量演化-loop-rotate -licm -loop-unswitch -indvars -loop-idiom -loop-delettion -loop-unroll -memdep -memcpyopt -sccp -demanded-bits -bdce -dse -postdomtree -adce -barrier -rpo-functionattrs -globaldce -float2int-循环访问-循环分配-loop-vectorize -loop-load-elim-从假设中对齐-条带死机原型-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仅限数
  • -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-需求位-分支概率-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-deeletion -reassociate -strip-dead-prototypes -loops -basicaa -correlated -传播-lcssa -domtree-始终内联-aa -block-freq -float2int-低期望-sroa -loop-unroll-对齐方式来自假设-惰性值信息-修剪-eh-跳转线程-循环-旋转-indvars -bdce-标量演化-tbaa-假设缓存跟踪器
    • 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-相关传播-bdce -lcssa -deadargelim -loop-unroll -loop-vectorize -barrier -memcpyopt -loop-accesses-假设-cache-tracker -reassociate -循环删除-分支概率-跳转线程-domtree -dse-循环旋转-ipsccp -instcombine-作用域无别名-licm -prune-eh-循环取消切换-对齐方式由假设-early-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-始终在线
  • -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

    • 添加:-相关传播-basiccg -simplifycfg -no-aa-跳转线程-sroa -loop-unswitch -ipsccp -instcombine -memdep -memcpyopt -barrier -block-freq -loop-simplify -loop-vectorize -inline-cost -branch-prob -early-cse -lazy-value-info -loop-rotate -strip-dead-prototypes -loop-delettion -tbaa -prune-eh -indvars -loop-unroll -reassociate -loops -sccp -always-inline -basicaa -dse -globalopt -tailcallelim -functionattrs -deadargelim -notti-标量演化-较低期望-licm -loop成语-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-始终在线-basicaa -basiccg-相关传播-deadargelim -dse -early-cse -functionattrs -globalopt -indvars -inline-cost -instcombine -ipsccp-跳转线程-懒惰值信息-lcssa -licm-循环删除-循环惯用语-循环旋转-循环简化-循环展开-循环取消切换-循环-降低期望-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-始终在线内联-功能属性-simplify-libcalls-惰性值-信息-跳转线程-相关传播-tailcallelim-重新关联-循环-循环简化-lcssa-循环旋转-licm-循环取消切换-标量演化-indvars-循环成语-循环删除-循环展开-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)

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


2
XCode5附带的clang版本是否可以做到这一点?我已经尝试过搜索llvm-as命令,但是我的机器上不存在它可以看到的任何地方
Teknogrebo 2014年

@Antoine,为什么-simplifycfg要重复一些标志?
Paschalis 2014年

2
@Paschalis:我不确定,但是由于某些优化过程只有在运行了其他一些过程之后才起作用,例如simplifycfg,多次过程都需要。而且debug-pass=Arguments可能发生在重复数据删除之前。我删除了答案中的重复项,感谢您的反馈。
Antoine

5
一些优化会创建可以进一步优化的内容(死代码等),因此重新运行一些优化过程可能很有意义。
cyco130 2014年

1
@ZachB / @Antoine为什么不(也?)LLVM 7(或者这是您的意思?)另外:1.我不确定它已经存在多久了,但是现在也-Og有一个GCC;2.仍然需要较旧版本的所有细节吗?3.我认为,鉴于这些年来做出的巨大变化以及社区的地位,我将把答案简化为仅提及clang -cc1 -mllvm -help-list-hidden(除非您希望将其集成)这样的内容。
杰夫·尼克松

15

@Antoine的答案(和链接的其他问题)准确地描述了已启用的LLVM优化,但是还有其他一些受Clang影响的特定于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


3

LLVM 3.6 -O1

通过参数:-targetlibinfo -no-aa -tbaa-范围化的noalias-假设-缓存跟踪器-basicaa -notti -verify-di -ipsccp -globalopt -deadargelim -domtree -instcombine -simplifycfg -basiccg -prune-eh -inline-cost-总是-inline -functionattrs -sroa -domtree -early-cse -lazy-value-info -jump-threading -correlation-propagation -simplifycfg -domtree -instcombine -tailcallelim -simplifycfg -reassociate -domtree -loops -loop-simplify -lcssa -loop -rotate -licm -loop-unswitch -instcombine-标量进化-loop-simplify -lcssa -indvars -loop-idiom -loop-delettion -function_tti -loop-unroll -memdep -memcpyopt -sccp -domtree -instcombine -lazy-value -信息-跳转线程-相关传播-domtree -memdep -dse -adce -simplifycfg -domtree -instcombine -barrier -domtree -loops -loop-loop-简化-lcssa-分支概率-block-freq -scalar-evolution -loop -向量化-instcombine-simplifycfg -domtree -instcombine -loops -loop-简化-lcssa-标量演化-function_tti -loop-unroll-对齐方式假设-strip-dead-prototypes -verify -verify-di

-O2基于-O1

添加:-inline -mldst-motion -domtree -memdep -gvn -memdep-标量演化-slp-vectorizer -globaldce -constmerge

并删除:-always-inline

-O3基于-O2

添加:-argpromotion

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.