llvm依赖项alloca-load

时间:2013-01-24 14:23:24

标签: llvm

我遇到了一些寻找依赖关系的问题。我想从每个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的别名
  3. 对于A类,我需要的是直接前进。 对于类别B,我检查是否有一个指令,其中也使用了来自类别A别名的指令的变量。如果是,则可以。

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

    但是下面的内容完全没有结果(他们应该,我在目标测试代码中有依赖关系 - 意味着我的代码中多次使用了加载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
    3. 其中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)) - 没有结果
      2. 第三,我尝试了MemoryDe​​pendenceAnalysis类的方法 - 现有的传递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。我对Loads没有任何结果。我还检查了getDef()方法,负载依赖于自己。
        3. 我必须提到我评论了行00131,因为我有一个未解决的段错误而且参数不是问题。
        4. 您认为我应该关注什么,更好地考虑哪些方法以及消除什么?

          非常感谢你的时间!

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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