В LLVM есть инструкция phi с довольно странным объяснением:
The 'phi' instruction is used to implement the φ node in the SSA graph representing the function.
Обычно он используется для реализации ветвления. Если я правильно понял, это нужно для того, чтобы был возможен анализ зависимостей и в некоторых случаях это могло бы помочь избежать лишней загрузки. Однако все еще трудно понять, что именно он делает.
Калейдоскоп пример довольно хорошо объясняет это для случая if
. Однако не совсем понятно, как реализовать такие логические операции, как &&
и ||
. Если я наберу следующее в онлайн-компилятор llvm :
void main1(bool r, bool y) {
bool l = y || r;
}
Последние несколько строк меня совершенно сбивают с толку:
;
Похоже, что фи-узел выдает результат, который можно использовать. И у меня сложилось впечатление, что фи-узел просто определяет, по каким путям приходят значения.
Может ли кто-нибудь объяснить, что такое Phi-узел и как с ним реализовать ||
?