【问题标题】:llvm dependencies alloca-loadllvm 依赖分配负载
【发布时间】:2013-01-08 08:09:29
【问题描述】:

我在查找依赖项时遇到了一些问题。我想从每个 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 是 AliasAnalysis::Location from a Load,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. 我不得不提到我评论了00131 行,因为我有一个未解决的段错误,而不是参数问题。

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

非常感谢您的宝贵时间!

【问题讨论】:

    标签: llvm


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2013-01-04
        • 1970-01-01
        • 2019-02-02
        • 2016-01-04
        • 1970-01-01
        • 1970-01-01
        • 2020-11-15
        • 2020-04-27
        • 1970-01-01
        相关资源
        最近更新 更多