In der folgenden Abbildung sehen Sie auf der linken Seite den C-Code, während der Teil auf der rechten Seite die nicht optimierte LLVM IR-Form zeigt.Lesen nach Lesen Abhängigkeit in LLVM Speicherabhängigkeitsanalyse
Lauf MemoryDependenceAnalysis auf dem IR findet die Speicher Abhängigkeiten. Eine Abhängigkeit wird sowohl in dem ursprünglichen Code als auch in dessen IR-Äquivalent unter Verwendung der Pfeillinie gezeigt.
Hier ist der Ausgang der Analyse ist es, die die erwähnte Abhängigkeit beinhaltet:
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
Im Ergebnis der Analyse haben wir:
Def from: %0 = load i32, i32* %a, align 4
%1 = load i32, i32* %a, align 4
Die Variable a
wird in beiden Aussagen lesen, ist eine RAR-Abhängigkeit. Wie im Code-Snippet (LLVM-3.9.0 unter lib/Analysis/MemoryDependenceAnalysis.cpp: 549-551) gezeigt, betrachtet LLVM diese Lasten als voneinander abhängig. Was bedeutet das?
// Must aliased loads are defs of each other.
if (R == MustAlias)
return MemDepResult::getDef(Inst);
Beachten Sie auch, dass die Analyse auf der IR, nicht auf der C-Quelle durchgeführt wird.