在下图中,您可以在左侧看到C代码,而右侧的部分则显示未优化的LLVM IR形式。
在IR上运行MemoryDependenceAnalysis会发现内存依赖性。使用箭头线在原始代码和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 / MemoryDependenceAnalysis.cpp:549-551)所示,LLVM将这些负载视为彼此的def。这是什么意思?
// Must aliased loads are defs of each other.
if (R == MustAlias)
return MemDepResult::getDef(Inst);
另请注意,分析是在IR上进行的,而不是在C源上进行的。