Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Optimization 定制LLVM opt管道的替代方法有哪些? 问题:_Optimization_Llvm - Fatal编程技术网

Optimization 定制LLVM opt管道的替代方法有哪些? 问题:

Optimization 定制LLVM opt管道的替代方法有哪些? 问题:,optimization,llvm,Optimization,Llvm,从命令行无法安全地禁用O1/O2/O3 opt管道中的特定过程。定制或定制LLVM通道的opt管道的替代方法有哪些 背景和问题 我正在写一篇文章来概述代码的特定区域,我需要减少概述函数的输入和输出数量。 在某些情况下,opt工具会引发一些(不变的)GEP指令(例如,来自循环体)。O1/O2/O3标志会发生这种情况。我不希望这样,因为它会为我概述的函数创建更多的输入/输出。我更喜欢在概述的函数中完成GEP 失败的尝试 opt O1 pass参数如下所示。我在opt中使用了“print after

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

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

失败的尝试
  • opt O1 pass参数如下所示。我在opt中使用了“print after”命令,并查看了IR,发现“重新关联”转换创建了这种更改。我查看了opt--help-hidden中的禁用选项,但没有找到禁用此特定过程或LICM的方法
  • 我试图查看LLVM源代码Reassociate.cpp。我也无法从代码中找到任何禁用此特定转换的方法
  • 我还尝试手动为opt命令输入特定的密码。但是,有些通行证需要设置O1/2/3标志。如果我没有设置标志,这些过程不会进行必要的转换。例如,我需要展开循环,但在没有O1/2/3标志的情况下它不会展开,即使我在opt命令中显式输入了该标志
在O1阶段传递参数 我想我需要的是

  • 将定义移到接近其用途的位置(对我在IR阶段如何做到这一点有何评论?)
  • 找到一种在opt管道(licm、重新关联)中安全禁用过程的方法。我相信这在命令行中是不可能的。如果我必须在本地修改LLVM源代码(为了攻击opt管道以完成我需要的任务),那么在什么地方安全地进行修改?任何指针都会有帮助;或
  • 要手动输入通行证,我需要在opt命令中运行,不带任何O1/O2/O3标志 但我找不到一种方法来做这些工作。我正在使用LLVM 7.00版
可能的解决方案? 我是否可以仅将所需的过程(O1管道的子集)作为AddRequired添加到我的过程定义中的getAnalysisUsage()中,并使opt在启用O0标志的情况下运行我的过程?这样行吗?我可以试试。

根据2018年夏季发布的thread,没有通用的方法来禁用clang的特定通行证:

某些过程支持禁用它们的选项,例如。 -fno矢量化和-fno展开循环,但没有常规选项。 由于禁用任意选项通常没有用处,因此有些 需要手工


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

是否有其他方法来自定义opt管道?是否可以定制PassManager(如果是的话,有没有关于我如何做到这一点的提示?)或者只在opt中启用某些不带O1/O2/O3标志的过程?任何关于如何破解流程以完成所需任务的建议都会很有帮助。
 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