【问题标题】:What are the alternative ways to customize LLVM opt pipeline?自定义 LLVM opt 管道的替代方法是什么?
【发布时间】:2019-05-06 17:49:45
【问题描述】:

问题

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

背景与问题

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

尝试失败

  • opt O1 传递参数如下所示。我在 opt 中使用了“print-after”命令并查看了 IR,发现“重新关联”转换会产生这种变化。我查看了 opt --help-hidden 中的禁用选项,但没有找到禁用此特定通道或 LCM 的方法。
  • 我尝试查看 LLVM 源代码 Reassociate.cpp。我也找不到任何方法来禁用代码中的这种特定转换。
  • 我还尝试在 opt 命令中手动输入特定的通行证名称。然而,有些传球需要设置 O1/2/3 标志。如果我不设置标志,这些通道不会进行必要的转换。例如,我需要展开循环,但如果没有 O1/2/3 标志,即使我在 opt 命令中明确输入标志,它也不会展开。

在 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 阶段执行此操作的任何 cmets?)或
  • 找到一种方法来安全地禁用 opt 管道中的传递(licm,重新关联)。我相信这从命令行是不可能的。如果我必须在本地修改 LLVM 源代码(为了破解 opt 管道来完成我需要的事情),那么安全地执行此操作的正确位置是什么?任何指示都会有所帮助;或
  • 要手动输入我需要在没有任何 O1/O2/O3 标志的 opt 命令中运行的通行证 但我无法找到一种方法来做任何这些工作。我正在使用 LLVM 7.00 版

可能的解决方案?

我能否在我的 pass 定义中的 getAnalysisUsage() 中仅添加所需的 pass(O1 管道的子集)作为 AddRequired,并在启用 O0 标志的情况下让 opt 运行我的 pass?这行得通吗?我可以试试这个。

【问题讨论】:

    标签: optimization llvm


    【解决方案1】:

    根据 2018 年夏季的 this 线程,没有通用的方法来禁用 clang 的特定通道:

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

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

    【讨论】:

    • 是否有其他方法可以自定义 opt 管道?是否可以定制 PassManager (如果是,任何关于我如何做到这一点的指针?)或者只启用某些没有 O1/O2/O3 标志的 opt 通行证?关于如何破解流程以完成我需要的任何建议都会有所帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-12
    • 2022-06-10
    • 1970-01-01
    • 2022-11-13
    • 2015-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多