LLVM ma instrukcję phi z dość dziwnym wyjaśnieniem:
Instrukcja „phi” służy do implementacji węzła φ na grafie SSA reprezentującym funkcję.
Zwykle jest używany do implementacji rozgałęziania. Jeśli dobrze zrozumiałem, jest to potrzebne, aby umożliwić analizę zależności, aw niektórych przypadkach może pomóc uniknąć niepotrzebnego ładowania. Jednak nadal trudno jest zrozumieć, co dokładnie robi.
Przykład Kalejdoskopu wyjaśnia to całkiem dobrze na potrzeby if
przypadku. Jednak nie jest tak jasne, jak zaimplementować operacje logiczne, takie jak &&
i ||
. Jeśli wpiszę następujące polecenie do kompilatora online llvm :
void main1(bool r, bool y) {
bool l = y || r;
}
Ostatnie kilka wierszy całkowicie mnie zmyliło:
; <label>:10 ; preds = %7, %0
%11 = phi i1 [ true, %0 ], [ %9, %7 ]
%12 = zext i1 %11 to i8
Wygląda na to, że węzeł phi daje wynik, który można wykorzystać. Miałem wrażenie, że węzeł phi po prostu określa, z których ścieżek przychodzą wartości.
Czy ktoś mógłby wyjaśnić, czym jest węzeł Phi i jak go zaimplementować ||
?
phi
Węzeł jest rozwiązanie tego problemu w celu przekształcenia kompilatorów IR w „statyczne pojedyncze przypisanie” formie. Aby lepiej zrozumieć rozwiązanie, sugerowałbym lepsze zrozumienie problemu. Więc powiem ci " Dlaczegophi
węzeł ".