0
下の図の左側にCコードが表示され、右側の部分には最適化されていないLLVM IR形式が表示されています。 IRにMemoryDependenceAnalysisを実行読み取り後の依存関係LLVMメモリ依存解析
は、メモリの依存関係を検索します。 1つの依存関係が、元のコードとその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、lib/Analysis/MemoryDependenceAnalysis.cpp:549-551)に示されているように、LLVMはこれらのロードを相互のデフとみなします。どういう意味ですか?
// Must aliased loads are defs of each other.
if (R == MustAlias)
return MemDepResult::getDef(Inst);
また、分析はCソースではなくIRで実行されることに注意してください。