我在查找依赖项时遇到了一些问题。我想从每个 Load 中获取相应的 Alloca(从所使用的变量的角度对应,这意味着 Load 正在使用基于/依赖于 Alloca 或 Allocas 的变量)。
因此,我有一个像这样的链:Alloca -> Load(1) -> ... -> Computation where the variable might be changed -> Store(new_var) -> ... -> Load(n)
“变量更改的计算”意味着:我可能有Alloca(a), c=a+7000*b[32], Load(c)
.
首先,我尝试使用 AliasAnalysis 类中的方法。计划如下:在获得所有必须别名后,我将它们分类为 2 :
- A 类:allocas 的别名
- B类:没有allocas的别名
对于 A 类,直接满足我的需要。对于 B 类,我从 A 类别名的指令中检查是否存在使用变量的指令。如果是,则可以。
对于某些方法,我不能使用 Alloca,因此我尝试查找 Loads 之间的依赖关系(我在数组 loadInstrArray 中有所有 Load 指令),然后检查某些 Load 是否使用与 Alloca 相同的变量。
但是以下内容根本没有给我任何结果(它们应该,我的目标测试代码中有依赖项 - 这意味着 Load j 在我的代码中多次使用,因此指针应该是必须别名):
if( AA.isMustAlias(Loci,Locj) )
- 没结果if( AA.alias(Loci,Locj) )
- 错误的结果,例如“LOAD %2 = load i32* %j, align 4 IS DEPENDENT ON %3 = load i32* %c, align 4
”
其中 j 完全独立于 c
3". if( AA.getModRefInfo(allocaInstrArray[j],Loci) )
- 没有结果
其中 Loci 是 Load 中的 AliasAnalysis::Location,allocaInstrArray 是一个包含所有 allocas 的数组
其次,我尝试使用 DependencyAnalysis 类中的方法。
if (DA.depends(loadInstrArray[i],loadInstrArray[j],false))
- 没结果
第三,我尝试了 MemoryDependenceAnalysis 类中的方法——现有的 pass http://llvm.org/docs/doxygen/html/MemDepPrinter_8cpp_source.html。
- 我有错误的结果,例如:
%1 = load i32* %j, align 4 IS Clobber FROM: store i32 0, i32* %c, align 4
- 然后我尝试只获取 DEF(而不是 clobber),因为我只需要查看每个 Load 对应的 Alloca。我没有任何负载结果。我还检查了
getDef()
方法,负载依赖于自己。 - 我不得不提到我评论了 line
00131
,因为我有一个未解决的段错误,而不是参数是问题。
你认为我应该关注什么,考虑什么方法更好,消除什么?
非常感谢您的宝贵时间!