LLVM tiene phi instrucción con la explicación bastante raro:¿Qué es exactamente la instrucción PHI hace y cómo usarlo en LLVM
El 'phi' instrucción se utiliza para implementar el nodo φ en el gráfico de la SSA que representa la función .
Normalmente se utiliza para implementar la bifurcación. Si entendí correctamente, es necesario hacer posible el análisis de dependencia y, en algunos casos, podría ayudar a evitar una carga innecesaria. Sin embargo, todavía es difícil entender lo que hace exactamente.
Calidoscopio example lo explica bastante bien para el caso if
. Sin embargo, no está claro cómo implementar operaciones lógicas como &&
y ||
. Si escribo lo siguiente para online llvm compilador:
void main1(bool r, bool y) {
bool l = y || r;
}
últimas líneas me confunden por completo:
; <label>:10 ; preds = %7, %0
%11 = phi i1 [ true, %0 ], [ %9, %7 ]
%12 = zext i1 %11 to i8
Parece que el nodo phi produce un resultado que se puede utilizar. Y tuve la impresión de que el nodo phi solo define de qué rutas provienen los valores.
¿Podría alguien explicar qué es un nodo Phi, y cómo implementar ||
con él?
TL; DR φ node es una expresión ternaria. Se podría argumentar que no contiene la condición, pero realmente, al convertir al código final, no se puede determinar de otro modo cuál de los argumentos es en vivo, por lo que φ también debe tener la condición. –