在LLVM内存依赖性分析中读取依赖性后读取

时间:2017-01-11 16:09:44

标签: c dependencies llvm compiler-optimization

在下图中,您可以在左侧看到C代码,而右侧的部分则显示未优化的LLVM IR形式。

The Figure

在IR上运行MemoryDe​​pendenceAnalysis会发现内存依赖性。使用箭头线在原始代码和IR等效中显示一个依赖关系。

以下是分析的输出,其中包括所提到的依赖性:

Printing analysis 'Print MemDeps of function' for function 'main':
    Def from:   %retval = alloca i32, align 4
  store i32 0, i32* %retval, align 4

    Def from:   %d = alloca i32, align 4
  store i32 0, i32* %d, align 4

    Def from:   %a = alloca i32, align 4
  store i32 0, i32* %a, align 4

    Def from:   store i32 0, i32* %a, align 4
  %0 = load i32, i32* %a, align 4

    Def from:   %b = alloca i32, align 4
  store i32 %0, i32* %b, align 4

    Def from:   %0 = load i32, i32* %a, align 4
  %1 = load i32, i32* %a, align 4

    Def from:   store i32 0, i32* %d, align 4
  %2 = load i32, i32* %d, align 4

    Def from:   %c = alloca i32, align 4
  store i32 %add, i32* %c, align 4

    Def from:   %2 = load i32, i32* %d, align 4
  store i32 2, i32* %d, align 4

在分析的输出中,我们有:

Def from:   %0 = load i32, i32* %a, align 4
  %1 = load i32, i32* %a, align 4

在两个语句中读取变量a,这是一个RAR依赖项。如代码片段(LLVM-3.9.0 at lib / Analysis / MemoryDe​​pendenceAnalysis.cpp:549-551)所示,LLVM将这些负载视为彼此的def。这是什么意思?

    // Must aliased loads are defs of each other.
    if (R == MustAlias)
      return MemDepResult::getDef(Inst);

另请注意,分析是在IR上进行的,而不是在C源上进行的。

1 个答案:

答案 0 :(得分:0)

我从未使用LLVM,但根据您提供的C代码和LLVM IR,a变量被读取2次。我没有看到任何错误。我可能错了吗?

enter image description here