加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

llvm alloca依赖项

发布时间:2020-12-16 07:03:11 所属栏目:百科 来源:网络整理
导读:我试图通过我的传递确定某些加载指令相应的Alloca指令(可以在其他先前的块中).链可以是这样的:TargetLoad(var) – 其他使用var(或var依赖)的商店/负载 – ALLOCA(VAR).,链接几个基本块.你知道我怎么办吗? 我尝试使用DependenceAnalysis和MemoryDe??pendenc
我试图通过我的传递确定某些加载指令相应的Alloca指令(可以在其他先前的块中).链可以是这样的:TargetLoad(var) – >其他使用var(或var依赖)的商店/负载 – > ALLOCA(VAR).,链接几个基本块.你知道我怎么办吗?

我尝试使用DependenceAnalysis和MemoryDe??pendenceAnalysis中的方法,但结果不正确.例如,MemoryDe??pendenceAnalysis :: getDependency应该适用于选项“Def”,但仅适用于商店,而不适用于加载.在尝试使用MemoryDe??pendenceAnalysis :: getNonLocalPointerDependency或MemoryDe??pendenceAnalysis :: getPointerDependencyFrom时,我也有一个段错误.当我尝试使用MemDepResult :: getDef()检查我的结果时,Load指令的结果是相同的指令!所以它取决于它自己,这很奇怪,因为它使用的是先前在代码中定义的变量.

在target_load_instructions和所有已分配变量使用的所有变量之间建立交集以识别公共部分的替代方法不是一种选择.因为可能有类似的东西:alloca(a)… c = a * b 4 …. load(c).

似乎DependenceAnalysis :: depends()也不适合我的传球.下一行代码仅供参考:if(DA.depends(allocaInstrArray [i],loadInstrArray [j],true))始终为false.在某些情况下应该是这样.我想我没有正确使用它.

但是,我假设可能depends()不适用于Alloca.所以我检查了数组中保存的所有Load指令之间的依赖关系.某些结果不是基于加载的变量.例如:LOAD%3 =加载i32 *%c,对齐4 IS DEPENDENT ON%1 =加载i32 *%j,对齐4.如您所见,一个加载c,一个加载j.在我的Test.cpp目标代码中,j和c之间没有依赖关系.也许依赖性不是基于使用的变量/内存位置?

谢谢你的任何建议!

解决方法

首先,使用ICMP指令的getOperand(0)或getOperand(1).如果有isa< LoadInst>有效,然后将它们转换为LoadInst. getPointerOperand()将获得Value *,它是搜索的实际变量. 其次,在加载指令和Alloca指令之间执行相同的过程.在Load上应用的getOperand(0)给出相应的Alloca指令. 最后,通过检查依赖关系将两个结果链接在一起.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读