Я использую llvm DependenceAnalysisWrapperPass для получения зависимости между двумя ИК-инструкциями. Но кажется, что этот анализ только выводит зависимость между инструкциями загрузки / сохранения, но не говорит о зависимости между нагрузкой и арифметическими инструкциями. Есть ли какой-нибудь проход в LLVM, который может вывести более полную зависимость среди инструкций?
Например:
%retval = alloca i32, align 4
%a = alloca i32, align 4
%b = alloca i32, align 4
%r = alloca i32, align 4
store i32 0, i32* %retval, align 4
store i32 1, i32* %a, align 4
store i32 2, i32* %b, align 4
%0 = load i32, i32* %a, align 4
%1 = load i32, i32* %b, align 4
%add = add nsw i32 %0, %1
store i32 %add, i32* %r, align 4
%2 = load i32, i32* %r, align 4
ret i32 %2
Используя DependenceAnalysisWrapperPass, он выводит следующий граф зависимостей
График зависимостей
Показывает, что две инструкции загрузки зависят от двух инструкций хранения соответственно. Однако он не показывает зависимость между, скажем, двумя инструкциями загрузки и следующей инструкцией добавления. Это ожидаемо, поскольку в коде DependenceAnalysisWrapperPass говорится, что он показывает только зависимость между инструкциями сохранения и загрузки. У меня вопрос, есть ли какой-нибудь проход, показывающий и другие зависимости?