2011-10-05 83 views
10

我希望具体知道LLVM的各种优化级别对应的是什么。LLVM执行哪种优化?

也就是说,我想知道在使用llvm(或clang或opt)的“-0x”选项时,哪些优化传递是正确执行的(前端之外)以及按何种顺序执行。 相关工具的“人”在这个问题上没有提供太多的信息(与gcc的相反)。

我知道这个有用的页面:http://llvm.org/docs/Passes.html,但它没有提供任何关于“-Ox”选项的信息。 我正在寻找一些调试或详细选项(特别是使用“opt --help”中的信息),但我找不到任何有用的选项。

作为补充,我注意到通过解析代码,所有各种LLVM工具以及叮声卡都使用不同的驱动程序,这些驱动程序以自己的方式解析选项。这些驱动程序是否与“-Ox”选项相似?

编辑:我发现了“选择”工具,它提供了以下输出选项“01”选项“-debug通=参数”:

Pass Arguments: -targetdata -no-aa -tbaa -targetlibinfo -basicaa -simplifycfg -domtree -scalarrepl -early-cse -lower-expect 
Pass Arguments: -targetlibinfo -targetdata -no-aa -tbaa -basicaa -globalopt -ipsccp -deadargelim -instcombine -simplifycfg -basiccg -prune-eh -always-inline -functionattrs -scalarrepl-ssa -domtree -early-cse -simplify-libcalls -lazy-value-info -jump-threading -correlated-propagation -simplifycfg -instcombine -tailcallelim -simplifycfg -reassociate -domtree -loops -loop-simplify -lcssa -loop-rotate -licm -lcssa -loop-unswitch -instcombine -scalar-evolution -loop-simplify -lcssa -iv-users -indvars -loop-idiom -loop-deletion -loop-unroll -memdep -memcpyopt -sccp -instcombine -lazy-value-info -jump-threading -correlated-propagation -domtree -memdep -dse -adce -simplifycfg -instcombine -strip-dead-prototypes -preverify -domtree -verify 

这是什么密切我想但仍然有两个问题:

  • 为什么有两个列表?

  • 是否有类似的选项用于其他工具,尤其是“clang”? (根据我的测试,“-debug通=参数”不铿锵工作)

编辑:选项“-debug通=构成”工具“选择”给出更用户友好的数据(来自http://llvm.org/docs/WritingAnLLVMPass.html

回答

11

为什么有两个列表?

功能和模块通道有自己的通道管理器,因此可以单独打印。

有任何类似的选项等工具,尤其是“铛”

铿锵,您可以使用-mllvm -debug通=参数。

+0

不够公平!谢谢 ! –

+0

@echristo:你能详细讲解LLVM中函数和模块传递之间的区别吗?例如,我正在传递整个源代码文件foo.c以选择标准优化传递(O1,2,3,...)之一。接下来会发生什么 ? – Amir

+1

@Amir对不起,只是看到了这一点。 无论如何,模块通行证通常适用于所有功能等,并具有全局可见性。函数传递一次对单个函数起作用,并且不能像对单个函数进行分析那样来回传递信息。 一般来说,数据布局,全局代码生成,过程间分析等是模块,而gvn是函数遍。您可以查看每个传球的来源,以了解其具体内容。你有更具体的问题或更多的信息? – echristo