【发布时间】: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