克朗优化级别

对于 gcc,手册解释了 -O3-Os等等在特定优化参数(-funswitch-loops-fcompare-elim等等)方面的转换

我正在寻找相同的信息叮当

我查看了 在线man clang,它们只提供一般信息(-O2优化比 -O1更积极,-Os优化大小,... ...) ,也查看了 Stack Overflow,发现了 这个,但我没有在引用的源文件中找到任何相关信息。

编辑: 我找到了一个答案,但是如果有人有一个到用户手册的链接,记录了所有优化通过和由 -Ox选择的通过,我就是 还是很感兴趣。目前我只找到 这个列表的通过,但没有优化水平。

108130 次浏览

我找到了 这个相关的问题。

总结一下,了解一下编译器最佳化:

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

正如在 杰夫 · 尼克松的答案(+ 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-valid- ee-uments-targetlibinfo- 假設-cache- 追踪器-配置文件-摘要-info-forcattrs-basiccg-always-inline-block
    • clang添加 :-mability-fp-elim-mrest-all
  • -O1 是以 -O0为基础的

    • opt增加了 :-targetlibinfo-tti-tbaa-scope-noalias--cache-trace-profile-Summary-info-forcattrs-effattrs-ipsccp-called-value- 肚子-domtree-mem2reg-deadargelim-basicaa-aa-loop-Lazy-Branch-prob-Lazy- block-freq-opt-婴儿-婴儿-婴儿-婴儿-婴儿-婴儿-婴儿-婴儿-婴儿-婴儿-婴儿-婴儿-婴儿-婴儿-婴儿-婴儿-婴儿-婴儿-婴儿-婴儿-婴儿-婴儿-婴儿-婴儿-婴儿-婴儿-婴儿-婴儿-婴儿-婴儿-婴儿-婴儿-婴儿-婴儿-婴儿-婴儿-婴儿-婴儿-婴儿-婴儿-婴儿-婴儿-婴儿-婴儿-婴儿-婴儿-婴儿-婴儿-婴儿-婴儿-婴儿-婴儿-婴Branch-prob-block-freq-pgo-memop-opt-tailCallelim-resociate-loop-simple-lcssa-證明-lcssa-scalar-Evolution-loop-rotlicm-loop-unswitch-indvars-loop-idiom-loop-delete-loop-unroll-memdep-memcpyopt-sccp--需求位-bdce-dse-postdomtree-adce-barre-function attrs-globaldce-float2int-loop-access-loop-distribution-loop-vectorize-loop-load-elim- -
    • clang添加 :-Momit-leaf-frame-point
    • clang :-mability-fp-elim-measy-all
  • -O2 是以 -O1为基础的

    • opt添加 :-inline-mldst-motion-gvn-elim-avail-exter-slp-vectorizer-conmerge
    • opt下降 :-always-inline
    • clang添加 :-vectorize-loop-vectorize-slp
  • -O3 是以 -O2为基础的

    • opt增加了 :-callsite- 拆分-arg 促進
  • -Ofast -O3为基础,在 clang有效,在 opt无效

    • clang增加了 :-fno-signed-zeros-freciprocal-math-ffp-Contract= fast-menable-safe-fp-math-menable-no-nans-menable-no-infs-mreassociate-fno-traling-math-ffast-math-ffite-math-only
  • -Os 类似于 -O2

    • opt :-libcall-shrinkwrand-pgo-memopt-opt
  • -Oz 是以 -Os为基础的

    • opt :-slp-vectorizer

版本3.8的通行证如下:

  • 基线(-O0) :

    • opt :-targetlibinfo-tti-valid
    • clang添加 :-mability-fp-elim-mrest-all
  • -O1 是以 -O0为基础的

    • opt增加了 :-globalopt-demand-bits-Branch-prob-effattrs-ipsccp-dse-loop-simple-scoped-noalias-Barri- adce-deadargelim-memdep-licm-globals-aa-rpo-function tionattrs-basiccg-loop-idiom-forcattrs-mem2reg-simple ycfg- Early-cse-insttogether-sccp-loop-unswitch-loop-vectorize-tailCallelim-function-attrs-loop-access-memcpyopt-loop-delete-resociate-Strip-dead-Prototype- loop-basicaa- -- float2int-lower- 预期-sroa-loop-unroll- 对齐-从-假设-惰性-值-信息-剪切-呃-跳线程-循环-旋转-indvars-bdce-标量-进化-tbaa-假设-缓存-跟踪器
    • clang添加 :-Momit-leaf-frame-point
    • clang :-mability-fp-elim-measy-all
  • -O2 是以 -O1为基础的

    • opt添加 :-elim-avail-exter-mldst-motion-slp-vectorizer-gvn-inline-globaldce-conmerge
    • opt下降 :-always-inline
    • clang添加 :-vectorize-loop-vectorize-slp
  • -O3 是以 -O2为基础的

    • opt增加了 :-arg 宣传
  • -Ofast -O3为基础,在 clang有效,在 opt无效

    • clang增加了 :-fno-signed-zeros-freciprocal-math-ffp-contact = fast-menable-safe-fp-math-menable-no-nans-menable-no-infs
  • -Os -O2相同

  • -Oz 是以 -Os为基础的

    • opt :-slp-vectorizer
    • 向量循环

----------

对于 版本3.7,传递过程如下(上面命令的解析输出) :

  • Default (- O0) :-targetlibinfo-valid- tti

  • - O1是基于-O0

    • 增加 :-sccp-loop-simple-float2int-惰性值-信息-相关-传播-bdce-lcssa-deadargelim-loop-unroll-loop-vectorize-Barri- memcpyopt-loop-access- 肚子-跟踪器-重新联系-loop-delete-Branch-prob-hop-线程-domtree-dse 循环-旋转-ipsccp-insttogether-scoped-noalias-licm-prune-eh-loop-unswitch-alig- from-events-Early-cse-inline-Cost-simple-cfg-Strip-dead-Prototype-tbaa-sroa-no-aa-adce-function attrs- 较低期望的 basiccg 循环-循环-习语-尾 Callelim-basicaa-indvars-globalopt-block-freq-scalar-Evolution-memdep-always-inline
  • - 氧气是基于 -01的

    • 补充 :-elim-avail-extern-globaldce-inline-constance-mldst-motion-gvn-slp-Vector
    • Delete :-always-inline 移除 :-always-inline
  • - O3是基于-O2

    • 补充 :-arg 促進-verif
  • - O 和 O2是一样的-O 和 O2是一样的

  • - Oz 是基于 -O 的

    • Delete :-slp-Vector

----------

对于 版本3.6的通行证在金永民的文章中有记录。


----------

对于 版本3.5,传递过程如下(上面命令的解析输出) :

  • Default (- O0) :-targetlibinfo-valid- valid- di

  • - O1是基于-O0

    • 增加 :-关联-传播-基础-简化 cfg-无-aa-跳跃-线程-sroa-loop-unswitch-ipsccp-instunion-memdep-memcpyopt-堰-块-freq-loop-简化-循环-向量化-内联-成本-分支-prob-提前-cse-惰性- value-info-loop-rol-Strip-dead-Prototype- loop-delete-tbaa-prune-eh-indvars-loop-unroll-resociate-loop-sccp-always-inline-basicaa-dse-globalopt-tailCallelim-function-deadargelim-notti-scalar-Evolution-lower-Expt-licm-loop-idiom-adce-domtree-lcssa
  • - 氧气是基于 -01的

    • 添加 :-gvn-Constmerge-globaldce-slp-vectorizer-mldst-motion-inline
    • Delete :-always-inline 移除 :-always-inline
  • - O3是基于-O2

    • 补充 :-arg 宣传
  • - O 和 O2是一样的-O 和 O2是一样的

  • - Oz 是基于 -O 的

    • Delete :-slp-Vector

----------

对于 版本3.4,传递过程如下(上面命令的解析输出) :

  • --targetlibinfo-预验证-domtree-验证

  • - O1是基于-O0

    • 添加 :-adce-always-inline-basicaa-basiccg- 传播-死阿格里姆-dse-Early-cse-function attrs-globalopt-indvars-inline-Cost-instunion-ipsccp-spring-threading- 惰性值-info-lcssa-licm-loop-delete-loop-习语-循环-旋转-循环-简化-循环-展开-循环-取消-循环-低期望-memcpyopt-memdep-no-aa-notti-prune-eh-reassociate-scalar-Evolution-sccp-simple ycfg-sroa-Strip-dead-Prototype- tailcallim-tbaa
  • - 氧气是基于 -01的

    • Add :-bar-constance-domtree-globaldce-gvn-inline-loop-vectorize-prevalid- slp-vectorizer-targetlibinfo-valid
    • Delete :-always-inline 移除 :-always-inline
  • - O3是基于-O2

    • 补充 :-arg 宣传
  • - O 和 O2是一样的-O 和 O2是一样的

  • - 《绿野仙踪》是基于-《氧气》

    • Delete :-barre-loop-vectorize-slp-vectorizer 移除 :-屏障-循环-向量化-slp-向量化

----------

对于 版本3.2,传递过程如下(上面命令的解析输出) :

  • --targetlibinfo-预验证-domtree-验证

  • - O1是基于-O0

    • 补充 :-sroa-early-cse-lower- 预期-no-aa-tbaa-basicaa-globalopt-ipsccp-deadargelim-instunion-simple ycfg-basiccg-prune-eh-always-inline-function-simple-libcalls- 惰-值-信息-跳线-相关-传播- 追尾 Callelim-重新联系-循环-循环-简化-lcssa-循环-旋转-licm-循环-取消切换-标量-进化-因瓦尔斯-循环-习语-循环-删除-循环-展开-记忆成员-memcpyopt-sccp-dse-adce-strip-dead-雏形
  • - 氧气是基于 -01的

    • Add :-inline-globaldce-Constmerge
    • Delete :-always-inline 移除 :-always-inline
  • - O3是基于-O2

    • 补充 :-arg 宣传
  • - O 和 O2是一样的-O 和 O2是一样的

  • - 奥兹和-奥兹是一样的


-------------

编辑 [2014年3月]从列表中删除重复项。

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

编辑 [2014年9月]为3.5增加了选项

编辑 [2015年12月]为3.7增加了选项,并提到了3.6的现有答案

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

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

@ 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-mrelax-all0。


@ 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

传递参数:-targetlibinfo-no-aa-tbaa-scoped-noalias- 假設-cache-trace-basicaa-notti-valid- di-ipsccp-globalopt-deadargelim-domtree-insttogether-simple ycfg-basiccg-prune-eh-inline-Cost-always-inline-function-attrs-Sroa-domtree-Early-cse-惰性值-信息跳跃-线程相关-传播-简化 cfg-domtree-instunion-tail Callelim-simple ycfg-resociate-domtree-loop-loop-simple-lcssa-loop-rol-licm-loop-unswitch-insttogether-scalar-Evolution- loop-simple-lcssa-indvars-loop-idiom-loop-delete-function _ tti-loop-unroll-memdep-memcpyopt-sccp-domtree-insttogether-惰性值-信息跳跃-线程相关-传播-domtree-memdep-dse-adce-simple ycfg-domtree-Instunion-barr-domtree-loop-loop-simple-lcssa-Branch-prob-freq-scalar-Evolution-loop-vectorize-instcomb-simple-cfg-domtree-insttogether-loop-simple-lcssa-scalar-Evolution-function _ tti-loop-unroll- ? ?

- 氧气基准-氧气基准

Add:-inline-mldst-motion-domtree-memdep-gvn-memdep-scalar-Evolution-slp-Vector-globaldce-conmerge

并删除:-always-inline

- 氧气基于-氧气

Add:-arg 宣传

从 clang/LLVM 13.0.0开始,旧的传递管理器已被废弃,默认情况下使用新的传递管理器。 这意味着,以前用于打印用于 opt中不同优化级别的优化通道的解决方案,只有在遗留通道管理器通过 -enable-new-pm=0显式启用时才能正常工作。因此,只要遗留的传递管理器还在(预计将持续到 LLVM 14) ,就可以使用以下命令

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

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

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