120

对于 gcc,手册解释了-O3,-Os等根据特定优化参数 ( , 等) 翻译-funswitch-loops-fcompare-elim内容

我正在寻找 clang 的相同信息

我在网上查看过,man clang其中仅提供一般信息(-O2优化比 更积极-O1-Os优化大小,...),并且还查看了 Stack Overflow 并找到了这个,但我在引用的源文件中没有找到任何相关内容.

编辑:我找到了答案,但如果有人有指向用户手册的链接,该用户手册记录了所有优化过程和. 目前我刚刚找到了这个通行证列表,但没有关于优化级别。-Ox

4

3 回答 3

191

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

综上所述,了解编译器优化通道:

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

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

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

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

您可以比较更改高级标志的效果,-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 -称为值传播 -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:-总是内联
    • 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 -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 -传播 -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:-总是内联
    • 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:-矢量化循环

----------

对于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 -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 -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

    • 添加:-correlated-propagation -basiccg -simplifycfg -no-aa -jump-threading -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-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 版,通行证如下(上面命令的解析输出):

  • -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 年 5 月]为 opt 和 clang 添加了 3.8 的选项,并提到了 clang 的现有答案(相对于 opt)

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

于 2013-03-21T12:55:19.560 回答
21

@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

于 2014-12-20T04:09:50.313 回答
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-from-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

于 2015-08-07T07:14:50.990 回答