0

我在查找依赖项时遇到了一些问题。我想从每个 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 :

  1. A 类:allocas 的别名
  2. B类:没有allocas的别名

对于 A 类,直接满足我的需要。对于 B 类,我从 A 类别名的指令中检查是否存在使用变量的指令。如果是,则可以。

对于某些方法,我不能使用 Alloca,因此我尝试查找 Loads 之间的依赖关系(我在数组 loadInstrArray 中有所有 Load 指令),然后检查某些 Load 是否使用与 Alloca 相同的变量。

但是以下内容根本没有给我任何结果(它们应该,我的目标测试代码中有依赖项 - 这意味着 Load j 在我的代码中多次使用,因此指针应该是必须别名):

  1. if( AA.isMustAlias(Loci,Locj) )- 没结果
  2. 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 类中的方法。

  1. if (DA.depends(loadInstrArray[i],loadInstrArray[j],false))- 没结果

第三,我尝试了 MemoryDe​​pendenceAnalysis 类中的方法——现有的 pass http://llvm.org/docs/doxygen/html/MemDepPrinter_8cpp_source.html

  1. 我有错误的结果,例如:%1 = load i32* %j, align 4 IS Clobber FROM: store i32 0, i32* %c, align 4
  2. 然后我尝试只获取 DEF(而不是 clobber),因为我只需要查看每个 Load 对应的 Alloca。我没有任何负载结果。我还检查了getDef()方法,负载依赖于自己。
  3. 我不得不提到我评论了 line 00131,因为我有一个未解决的段错误,而不是参数是问题。

你认为我应该关注什么,考虑什么方法更好,消除什么?

非常感谢您的宝贵时间!

4

2 回答 2

1

此外,您应该检查 ICMP 操作数是否一直在引用 Load 指令。如果不是,则从两个 ICMP 操作数(0 和 1)中寻找递归加载指令。Loads 和 ICMP 之间可能还有其他中间操作。

于 2013-01-29T18:44:30.247 回答
0

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

于 2013-01-29T09:51:36.247 回答