Живые значения в LLVM - PullRequest
       28

Живые значения в LLVM

4 голосов
/ 14 июня 2011

Предположим, у меня есть в моем CFG (среди прочего) два основных блока A и B, с ребром от A до B. Мне нужно сделать следующее:

  • получить набор S из живогозначения через этот край (это может быть избыточное приближение, т. е. оно может содержать значения, которые больше не являются живыми)
  • сопоставить каждое из них с другим значением (S-> S ')
  • replace -в B и его преемниках - все случаи использования значений в S с сопоставленными значениями (S ')

Предоставляет ли LLVM простой способ сделать первые и третьи пункты (потому что я не могу показатьсячтобы можно было его найти)?Если нет, есть ли у вас какие-либо предложения о том, как это сделать?

note: перекрестно помещен в список рассылки LLVM

1 Ответ

2 голосов
/ 30 августа 2011

У меня нет четкого ответа на ваш вопрос, но директор, которому я следую, пришёл мне в голову. Я надеюсь, что это поможет вам.

Во-первых, я бы проверил "Итерации по инструкциям в базовом блоке" и "Итерирование по цепочкам def-use и use-def" из Руководства по программированию LLVM . Это дает представление, как перебирать инструкции в базовом блоке и пользователей этого значения.

Поскольку вам нужно знать действительные значения по краям, я бы проверил «Итерации по базовым блокам в функции» и попытался бы определить, где размещены пользователи (через каждую итерацию), для пример с const BasicBlock * llvm :: Instruction :: getParent () const .

Если информации, где размещаются пользователи, недостаточно, вы можете воспользоваться [анализом доминантов и постдоминаторов], ознакомьтесь:

Это может помочь вам определить отношения доминирования между блоками или инструкциями, что может помочь вам в создании ваших сетов.

...