自定义LLVM opt管道的替代方法有哪些?

时间:2019-05-06 17:49:45

标签: optimization llvm

问题

无法从命令行安全禁用O1 / O2 / O3 opt管道中的特定传递。自定义或定制LLVM通道的选择管道的替代方法有哪些?

背景和问题

我正在写通行证以概述代码的特定区域,并且我需要减少概述函数的输入和输出的数量。 在某些情况下,opt工具会引发一些(不变的)GEP指令(例如,从循环体内)。 O1 / O2 / O3标志会发生这种情况。我不希望这样做,因为它为我概述的功能创建了更多的输入/输出。我更喜欢在概述的功能中完成GEP。

尝试失败

  • opt O1传递参数如下所示。我在opt中使用了“ print-after”命令,并查看了IR,发现“重新关联”转换创建了此更改。我遍历了opt --help-hidden中的禁用选项,但找不到禁用该特定通行证或LICM的方法。
  • 我尝试查看LLVM源代码Reassociate.cpp。我也找不到任何方法可以从代码中禁用此特定的转换。
  • 我还尝试过手动为opt命令输入特定的通行名称。但是有些通行证需要设置O1 / 2/3标志。如果我未设置标志,则这些传递不会进行必要的转换。例如,即使我在opt命令中明确输入了该标志,我也需要将循环展开,但没有O1 / 2/3标志就不会展开该循环。

在O1阶段传递参数

 Pass Arguments:  -targetlibinfo -tti -targetpassconfig -tbaa -scoped-noalias 
    -assumption-cache-tracker -profile-summary-info -forceattrs -inferattrs 
    -ipsccp -called-value-propagation -globalopt -domtree -mem2reg -deadargelim 
    -domtree -basicaa -aa -loops -lazy-branch-prob -lazy-block-freq 
    -opt-remark-emitter -instcombine -simplifycfg -basiccg -globals-aa -prune-eh 
    -always-inline -functionattrs -domtree -sroa -basicaa -aa -memoryssa -early-cse-memssa 
    -speculative-execution -basicaa -aa -lazy-value-info -jump-threading -correlated-propagation 
    -simplifycfg -domtree -basicaa -aa -loops -lazy-branch-prob -lazy-block-freq 
    -opt-remark-emitter -instcombine -libcalls-shrinkwrap -loops -branch-prob -block-freq 
    -lazy-branch-prob -lazy-block-freq -opt-remark-emitter -pgo-memop-opt -basicaa -aa 
    -loops -lazy-branch-prob -lazy-block-freq -opt-remark-emitter -tailcallelim -simplifycfg 
    -reassociate -domtree -loops -loop-simplify -lcssa-verification -lcssa -basicaa -aa 
    -scalar-evolution -loop-rotate -licm -loop-unswitch -simplifycfg -domtree -basicaa -aa -loops
    -lazy-branch-prob -lazy-block-freq -opt-remark-emitter -instcombine -loop-simplify -lcssa-verification -lcssa -scalar-evolution -indvars
    -loop-idiom -loop-deletion -loop-unroll -phi-values -memdep -memcpyopt -sccp -demanded-bits -bdce -basicaa -aa -lazy-branch-prob
    -lazy-block-freq -opt-remark-emitter -instcombine -lazy-value-info -jump-threading -correlated-propagation -basicaa -aa -phi-values
    -memdep -dse -loops -loop-simplify -lcssa-verification -lcssa -basicaa -aa -scalar-evolution -licm -postdomtree -adce -simplifycfg 
    -domtree -basicaa -aa -loops -lazy-branch-prob -lazy-block-freq -opt-remark-emitter -instcombine -barrier -basiccg -rpo-functionattrs 
    -globalopt -globaldce -basiccg -globals-aa -float2int -domtree -loops -loop-simplify -lcssa-verification -lcssa -basicaa -aa -scalar-evolution
    -loop-rotate -loop-accesses -lazy-branch-prob -lazy-block-freq -opt-remark-emitter -loop-distribute -branch-prob -block-freq -scalar-evolution 
    -basicaa -aa -loop-accesses -demanded-bits -lazy-branch-prob -lazy-block-freq -opt-remark-emitter -loop-vectorize -loop-simplify -scalar-evolution 
    -aa -loop-accesses -loop-load-elim -basicaa -aa -lazy-branch-prob -lazy-block-freq -opt-remark-emitter -instcombine -simplifycfg -domtree
    -basicaa -aa -loops -lazy-branch-prob -lazy-block-freq -opt-remark-emitter -instcombine -loop-simplify -lcssa-verification -lcssa 
    -scalar-evolution -loop-unroll -lazy-branch-prob -lazy-block-freq -opt-remark-emitter -instcombine -loop-simplify -lcssa-verification 
    -lcssa -scalar-evolution -licm -alignment-from-assumptions -strip-dead-prototypes -domtree -loops -branch-prob -block-freq -loop-simplify
    -lcssa-verification -lcssa -basicaa -aa -scalar-evolution -branch-prob -block-freq -loop-sink -lazy-branch-prob -lazy-block-freq
    -opt-remark-emitter -instsimplify -div-rem-pairs -simplifycfg -domtree -sroa -verify -print-module

我认为我需要的是

  • 使定义接近使用(对在IR阶段如何做到这一点有何评论?)或
  • 找到一种方法来安全地禁用opt管道中的传递(licm,重新关联)。我相信这不可能从命令行进行。如果我必须在本地修改LLVM源代码(以便破解opt管道来完成我需要的操作),那么安全地进行此操作的正确位置是什么?任何指针都会有所帮助;或
  • 要手动输入我需要在opt命令中运行且没有任何O1 / O2 / O3标志的通行证 但是我无法找到一种方法来完成所有这些工作。我正在使用 LLVM版本7.00

可能的解决方案吗?

我可以在通行定义中仅将所需的通行证(O1管道的子集)添加为getAnalysisUsage()中的AddRequired,并使opt在启用O0标志的情况下运行我的通行证吗?这样行吗?我可以尝试一下。

1 个答案:

答案 0 :(得分:0)

根据2018年夏季的this线程,没有通用的方法可以禁用来自clang的特定通行证:

  

某些通行证支持将其禁用的选项,例如   -fno-vectorize和-fno-unroll-loops,但是没有常规选项。   由于禁用任意选项通常没有用,因此有些   需要手工。

该线程中的原始发布者似乎正在开发补丁来启用此行为,但据我所知它从未降落。