У LLVM есть инструкция фи с довольно странным объяснением:
Инструкция '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-узел и как его реализовать ||
с этим?