На рисунке ниже слева вы можете увидеть код C, а часть справа показывает неоптимизированную форму LLVM IR.Чтение после проверки зависимости в LLVM Анализ зависимости памяти
Запуск MemoryDependenceAnalysis на ИК находит зависимости памяти. Одна зависимость показана как в исходном коде, так и в его ИК-эквиваленте, используя линию стрелок.
Вот результат анализа, который включает в себя указанную зависимость:
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 рассматривает эти нагрузки как defs друг от друга. Что это значит?
// Must aliased loads are defs of each other.
if (R == MustAlias)
return MemDepResult::getDef(Inst);
Также обратите внимание, что анализ выполняется на ИК-дисплее, а не на источнике C.