首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >定制LLVM管道的替代方法是什么?

定制LLVM管道的替代方法是什么?
EN

Stack Overflow用户
提问于 2019-05-06 17:49:45
回答 1查看 781关注 0票数 2

问题

无法从命令行安全地禁用O1/O2/O3-OPT管道中的特定传递。定制或裁剪LLVM传递的opt管道的替代方法是什么?

背景与问题

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

失败尝试

  • opt O1 pass参数如下所示。我在opt中使用了"print-after“命令,并查看了IR,发现”重新组合“转换创建了这一更改。我检查了选项-帮助隐藏的禁用选项,我没有找到一种方法禁用这个特定的传球或LICM。
  • 我试着查看LLVM源代码Reassociate.cpp。我也无法确定从代码中禁用此特定转换的任何方法。
  • 我还尝试手动向opt命令输入特定的pass名称。但是,有些传球需要设置O1/2/3标志。如果我不设置标志,这些传递将不会进行必要的转换。例如,我需要展开循环,但它不会在没有O1/2/3标志的情况下展开,即使我在opt命令中显式地输入了标志。

在O1阶段传递参数

代码语言:javascript
复制
 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管道中安全禁用pass的方法(licm,推理)。我认为这在命令行中是不可能的。如果我必须在本地修改LLVM源代码(为了破解opt管道以完成我所需要的),那么什么地方才是安全地这样做呢?任何指针都会有帮助;或
  • 要手动输入通行证,我需要在opt命令中运行,没有任何O1/O2/O3标志,但我无法找到一种方法来执行这些操作。我正在使用LLVM发布的7.00

可能的解决方案?

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

EN

回答 1

Stack Overflow用户

发布于 2019-05-06 18:38:01

根据2018年夏天的线程,没有一种通用的方法可以禁用clang的特定传递:

有些passes支持禁用它们的选项,例如-fno-矢量化和-fno-展开循环,但是没有通用选项。由于禁用任意选项在一般情况下并不有用,因此需要进行一些手工操作。

线程中的原始海报似乎正在开发一个补丁来支持这种行为,但据我所知,它从未登陆过。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56010075

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档