В LLVM есть инструкция phi с довольно странным объяснением:
Команда phi используется для реализации узла φ в графе SSA, представляющем функцию.
Обычно он используется для реализации ветвления. Если я правильно понял, это необходимо для того, чтобы сделать возможным анализ зависимостей, а в некоторых случаях это может помочь избежать ненужной загрузки. Однако все еще сложно понять, что именно он делает.
Пример с калейдоскопом довольно хорошо объясняет это для if
случая. Однако не совсем понятно, как реализовать логические операции вроде &&
и ||
. Если я введу в онлайн- компилятор llvm следующее :
void main1(bool r, bool y) {
bool l = y || r;
}
Последние несколько строк меня полностью сбивают с толку:
; <label>:10 ; preds = %7, %0
%11 = phi i1 [ true, %0 ], [ %9, %7 ]
%12 = zext i1 %11 to i8
Похоже, что phi-узел дает результат, который можно использовать. И у меня создалось впечатление, что узел phi просто определяет, из каких путей приходят значения.
Может ли кто-нибудь объяснить, что такое узел Phi и как его реализовать ||
?
phi
Узел представляет собой решение задачи в компиляторах для преобразования ИК в «Статический сингл назначения» форме. Чтобы лучше понять решение, я предлагаю лучше понять проблему. Итак, я расскажу вам " Почемуphi
узел ".