Может ли анализ зависимостей LLVM вывести зависимость между двумя инструкциями, кроме store & load? - PullRequest
0 голосов
/ 29 октября 2019

Я использую 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 говорится, что он показывает только зависимость между инструкциями сохранения и загрузки. У меня вопрос, есть ли какой-нибудь проход, показывающий и другие зависимости?

1 Ответ

1 голос
/ 03 ноября 2019

Исходный код показывает требуемую информацию.

Операнды каждой инструкции - это именно те инструкции (или другие значения), от которых они зависят. Это общий принцип LLVM. Проход, который вы видели, существует, потому что загрузки и хранилища являются исключением. Тем не менее, загрузки и хранилища являются исключением only .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...